Heisenbug拥有自己的无头浏览器

ale*_*nst 5 javascript c++ webkit qt4 headless-browser

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

我知道没有任何方法可以知道页面何时被完全加载(请参阅此问题),因此,在我获得loadFinished信号(此处的文档)后,我创建了一个计时器并开始轮询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所以我不确定是什么导致了这一切.

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

set*_*mcl 0

与其轮询 DOM 更改,为什么不观察网络请求呢?这似乎是一种更安全的启发式方法。如果 X 毫秒内没有网络活动(并且没有待处理的请求),则假设页面已完全“加载”。