2009-01-11 18 views
25

Ich schreibe einige UI-Tests mit Selenium und ich habe ein JavaScript-Tree-Steuerelement, mit dem Dojo-Toolkit.JavaScript simulieren Rechtsklick durch Code

Ich habe ein Kontextmenü für jeden Knoten des Baumes mit den Beispielen, die Dojo bereitstellen, implementiert, aber ich brauche den Selenium-Test, um den Rechtsklick auf den Baumknoten aufzurufen, aber ich kann das nicht zum Laufen bringen. Die Tests simulieren das Rechtklickereignis einfach nicht über JavaScript und das Kontextmenü wird nicht angezeigt.

Hat jemand Erfahrung im Aufrufen der rechten Maustaste auf ein Kontextmenü mit Dojo und Selen? Oder haben Sie Ideen, wie es geht?

Antwort

21

versuchen, dies stattdessen Grund was die Dinge nicht ganz funktioniert hat, ist, dass Sie das Kontextmenü in der Tat an die oncontextmenu Ereignis gebunden ist.

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

Booo-Yaaa, die den Trick gemacht haben, danke Ieiyou. – Mark

4

Große Frage!

habe ich einige der Forschung, und es scheint, wie Sie ein Mausereignis wie is shown here abfeuern kann, und machen es zu einem Rechtsklick durch die button oder which Eigenschaft auf 2 (documented here) einstellen.

Vielleicht wird dieser Code funktionieren:

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

Hier ist eine korrektere Version, wenn Sie nicht interessieren, wo das Kontextmenü

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

up gefeuert wird Wenn Sie das tun, können wir die vorherige, reparieren ist es Verhalten verwenden müssen in IE und bevölkern die screenX, screenY, clientX, clientY usw. passend

+0

Danke, ich kümmere mich nicht wirklich, wo es passiert, aber es könnte schön sein, in Zukunft zu tun ... – Mark

+0

Wenn Sie jQuery verwenden, ist ein Rechtsklick auf ein Element noch einfacher: $ (your_element) .trigger ('Kontextmenü'); – sunaku

7

nur für eine gute Maßnahme, hier ein bisschen doco auf die Parameter ist:

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

+1 hilfreich in diesem Zusammenhang – Thariama

2

Ich versuche dies in Firefox und Chrome, aber das Contextmenu Ereignis zu dispatchieren führt nicht zum Öffnen des Kontextmenüs Browser. Das Ereignis wird ausgelöst, weil mein Callback für oncontextmenu ausgelöst wird, das Kontextmenü jedoch immer noch fehlt. Hat jemand eine Idee, weil ich alle Codebeispiele von oben benutzt habe?

+0

FWIW Ich habe das gleiche Problem - vielleicht wurde dies in einigen neueren Versionen für die Sicherheit oder etwas deaktiviert? – Coderer

+0

OP hat seine eigenen Kontextmenüs implementiert, es ist nicht möglich, das Kontextmenu des Browsers mit Javascript zu starten. – automaton