5

我正在使用 Watir 和 Nokogiri 来解析网页并与之交互。我想确定单击 DOM 元素时是否触发脚本。根据我的研究,我了解到使用 JavaScript 和 chrome 开发工具可以做到这一点,但我想用 Ruby 来完成。

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

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

4

1 回答 1

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 有钩子可以做到这一点。有关如何注入 JS 并将结果返回给 Selenium 中的调用者的说明,请参阅本页的最后。另一个选择是PhantomJS,它是一个带有 JS API 的无头浏览器。

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

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

于 2013-05-15T20:51:12.630 回答