如何使用 Ruby 查找 DOM 元素是否具有事件侦听器

问题描述 投票:0回答:2

我正在使用 Watir 和 Nokogiri 来解析网页并与它们交互。我想确定 DOM 元素在单击时是否触发脚本。根据我的研究,我知道这可以通过 JavaScript 和 chrome 开发工具实现,但我想通过 Ruby 来实现这一点。

例如,http://worrydream.com。当我检查显示的图像时,我看到的只是带有一些 CSS 样式的 div,但没有迹象表明它是一个链接,或者当我单击时它会做出反应。然而,当我单击某些元素时,会执行动画(或脚本)。有什么可以表明点击图像是一个事件?

更新: 最初,我正在考虑做的是抓取与页面关联的 JavaScript,然后以某种方式确定是否会触发事件,但我将尝试 Mark Thomas 提出的解决方案,并在测试后将他的答案标记为正确。

javascript ruby html-parsing nokogiri watir
2个回答
1
投票

简短的回答?没什么。

长答案:

为了找出哪些元素触发脚本,您需要知道执行了哪些 Javascript 将侦听器附加到每个元素。为了做到这一点,您必须能够执行 Javascript。 WATIR 和 Nokogiri 本身不执行 Javascript。 WATIR 使用将在内部执行 JavaScript 的浏览器。 Watir-webdriver 使用基于 Java 的浏览器模拟器 (Selenium),它还有一个 JavaScript 执行器,可以执行页面的 javascript。 Nokogiri 根本不执行 JavaScript。

因此,您需要注入一些自己的 Javascript 来“读取”附加到特定元素的侦听器。这并不容易,因为您无法控制 JavaScript 环境。 但是, 即使您找到了一种方法来做到这一点,但事实证明,W3C DOM 接口没有提供标准方法来找出哪些事件侦听器附加到特定元素。像 JQuery 这样的单独 JavaScript 库会缓存它们的侦听器,但每个库都以自己的方式执行此操作。

换句话说,这变得非常复杂。

一个可能的解决方案

以下全是猜测,但如果你真的想在 Ruby 土地上追回这些信息,这给你一些尝试。

首先,您需要一种将 JS 注入到页面中并获得结果的方法。这可以使用 watir-webdriver 来实现,因为 Selenium 有钩子可以做到这一点。请参阅本页的最后部分,了解如何在 Selenium 中注入 JS 并将结果返回给调用者。另一个选择是 PhantomJS,它是一个带有 JS API 的无头浏览器。

其次,您需要找到一个 JavaScript 库,该库了解每个流行的 JS 库如何缓存其侦听器并可以收集信息。为此,您可以尝试Visual Event 2

您仍然需要连接这些东西,这需要一些 JS hackery。祝你好运。


0
投票

Ruby 是一种服务器端编程语言,无法直接访问 DOM。但是,如果您使用 Ruby on Rails(一种流行的 Web 框架),则可以使用 JavaScript 和 jQuery 来确定元素是否具有客户端事件侦听器。这是一个例子:

假设您的布局中有一个 ID 为“myButton”的按钮元素。要查看按钮是否有单击事件侦听器,请使用下面的 jQuery 代码:

''' else $('#myButton').data('事件')['点击'] “按钮有一个点击事件侦听器。” 否则,它会显示“按钮没有单击事件侦听器”。 结束'''

说明:此代码确定按钮的事件数据中是否存在“click”事件。如果存在,则表明该按钮有单击事件侦听器。如果不存在,则表明该按钮缺少点击事件监听器。

由于 DOM 元素仅在客户端可用,因此该代码应该在客户端而不是服务器端执行。

我是一名博士生,专门从事研究计划。我也是一名自由研究员和作家,专门从事研究提案修正。我可以协助您完成“英国研究提案修正服务”的所有要素,从想法头脑风暴到最终草稿写作。我还可以对您的提案提供意见并协助您改进。 您可以聘请最好的研究提案修订服务和对Words Doctorate拒绝所有工作的纠正支持,以使您的提案结构良好。

参考:

https://www.wordsdoctorate.com/

© www.soinside.com 2019 - 2024. All rights reserved.