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?

25
demandé sur ROMANIA_engineer 2009-01-12 01:53:28

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);
    }
}
22
répondu leiyou 2009-01-12 00:54:22

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)
); 
8
répondu Mark 2009-01-12 01:26:09

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);
  }
}
4
répondu orip 2009-01-12 00:20:22

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

3
répondu leiyou 2009-01-12 01:16:27

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?

2
répondu bellpeace 2011-07-19 19:07:04