JavaScript - 模拟点击上下文菜单

JavaScript - simulate click on contextmenu

我正在尝试为站点创建 Web 自动化。我正在模拟点击。通常我会向如下所示的元素添加一个 ID,然后使用 Chrome 开发人员控制台触发点击,它总是有效。

p.s:下面的问题是 outdated.I 我实际上是在尝试从 web.whatsapp.com

中的上下文菜单中单击一个项目
<div id="myapp">button1</div>

<script>
  $("#myapp").click();
</script>

或者,如果那行不通,我会像下面那样使用纯 JavaScript 的 mousedown 事件,它会顺利运行。

function triggerMouseEvent(node, eventType) {
  var clickEvent = document.createEvent('MouseEvents');
  clickEvent.initEvent(eventType, true, true);
  node.dispatchEvent(clickEvent);
}

var targetNode = document.querySelector("#myapp");
triggerMouseEvent(targetNode, "mousedown");

现在我的问题是:这不适用于通过 jQuery contextMenu 插件生成的菜单。

您可以看到 contextMenu here 的演示,我正在其中通过开发人员控制台测试上述内容。

因此,当您右键单击上下文菜单时,会列出一个菜单项列表 ulli tags.I 手动将 ID #myapp 添加到其中一个菜单和下面的代码,它也通过开发者控制台选择正确的元素。

var targetNode = document.querySelector("#myapp");
targetNode;

但是我无法触发对通过上下文菜单生成的菜单项的点击。我为此苦苦挣扎了超过 24 小时。我尝试了 JavaScript 中我能想到的所有事件,例如 mouseupmousedownmouseenter

您只能在创建上下文菜单时单击菜单项,这是由插件动态完成的。所以,我们首先需要触发菜单。

据我所知,无法触发本机上下文菜单。然而触发右键单击 is possible,您需要使用 contextmenu 事件。

特别是,使用 $(el).trigger('contextmenu') 似乎效果很好。这似乎有效,因为插件明确 supports this。完成后,我们需要触发对我们要单击的菜单项的单击。

// first, trigger the context menu
$('.button-that-has-contextmenu').trigger('contextmenu');
// then click the menu item you want to click
// substitute the correct index in `eq(X)` here
$('.context-menu-item:eq(1)').trigger('mouseup');

因为这个插件没有托管在 CDN 上,所以在这里创建一个片段并不容易。然而,我创建了一个 JSFiddle 来充分演示,我将插件源复制并粘贴到 fiddle.


在评论中,您询问了 web.whatsapp.com. I happen to have a WhatsApp account and tested it there. It seems that they are not using the jQuery contextMenu plugin. A $ function is indeed defined, but it appears not to be jQuery, but just a shortcut to document.querySelector

我不知道他们的自定义上下文菜单代码是什么,但我确实设法触发了它。基本上,我使用了上述代码的 vanilla JS 版本,然后必须弄清楚要触发哪个元素。后者比我想象的要容易。有一个打开的聊天列表,.infinite-list-item 个元素。它们在 DOM 中的顺序与视觉顺序不匹配,但是可以使用浏览器检查器等找到您想要的顺序。鉴于您拥有它,您需要该列表项中的 .chat 元素。假设我们对第二项感兴趣,我们可以 select 如下:

var target = $('.infinite-list-item:nth-child(2) .chat');

您可以在浏览器控制台中检查您是否获得了正确的元素。然后,触发一个事件如下。

var evt = new MouseEvent('contextmenu', {
      bubbles: true,
      cancelable: true,
      view: window,
      buttons: 2
    });
target.dispatchEvent(evt);

这使用现代MouseEvent constructor, code is based on this example

以上将打开浏览器左上角的上下文菜单。您可以通过将 clientXclientY 属性 传递到 MouseEvent 构造函数来更改位置,它们代表 window.

中的位置

完成后,您可以单击上下文菜单中的项目。除非您不能使用 JavaScript 自动执行此操作。我查看了源代码,这些菜单项的点击处理程序检查是否 event.isTrusted,这意味着您无法以编程方式触发对它们的点击。

您可能想研究使用可以在较低级别模拟点击的东西,例如 Selenium 2.0 (WebDriver), or some wrapper around it like WebdriverIO