JavaScript模拟右键单击代码
我正在使用Selenium编写一些UItesting,并使用Dojo工具包创buildJavaScript树控件。
我已经使用Dojo提供的示例为树的每个节点实现了一个上下文菜单,但是我需要Seleniumtesting来“调用”树节点上的右键单击,但是我无法使其工作。 testing不会通过JavaScript模拟右键单击事件,并且不显示上下文菜单。
有没有人有任何使用Dojo和Selenium右键单击上下文菜单的经验? 或者有什么想法如何做到这一点?
试试这个,理由是什么东西不是很有效的事情是上下文菜单实际上绑定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); } }
只是为了好的措施,这里有一点关于参数的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) );
好问题!
我做了一些研究,似乎可以像这里显示的那样触发鼠标事件,并通过设置button
或which
属性为2( 在此logging )使其成为右键单击。
也许这个代码将起作用:
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); } }
如果你不关心上下文菜单被激发的位置,这是一个更正确的版本
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等
我正在尝试在Firefox和铬,但调度contextmenu事件不会使浏览器打开上下文菜单。 触发事件是因为oncontextmenu的callback被触发,但上下文菜单仍然丢失。 任何人有一个想法,因为我使用了从上面的所有代码示例?