繁体   English   中英

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

[英]How to find if a DOM element has an event listener with Ruby

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

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

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

简短的回答? 没有。

答案很长:

为了找出哪些元素触发脚本,您需要知道将每个元素的侦听器附加到哪个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 hackery。 祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM