Heisenbug拥有自己的无头浏览器

时间:2012-11-29 10:05:34

标签: javascript c++ webkit qt4 headless-browser

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

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

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

在使用某些页面测试无头浏览器后,一切似乎都能正常工作(或至少符合预期)。但这里是heisenbug出现的地方。应该从PHP脚本调用无头浏览器,该脚本应等待(阻塞调用)某些输出,然后打印它。

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

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

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

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

我正在使用2个网站测试无头浏览器。 This one正在我的测试计算机和生产服务器上工作,而this one仅适用于我的测试计算机。

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

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

1 个答案:

答案 0 :(得分:0)

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