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

Sea*_*123 5 javascript ruby watir html-parsing nokogiri

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

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

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

Mar*_*mas 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 技巧。祝你好运。