JavaScript simule un clic droit sur le code
-
10-07-2019 - |
Question
J'écris des tests d'interface utilisateur à l'aide de Selenium et j'ai un contrôle JavaScript Tree, à l'aide de la boîte à outils Dojo.
J'ai mis en place un menu contextuel pour chaque noeud de l'arborescence en utilisant les exemples fournis par Dojo, mais j'ai besoin du test Selenium pour "invoquer". Cliquez avec le bouton droit de la souris sur le noeud de l’arbre, mais je ne parviens pas à le faire fonctionner. Les tests ne simulent tout simplement pas l'événement de clic droit via JavaScript et le menu contextuel ne s'affiche pas.
Quelqu'un a-t-il déjà invoqué le clic droit sur un menu contextuel utilisant Dojo et Selenium? Ou avez-vous des idées sur la façon de le faire?
La solution
essayez plutôt ceci, parce que les choses ne fonctionnent pas tout à fait, c'est que le menu contextuel est en fait lié à l'événement 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);
}
}
Autres conseils
Juste pour faire bonne mesure, voici un peu de doco sur les paramètres:
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)
);
Excellente question!
J'ai fait des recherches et il semble que vous puissiez déclencher un événement de souris comme est affiché ici et faites-en un clic droit en définissant le bouton
ou le propriété
sur 2 ( documenté ici ).
Peut-être que ce code fonctionnera:
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);
}
}
Voici une version plus correcte si vous ne vous souciez pas de l'endroit où le menu contextuel est activé
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)
}
}
Si vous le faites, nous devrons peut-être utiliser le précédent, corriger son comportement dans IE et renseigner correctement screenX, screenY, clientX, clientY, etc.
J'essaie ceci dans Firefox et Chrome, mais l'envoi de l'événement contextmenu ne permet pas au navigateur d'ouvrir le menu contextuel. L'événement est déclenché parce que mon rappel pour le menu oncontext est déclenché, mais que le menu contextuel est toujours manquant. Quelqu'un a une idée, car j'ai utilisé tous les exemples de code ci-dessus?