Domanda

Sto scrivendo alcuni test dell'interfaccia utente usando Selenium e ho un controllo Albero JavaScript, usando il toolkit Dojo.

Ho implementato un menu di scelta rapida per ciascun nodo dell'albero usando gli esempi forniti da Dojo, ma ho bisogno del test del selenio per "invocare" il clic destro sul nodo dell'albero, ma non riesco a farlo funzionare. I test semplicemente non simulano l'evento con il tasto destro del mouse tramite JavaScript e il menu di scelta rapida non viene visualizzato.

Qualcuno ha avuto esperienza nell'invocare il tasto destro del mouse su un menu contestuale usando Dojo e Selenium? O hai qualche idea su come farlo?

È stato utile?

Soluzione

prova invece, la ragione per cui le cose non hanno funzionato è che il menu di scelta rapida è in effetti associato all'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);
    }
}

Altri suggerimenti

Solo per una buona misura, ecco un po 'di doco sui parametri:

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)
); 

Ottima domanda!

Ho fatto qualche ricerca e sembra che tu possa lanciare un evento del mouse come viene mostrato qui e fai clic con il pulsante destro del mouse impostando il pulsante o quale su 2 ( documentato qui ).

Forse questo codice funzionerà:

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);
  }
}

Ecco una versione più corretta se non ti interessa dove viene attivato il menu di scelta rapida

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)
  }
}

In tal caso, potrebbe essere necessario utilizzare quello precedente, correggerne il comportamento in IE e popolare correttamente screenX, screenY, clientX, clientY ecc.

Sto provando questo in Firefox e Chrome, ma l'invio dell'evento contextmenu non fa aprire il menu contestuale al browser. L'evento viene attivato perché il mio callback per oncontextmenu viene attivato, ma il menu di scelta rapida è ancora mancante. Qualcuno ha un'idea, perché ho usato tutti gli esempi di codice dall'alto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top