【发布时间】:2012-12-27 14:03:51
【问题描述】:
背景:
我被授权“自动化”第三方网站,以便将“服务订单”推送到其中并监控这些请求的进度。
我尝试采用普通的“抓取”方法(使用 Perl 中的 WWW::Mechanize、HTML::Query 等),但遇到了很多问题,无法预测网站中的 JavaScript 会在下面做什么各种情况。如果我从运行 3rd 方站点的产品供应商那里获得支持,或者可以获得一些更好的产品业务规则文档,我打算回到这种方法。
为了避免再次猜测 JavaScript 代码并节省大量时间,我最终采取了一种方法,即在专用 VM 上加载 Firefox 中的 3rd 方站点,然后执行“特权”代码(即:nsI *) 在网站上下文中“驱动”和“抓取”网站。
我目前正在使用 nsIWebProgressListener/DOMContentLoaded(当我已经引用 ChromeWindow 时),以及从 setInterval 调用的 nsIWindowMediator window+tab 枚举来查找新的窗口和标签(当我有由于第 3 方 JavaScript 的作用域,无法预测它们会打开,也无法获得对其 DOMWindow 对象的引用)。
问题:
如何自动将“钩子”安装到由 3rd 方站点的 JavaScript 现在(以及将来)打开的每个窗口/选项卡中?在这种情况下,用于整个 Firefox UI 的“窗口观察者”nsI~ 界面将非常有用。
【问题讨论】:
-
基本上你想用监听器替换轮询(
setInterval)? -
这是您可以使用浏览器自动化工具(如Selenium)的东西吗?
-
@h0tw1r3 我希望能够注册一个侦听器,以便为每个适当的事件提供回调。
-
@RichardTowers 不幸的是,没有。 Selenium 无法比我更能预测应用程序的业务逻辑。我真的需要在创建每个窗口/选项卡时捕获它。
-
@RichardTowers 我无法预测新窗口何时会打开(请参阅有关业务规则的要点)。但是,一旦我(以某种方式)检测到打开了一个新窗口,我就可以使用
document.location和window.opener以及document的内容来确定它与应用程序中“当前”窗口的关系。
标签: javascript firefox screen-scraping xul