2009-01-11 48 views
25

我正在使用Selenium编写一些UI测试,并且使用Dojo工具包创建了JavaScript树控件。JavaScript模拟通过代码右键单击

我已经使用Dojo提供的示例为树的每个节点实现了一个上下文菜单,但是我需要Selenium测试来“调用”树节点上的右键单击,但是我无法使其工作。测试不会通过JavaScript模拟右键单击事件,并且不显示上下文菜单。

有没有人在使用Dojo和Selenium调用右键菜单上的任何经验?或者有什么想法如何做到这一点?

回答

21

尝试此相反,原因是什么事情也不太工作是,上下文菜单,其实是必然的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); 
    } 
} 
+0

Booo-Yaaa做到了这一点,谢谢Ieiyou。 – Mark 2009-01-12 01:06:04

4

伟大的问题!

我做了一些研究,而且好像你可以火象is shown here鼠标事件,并通过buttonwhich属性设置为2(documented here)它单击鼠标右键。

也许这代码将工作:

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

这里有一个更正确的版本,如果你不关心在上下文菜单被解雇了

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

如果你这样做,我们可能要使用以前的一个,修复了它的行为在IE浏览器,并填充screenX,screenY,clientX,clientY等适当

+0

谢谢,我实际上并不关心它发生的地方,但它可能会很好在将来这么做... – Mark 2009-01-12 01:22:15

+0

如果您使用的是jQuery,右键单击元素更简单: $(your_element).trigger( '上下文菜单'); – sunaku 2011-01-19 05:58:55

7

只是良好的措施,这里是参数有点DOCO的:

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在这方面的帮助 – Thariama 2012-03-29 14:24:41

2

我在firefox和chrome中尝试这个,但是调度contextmenu事件并不会让浏览器打开上下文菜单。触发事件是因为我的oncontextmenu回调被触发,但上下文菜单仍然丢失。任何人都有想法,因为我使用了上面的所有代码示例?