JavaScript - 模拟单击​​上下文菜单

2024-04-01

我正在尝试为网站创建网络自动化。我正在模拟点击。通常我会向如下所示的元素添加 ID,并使用 Chrome 开发者控制台触发单击,并且它始终有效。

p.s:下面的问题已经过时了。我实际上正在尝试从 web.whatsapp.com 的上下文菜单中单击一个项目

<div id="myapp">button1</div>

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

或者,如果这不起作用,我使用mousedown使用纯 JavaScript 的事件如下所示,它将顺利工作。

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 生成的菜单上下文菜单 https://swisnl.github.io/jQuery-contextMenu/ plugin.

您可以查看 contextMenu 的演示here https://swisnl.github.io/jQuery-contextMenu/demo.html,我正在通过开发人员控制台测试上述内容。

因此,当您右键单击上下文菜单时,会出现一个菜单项列表,其中列出了ul and liTags.我手动添加了ID#myapp到菜单之一并使用下面的代码,它还可以通过开发人员控制台选择正确的元素。

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

但我无法触发通过上下文菜单生成的菜单项的单击。我为此挣扎了超过24小时。我尝试了所有我能想到的 JavaScript 事件,比如mouseup, mousedown, and mouseenter.


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

据我所知,触发本机上下文菜单是不可能的。但是触发右键单击是可能的 https://stackoverflow.com/q/7914684/962603,你需要使用contextmenu event.

特别是,使用$(el).trigger('contextmenu')似乎工作正常。这似乎有效,因为插件明确地支持这个 https://swisnl.github.io/jQuery-contextMenu/docs/events.html#contextmenu。完成后,我们需要触发我们想要单击的菜单项的单击。

// 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 https://jsfiddle.net/Justastudent/vak81sdm/1/为了完整地演示这个,我将插件源复制并粘贴到小提琴中。


在评论中,您询问了web.whatsapp.com https://web.whatsapp.com/。我碰巧有一个 WhatsApp 帐户并在那里进行了测试。看来他们是not使用 jQuery contextMenu 插件。 A$function 确实定义了,但它似乎不是 jQuery,而只是一个快捷方式document.querySelector https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector.

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

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 https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent构造函数,代码基于这个例子 https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent#Example.

以上将打开浏览器左上角的上下文菜单。您可以通过传递来更改位置clientX and clientY财产进入MouseEvent构造函数,表示窗口中的位置。

完成后,您可以单击上下文菜单中的项目。除非你无法使用 JavaScript 自动执行此操作。我查看了源代码,这些菜单项的单击处理程序检查是否event.isTrusted https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted,这意味着您无法以编程方式触发对它们的点击。

您可能想考虑使用可以模拟较低级别点击的东西,例如硒2.0 http://www.seleniumhq.org/projects/webdriver/(WebDriver),或者它周围的一些包装,比如网络驱动IO http://webdriver.io/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript - 模拟单击​​上下文菜单 的相关文章

