繁体   English   中英

Heisenbug拥有自己的无头浏览器

[英]Heisenbug with own headless browser

我正在开发基于WebKit(使用C ++ / Qt4)和JavaScript支持的无头浏览器。 这样做的主要目的是能够在很大程度上基于JavaScript生成HTML网站的spanshot(参见Backbone.js或任何其他JavaScript MVC)。

我知道没有任何方法可以知道页面何时被完全加载(请参阅此问题 ),因此,在我获得loadFinished信号( 此处为 docs)后,我创建了一个计时器并开始轮询DOM内容(如检查每个X ms的DOM内容)以查看是否有任何更改。 如果没有我认为页面已加载并打印结果。 请记住,我已经知道这不是一个接近完美的解决方案,但它是我能想到的唯一一个。 如果您有任何更好的想法,请回答这个问题

注意:计时器是非阻塞的,这意味着WebKit中运行的所有内容都不应以任何方式受到影响/阻止/暂停。

在用一些页面测试无头浏览器之后,一切似乎都运行良好(或至少如预期的那样)。 但这里是heisenbug出现的地方。 应该从PHP脚本调用无头浏览器,该脚本应等待(阻塞调用)某些输出,然后打印它。

在我的测试机器(Apache 2.3.14,PHP 5.4.6)上运行PHP脚本输出所需的结果,也就是说,无头浏览器获取网站,运行JavaScript并打印用户将看到的内容; 但是在生产服务器中运行相同的脚本将获取网站,运行一些 JavaScript代码并打印结果。

我可以在这里找到无头浏览器的源代码和我正在使用的PHP脚本。

注意:计时器(如您在无头浏览器的源代码中所见)设置为1秒,但设置更长的时间并不能解决问题

注意2:捕获所有JavaScript错误没有显示任何内容,因此不是因为缺少函数,错误的args或任何其他类型的错误代码。

我正在用2个网站测试无头浏览器。 这个是在我的测试机器和生产服务器上工作,而这个只适用于我的测试机器。

我更倾向于认为这是第二个网站中JavaScript代码中的一些奇怪的错误,而不是无头浏览器的代码,因为它生成了第一个网站的完美HTML快照,但话又说回来,这是一个heisenbug所以我不确定是什么导致了这一切。

任何想法/意见将不胜感激。 谢谢

而不是轮询DOM更改,为什么不观看网络请求? 这似乎是一个更安全的启发式使用。 如果X ms没有网络活动(并且没有待处理请求),则假设页面已完全“加载”。

暂无
暂无

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

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