JavaScript 模拟右键单击代码

IT技术 javascript selenium dojo mouseevent
2021-02-03 18:42:52

我正在使用 Selenium 编写一些 UI 测试,并且我有一个使用 Dojo 工具包的 JavaScript 树控件。

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

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

5个回答

试试这个,原因是事情不太奏效是上下文菜单实际上绑定到 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)
); 

好问题!

我做了一些研究,似乎您可以触发一个鼠标事件,如此处所示,并通过将buttonorwhich属性设置为 2(此处记录右键单击它

也许这段代码会起作用:

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 等

如果您使用 jQuery,右键单击一个元素就更简单了: $(your_element).trigger('contextmenu');
2021-03-21 18:42:52
谢谢,我实际上并不关心它发生在哪里,但将来这样做可能会很好......
2021-04-08 18:42:52

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

FWIW 我有同样的问题——也许这在一些最近的版本中被禁用了安全性或其他什么?
2021-03-16 18:42:52
OP 实现了自己的上下文菜单,无法使用 javascript 触发浏览器的上下文菜单。
2021-04-10 18:42:52