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

标签 javascript ruby html-parsing nokogiri watir

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

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

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

最佳答案

简短的回答?什么都没有。

长答案:

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

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

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

可能的解决方案

以下全是推测,但如果您真的想在 Ruby 领域中获取这些信息,那么您可以尝试一下。

首先,您需要一种将 JS 注入(inject)页面并获得结果的方法。这可以使用 watir-webdriver 来实现,因为 Selenium 有钩子(Hook)可以做到这一点。查看 this page 的最后有关如何注入(inject) JS 并将结果返回给 Selenium 中的调用者的说明。另一个选项是 PhantomJS这是一个带有 JS API 的 headless 浏览器。

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

您仍然需要将这些东西连接起来,这需要一些 JS 技巧。祝你好运。

关于javascript - 如何使用 Ruby 查找 DOM 元素是否具有事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16537132/

相关文章:

ruby - 如何在 Jekyll 的主页上按日期对帖子进行分组?

ruby - 如何验证ruby cucumber中抛出的异常

java - 从 TD 标签中解析 Html 文本

PHP : Form example which will encrypt query string (GET) (data hiding rather than security)

android - Flutter 中的 HTML 解析,用于 android/iOS 开发

javascript - 如何在nodejs的URL中使用ajax接收客户端发送的变量中的值?

javascript - jQuery ajax 因未知原因失败

c# - 我应该为这个项目选择哪种编程语言/框架?

javascript - 访问 Angular $http

javascript - jQuery:在完成 2 个组合动画后删除 Div?