随机推荐

  • 证明特定矩阵存在

    我在编程论坛 Ohjelmointiputka 中发现了这个问题 https www ohjelmointiputka net postit tehtava php tunnus ahdruu https www ohjelmointipu
  • Dart:从字符串创建方法

    我一直在尝试使用 Dart 从字符串动态创建方法 但没有成功 字符串示例 String str gt return str length 这个想法是允许用户创建自己的函数来应用于给定的字符串 我发现的唯一的东西是 NoSuchMethod
  • PrintSystemJobInfo.JobStream 是否损坏?

    我从目标打印机获取队列并浏览其上的作业列表 当作业不是 IsSpooling 时 我尝试读取 JobStream 以查看打印作业 到目前为止 JobStream 一直为 null 我的打印内容来自 DOS 应用程序 应该是纯文本 我已经暂停
  • C 中带括号和不带括号的循环处理方式不同吗?

    我在调试器中单步执行一些 C CUDA 代码 如下所示 for uint i threadIdx x i lt 8379 i 256 sum d PartialHistograms blockIdx x i HISTOGRAM64 BIN
  • 当我运行多个测试时,Django LiveServerTestCase 无法加载页面

    我正在尝试在一个 Django LiveServerTestCase 中运行多个测试 当我运行任何单个测试 其他人评论 时 一切都会按预期进行 但是 当我通过两个测试运行测试用例时 第一个测试工作正常 但第二个测试加载带有 内部服务器错误
  • 具有嵌套属性的 Best_In_Place 内联编辑

    我目前正在尝试使用 best in place gem 来在 HTML 表中进行内联编辑 我正在购物车的显示视图中显示购物车 在购物车的显示视图中 我可以添加订单项 创建 LineItem 时 还会创建一个带有 lineItem id 的新
  • 标记文本解析器,如 Objective-C 中的 stackoverflow 格式化程序

    我正在使用 Objective C 创建标记编辑器 我需要以下功能 识别块的分界 例如 block 删除开始和结束 标签 例如 下一个文本是 bold 变为 下一个文本为粗体 确定新上下文中标记文本的开始和结束位置 下一个文本是粗体 编辑
  • 多种类型实体的数据库设计

    我需要开发一个应用程序 其中有 4 种类型的用户实体 管理员 合作伙伴 公司和客户 每种用户类型都有自己的一组详细信息 并且他们都应该能够执行常见操作 例如发送消息 付款等等 这些操作应保留在单个表中 但它们需要引用确切的用户 无论其类型如
  • Jasper Report 中的 Java Beans 列表中的 pass 列表

    我正在使用 Jasper Report 和 Servlet Bean 团队看起来像 private int tid private String title private List
  • HornetQ JMSException:无法创建会话工厂

    我正在尝试直接实例化 JMS 资源 而不使用远程 HORNETQ 的 JNDI 我正在 Eclipse IDE 中运行我的测试代码 设置我的类路径以使用 HornetQ 2 2 5 库 目标HornetQ是版本2 1 2 Final 我认为
  • 如何使用 C# 检索 .config 文件中的自定义配置部分列表? [复制]

    这个问题在这里已经有答案了 当我尝试使用检索 config 文件中的部分列表时 Configuration config ConfigurationManager OpenExeConfiguration ConfigurationUser
  • c#/.Net Socket.Shutdown

    我认识到此类问题已有很长的历史 但我使用此问题的方式必须是正确的 net 方式 但它似乎不起作用 我有一个简单的同步 IP 服务器守护进程 它执行一个简单的 AcceptSocket 执行一些操作 socket send socket sh
  • 如何在 jQuery 中发送 PUT/DELETE 请求?

    GET get POST post 关于什么PUT DELETE 你可以使用ajax http docs jquery com Ajax jQuery ajax options method ajax url script cgi type
  • 将 axios POST 请求与 moxios 匹配

    是否可以使用 moxios 模拟对 POST 请求的回复 不仅通过 URL 匹配 还通过 POST 正文匹配 事后检查尸体对我来说也很有用 这就是我现在正在做的事情 据我所知 没有特定于方法的存根方法 describe createCode
  • 应该创建多种文档类型或多个索引吗?

    我们为企业托管许多网站 每个企业都会有许多他们可能希望通过 ES 进行索引和搜索的文档类型 通常 每个业务拥有的文档类型数量少于 20 个 每个类型可能拥有少于 100k 个文档 通常要少得多 我不确定应该如何设置这些网站的数据 我应该将它
  • ice_cube 的营业时间

    我如何能够在单一时间表中规定餐厅的营业时间 周一至周五 8 点至 16 点非常简单 schedule Schedule new Time parse Date yesterday to s 8 00 duration gt 60 60 8
  • MVC 4 和 JsonResult 格式

    这段代码的结果格式有问题 public JsonResult getCategorias int id var res from c in db Categorias where id HasValue c CategoriaPadre i
  • 水平和垂直并排有许多小 div 和一个大 div?

    我应该如何创建这种结构 我的第一个想法是将四个粉红色组合成一个橙色 这样我就得到了 4pinksVS1orange 现在下一个难题是将它们并排放置 我不知道 好吧 我知道一些 hxcks 但它们很容易被打破 然后 拼图是底行有四个粉红色的拼
  • 浏览器中文本区域处理不一致

    这是我在下面提供的标记中看到的内容 没有一个浏览器将文本区域保留在容器中 这很不方便 但并不是什么大问题 然而 令人烦恼的是 无论我做什么 我都无法摆脱 Chrome 中文本区域的下边距 有什么建议么 Here is everything
  • JavaScript - 模拟单击​​上下文菜单

    我正在尝试为网站创建网络自动化 我正在模拟点击 通常我会向如下所示的元素添加 ID 并使用 Chrome 开发者控制台触发单击 并且它始终有效 p s 下面的问题已经过时了 我实际上正在尝试从 web whatsapp com 的上下文菜单