我正在使用基于JavaScript的WebKit(使用C++/Qt4)的无头浏览器。这样做的主要目的是能够大量基于JavaScript生成网站的HTML截图(请参阅Backbone.js或任何其他JavaScript MVC)。
我知道没有任何方法可以知道页面何时完全加载(请参阅this question),因此,在收到loadFinished
信号(docs here)之后,我创建了一个计时器并开始轮询DOM内容(就像检查每X ms的DOM内容一样),以查看是否有任何更改。如果没有,我认为页面已加载并打印结果。请记住,我已经知道这不是一个完美的解决方案,但这是我能想到的唯一解决方案。如果您有更好的主意,请回答this question
注意:计时器是非阻塞的,这意味着WebKit中运行的所有内容都不应受到任何影响/阻塞/暂停。
在对带有某些页面的无头浏览器进行测试之后,一切似乎都正常运行(或至少达到了预期)。但是,这里出现了heisenbug。应该从PHP脚本中调用无头浏览器,该脚本应等待(阻止调用)某些输出,然后将其打印出来。
在运行PHP脚本的测试机(Apache 2.3.14,PHP 5.4.6)上,可以输出所需的结果,也就是说,无头浏览器将获取网站,运行JavaScript并打印用户将看到的内容。但是在生产服务器中运行相同的脚本将获取网站,运行一些JavaScript代码并打印结果。
我正在使用的无头浏览器和PHP脚本的源代码可以在here中找到。
注意:计时器(您可以在无头浏览器的源代码中看到)设置为1s,但是设置更长的时间并不能解决问题
注2:捕获所有JavaScript错误不会显示任何内容,因此不是由于缺少函数,错误的args或任何其他类型的错误代码。
我正在用2个网站测试无头浏览器。
This one在我的测试机和生产服务器上都可以使用,而this one仅在我的测试机上可以使用。
我更倾向于认为这是第二个网站中的JavaScript代码而不是无头浏览器代码中的一些奇怪的错误,因为它会生成第一个网站的完美HTML快照,但是同样,这是一个heisenbug,所以我不太确定是什么导致了这一切。
任何想法/评论将不胜感激。谢谢
最佳答案
为什么不监视网络请求,而不是轮询DOM更改?这似乎是一种更安全的启发式方法。如果X毫秒内没有网络 Activity (并且没有挂起的请求),则假定页面已完全“加载”。