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

6
我正在使用Watir和Nokogiri解析网页并与之交互。我想确定DOM元素在被点击时是否会触发脚本。从我的研究中,我了解到这是可能的,需要使用JavaScript和Chrome开发工具,但我希望用Ruby来实现。
例如,http://worrydream.com。当我检查显示的图像时,我只看到一些CSS样式的div,没有任何指示它是链接或者会在我点击时有反应。然而,当我点击某些元素时,会执行动画(或脚本)。有什么迹象表明点击图像是一个事件?
更新: 最初,我考虑的是抓取与页面相关联的JavaScript,然后以某种方式确定是否会触发事件,但我将尝试Mark Thomas提出的解决方案,并在测试后将其答案标记为正确。
1个回答

1
短答案?没有。
长答案:
为了找出哪些元素触发脚本,您需要知道已执行的Javascript附加侦听器到每个元素。为了做到这一点,您必须能够执行Javascript。WATIR和Nokogiri本身不执行Javascript。WATIR使用一个浏览器,该浏览器将在内部执行JavaScript。Watir-webdriver使用基于Java的浏览器仿真器(Selenium),它也有一个JavaScript执行器,可以执行页面的javascript。Nokogiri根本不执行JavaScript。
因此,您需要注入自己的一些Javascript来“读取”附加到特定元素的侦听器。这并不容易,因为您无法控制JavaScript环境。但是,即使您找到了一种方法来做到这一点,结果表明,W3C DOM接口没有提供标准方法来查找附加到特定元素的事件侦听器。像JQuery这样的单个JavaScript库会缓存其侦听器,但每个库都以自己的方式进行。
换句话说,这变得非常复杂。
一个可能的解决方案
以下都是推测,但如果您真的想追求在Ruby land中获取此信息,这将为您提供一些尝试的内容。
首先,您需要一种将JS注入到页面并获得结果的方法。这可能是使用watir-webdriver实现的,因为Selenium具有执行此操作的钩子。请参阅此页面的最后部分,了解如何在Selenium中注入JS并将结果返回给调用方的说明。另一个选择是PhantomJS,它是一个具有JS API的无头浏览器。
其次,您需要找到一个JavaScript库,它了解流行的JS库如何缓存其侦听器并可以收集信息。为此,您可以尝试Visual Event 2
您仍然需要连接这些东西,这需要一些JS技巧。祝你好运。

你正确地引导我使用 Visual Event 2。我之前考虑过它,但由于一些我持有的误解,我最初拒绝了它。我现在正在寻找如何从 Visual Event 2 中提取信息,并将其转换为 Ruby,就像以下问题所示。希望我能很快自己回答这个问题! - Seanny123
1
通过篡改Visual Event 2的源代码,然后注入Selenium-Webdriver,我能够识别与JavaScript事件相关联的元素并从中检索信息。感谢你指引我正确的方向,马克。 - Seanny123
嗯,它在某种程度上起作用了。Visual Event 2无法检测到所有可点击的内容(例如,尝试导航到translate.google.com),但至少让我有了一个想法,即要实现100%的覆盖率有多难。 - Seanny123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接