clique direito JavaScript simular através de código
-
10-07-2019 - |
Pergunta
Eu estou escrevendo alguns testes de interface do usuário usando selênio e eu tenho um controle Tree JavaScript, usando o kit de ferramentas Dojo.
Eu tenho implementado um menu de contexto para cada nó da árvore usando os exemplos que Dojo fornecer, mas eu preciso o teste Selenium para "invocar" o clique direito no nó da árvore, mas eu não posso chegar a este trabalho. Os testes simplesmente não simular o evento clique com o botão direito através de JavaScript, e no menu de contexto não aparece.
Alguém já teve alguma experiência em invocar o clique direito em um menu de contexto usando Dojo e selênio? Ou tem alguma idéia de como fazê-lo?
Solução
experimentá-lo, razão pela qual as coisas não funcionou muito bem é que o menu de contexto é de fato ligado ao evento oncontextmenu.
function contextMenuClick(element){
var evt = element.ownerDocument.createEvent('MouseEvents');
var RIGHT_CLICK_BUTTON_CODE = 2; // the same for FF and IE
evt.initMouseEvent('contextmenu', true, true,
element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false,
false, false, false, RIGHT_CLICK_BUTTON_CODE, null);
if (document.createEventObject){
// dispatch for IE
return element.fireEvent('onclick', evt)
}
else{
// dispatch for firefox + others
return !element.dispatchEvent(evt);
}
}
Outras dicas
Apenas para uma boa medida, aqui é um pouco de doco sobre os parâmetros:
var myEvt = document.createEvent('MouseEvents');
myEvt.initMouseEvent(
'click' // event type
,true // can bubble?
,true // cancelable?
,window // the event's abstract view (should always be window)
,1 // mouse click count (or event "detail")
,100 // event's screen x coordinate
,200 // event's screen y coordinate
,100 // event's client x coordinate
,200 // event's client y coordinate
,false // whether or not CTRL was pressed during event
,false // whether or not ALT was pressed during event
,false // whether or not SHIFT was pressed during event
,false // whether or not the meta key was pressed during event
,1 // indicates which button (if any) caused the mouse event (1 = primary button)
,null // relatedTarget (only applicable for mouseover/mouseout events)
);
Ótima pergunta!
Eu fiz alguma pesquisa, e parece que você pode disparar um evento de mouse como é mostrado aqui , e torná-lo um clique com o botão direito, definindo o button
ou which
propriedade para 2 ( documentado aqui ).
Talvez este código irá funcionar:
function rightClick(element){
var evt = element.ownerDocument.createEvent('MouseEvents');
var RIGHT_CLICK_BUTTON_CODE = 2; // the same for FF and IE
evt.initMouseEvent('click', true, true,
element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false,
false, false, false, RIGHT_CLICK_BUTTON_CODE, null);
if (document.createEventObject){
// dispatch for IE
return element.fireEvent('onclick', evt)
}
else{
// dispatch for firefox + others
return !element.dispatchEvent(evt);
}
}
Aqui está uma versão mais correto se você não se preocupam com onde o menu de contexto é demitido up
function fireContextMenu(el) {
var evt = el.ownerDocument.createEvent("HTMLEvents")
evt.initEvent('contextmenu', true, true) // bubbles = true, cancelable = true
if (document.createEventObject) {
return el.fireEvent('oncontextmenu', evt)
}
else {
return !el.dispatchEvent(evt)
}
}
Se você fizer isso, nós podemos ter que usar o anterior, correção-se que seu comportamento no IE, e preencher o screenX, screenY, clientX, clientY etc adequadamente
Eu estou tentando isso no Firefox e Chrome, mas despachar o evento contextmenu não faz navegador para o menu de contexto aberto. Evento é acionado porque o meu retorno para oncontextmenu é disparado, mas menu de contexto ainda está faltando. Alguém tem uma idéia, porque eu usei todas as amostras de código de cima?