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 的演示,我正在其中通过开发人员控制台测试上述内容。
因此,当您右键单击上下文菜单时,会列出一个菜单项列表 ul
和 li
tags.I 手动将 ID #myapp
添加到其中一个菜单和下面的代码,它也通过开发者控制台选择正确的元素。
var targetNode = document.querySelector("#myapp");
targetNode;
但是我无法触发对通过上下文菜单生成的菜单项的点击。我为此苦苦挣扎了超过 24 小时。我尝试了 JavaScript 中我能想到的所有事件,例如 mouseup
、mousedown
和 mouseenter
。
您只能在创建上下文菜单时单击菜单项,这是由插件动态完成的。所以,我们首先需要触发菜单。
据我所知,无法触发本机上下文菜单。然而触发右键单击 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。
以上将打开浏览器左上角的上下文菜单。您可以通过将 clientX
和 clientY
属性 传递到 MouseEvent
构造函数来更改位置,它们代表 window.
中的位置
完成后,您可以单击上下文菜单中的项目。除非您不能使用 JavaScript 自动执行此操作。我查看了源代码,这些菜单项的点击处理程序检查是否 event.isTrusted
,这意味着您无法以编程方式触发对它们的点击。
您可能想研究使用可以在较低级别模拟点击的东西,例如 Selenium 2.0 (WebDriver), or some wrapper around it like WebdriverIO。
我正在尝试为站点创建 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 的演示,我正在其中通过开发人员控制台测试上述内容。
因此,当您右键单击上下文菜单时,会列出一个菜单项列表 ul
和 li
tags.I 手动将 ID #myapp
添加到其中一个菜单和下面的代码,它也通过开发者控制台选择正确的元素。
var targetNode = document.querySelector("#myapp");
targetNode;
但是我无法触发对通过上下文菜单生成的菜单项的点击。我为此苦苦挣扎了超过 24 小时。我尝试了 JavaScript 中我能想到的所有事件,例如 mouseup
、mousedown
和 mouseenter
。
您只能在创建上下文菜单时单击菜单项,这是由插件动态完成的。所以,我们首先需要触发菜单。
据我所知,无法触发本机上下文菜单。然而触发右键单击 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。
以上将打开浏览器左上角的上下文菜单。您可以通过将 clientX
和 clientY
属性 传递到 MouseEvent
构造函数来更改位置,它们代表 window.
完成后,您可以单击上下文菜单中的项目。除非您不能使用 JavaScript 自动执行此操作。我查看了源代码,这些菜单项的点击处理程序检查是否 event.isTrusted
,这意味着您无法以编程方式触发对它们的点击。
您可能想研究使用可以在较低级别模拟点击的东西,例如 Selenium 2.0 (WebDriver), or some wrapper around it like WebdriverIO。