JavaScript simuler le clic droit à travers le code
j'écris quelques tests D'interface utilisateur en utilisant le sélénium et j'ai un contrôle D'arborescence JavaScript, en utilisant le Dojo toolkit.
j'ai implémenté un menu contextuel pour chaque noeud de l'arbre en utilisant les exemples que Dojo fournit, mais j'ai besoin du test de sélénium pour" invoquer " le clic droit sur le noeud de l'arbre, mais je ne peux pas faire que cela fonctionne. Les tests ne simulent tout simplement pas L'Événement du clic droit par JavaScript, et le menu contextuel ne s'affiche pas.
Has quelqu'un a-t-il déjà invoqué le clic droit sur un menu contextuel en utilisant le Dojo et le sélénium? Ou avez-vous des idées sur la façon de le faire?
5 réponses
essayez ceci à la place, la raison pour laquelle les choses n'ont pas tout à fait fonctionné 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);
}
}
juste pour une 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)
);
grande question!
j'ai fait quelques recherches, et il semble que vous pouvez tirer un événement de souris comme est montré ici , et le faire un clic droit en mettant la propriété button
ou which
à 2 ( documentée 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 pourrions devoir utiliser le précédent, corriger son comportement dans IE, et peupler le screenX, screenY, clientX, clientY etc de manière appropriée
j'essaie cela dans firefox et chrome, mais l'envoi de l'événement contextmenu ne fait pas navigateur pour ouvrir le menu contextuel. L'événement est déclenché parce que mon rappel pour oncontextmenu est déclenché, mais menu contextuel est toujours manquant. Quelqu'un a une idée, parce que j'ai utilisé tous les échantillons de code d'en haut?