【问题标题】:How to find if a DOM element has an event listener with Ruby如何使用 Ruby 查找 DOM 元素是否具有事件侦听器
【发布时间】:2013-05-08 09:03:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript ruby html-parsing nokogiri watir


    【解决方案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 中的调用者的说明,请参见 this page 的末尾。另一个选项是PhantomJS,它是一个带有 JS API 的无头浏览器。

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

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

    【讨论】:

    • 您将我引导至视觉事件2是正确的。我之前考虑过,但由于我持有的一些误解,我最初拒绝了它。我现在正在研究如何将 Visual Event 2 中的信息提取到 Ruby 中,如下面的question 所示。希望我能尽快自己回答!
    • 通过干预 Visual Event 2 的源代码,然后将其注入 Selenium-Webdriver,我能够识别与 JavaScript 事件相关联的元素并从中检索信息。感谢您为我指明正确的方向,马克。
    • 嗯,它在一定程度上起作用了。 Visual Event 2 没有检测到所有可点击的内容(例如,尝试导航到 translate.google.com),但它至少让我了解了获得 100% 的覆盖率是多么困难。
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2013-12-09
    • 2018-10-11
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多