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

e5njpo68  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(90)

我正在使用Watir和Nokogiri来解析网页并与它们交互。我想确定当单击DOM元素时是否触发脚本。从我的研究中,我知道这是可能的JavaScript和Chrome开发工具,但我想用Ruby来实现这一点。
例如,http://worrydream.com。当我检查显示的图像时,我看到的只是带有一些CSS样式的div,但没有迹象表明它是一个链接,或者当我单击时它会做出React。然而,当我单击某些元素时,会执行动画(或脚本)。有什么可以表明点击图像是一个事件?

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

5hcedyr0

5hcedyr01#

简短的回答?没什么
冗长的回答:
为了找出哪些元素触发脚本,您需要知道执行了哪些JavaScript来将侦听器附加到每个元素。为了做到这一点,你必须能够执行JavaScript。WATIR和Nokogiri本身并不执行JavaScript。WATIR使用的浏览器将在内部执行JavaScript。Watir-webdriver使用一个基于Java的浏览器模拟器(Selenium),它也有一个JavaScript执行器,可以执行页面的JavaScript。Nokogiri根本不执行JavaScript。
因此,您需要注入一些自己的JavaScript来“读取”附加到特定元素的侦听器。这并不容易,因为您无法控制JavaScript环境。**但是,**即使你找到了一种方法来做到这一点,然而,事实证明,W3C DOM接口并没有提供标准的方法来找出什么事件侦听器被附加到一个特定的元素。个别的JavaScript库(如JQuery)缓存它们的侦听器,但每个库都以自己的方式进行缓存。
换句话说,这变得非常复杂。

可能的解决办法

下面的内容都是推测,但是如果你真的想在Ruby中获取这些信息,这给了你一些尝试的机会。
首先,你需要一种方法来将JS注入到你的页面中并得到一个结果。使用watir-webdriver可以做到这一点,因为Selenium有钩子来做这件事。有关如何在Selenium中注入JS并将结果返回给调用者的说明,请参阅this page的最后部分。另一个选择是PhantomJS,这是一个带有JS API的无头浏览器。
其次,您需要找到一个JavaScript库,该库理解每个流行的JS库如何缓存它们的侦听器,并可以收集信息。你可以试试Visual Event 2
你仍然需要把这些东西连接起来,这需要一些JS技巧。祝你好运

相关问题