我正在开发一个基于WebKit (使用C++/Qt4)并支持JavaScript的无头浏览器。其主要目的是能够大量基于JavaScript (请参阅Backbone.js或任何其他JavaScript MVC)生成网站的HTMLSpan快照。
我知道没有任何方法可以知道页面何时被完全加载(请参见这个问题),因此,在我获得loadFinished信号(docs 这里)之后,我创建了一个计时器,并开始轮询DOM内容(就像在检查DOM的每一个X毫秒内容时一样),以查看是否有任何更改。如果没有,我假设页面已经加载并打印结果。请记住,我已经知道这不是接近完美的解决方案,但这是我唯一能想到的。如果你有更好的主意,请回答这个问题
注意:计时器是非阻塞的,这意味着在WebKit中运行的所有东西都不应该以任何方式受到影响/阻塞/暂停。
在用一些页面测试无头浏览器之后,一切看起来都很好(或者至少和预期的一样)。但这里是海星虫出现的地方。应该从PHP脚本中调用无头浏览器,该脚本应该等待(阻塞调用)一些输出,然后打印出来。
在我的测试机器(Apache2.3.14,PHP5.4.6)上,运行PHP脚本输出所需的结果,即无头浏览器获取网站、运行JavaScript并打印用户将看到的内容;但是在生产服务器中运行相同的脚本将获取网站、运行一些JavaScript代码并打印结果。
无头浏览器的源代码和我使用的PHP脚本可以找到这里。
注意:计时器(如无头浏览器源代码中所示)设置为1s,但设置更长的时间并不能解决问题。
注意2:捕获所有JavaScript错误不会显示任何内容,所以这并不是因为缺少函数、错误的args或任何其他类型的不正确代码。
我正在用2个网站测试无头浏览器。这一个同时在我的测试机器和生产服务器上工作,而这一个只在我的测试机器上工作。
我更倾向于认为这是第二个网站的JavaScript代码中的一些奇怪的错误,而不是在无头浏览器的代码中,因为它生成了第一个网站的完美HTML快照,但话又说回来,这是一个heisenbug,所以我不太清楚是什么导致了这一切。
如有任何意见或意见,将不胜感激。谢谢
发布于 2013-02-14 06:43:57
为什么不监视网络请求,而不是轮询DOM更改呢?这似乎是一个更安全的启发式使用。如果X ms没有网络活动(也没有挂起的请求),那么假设页面已完全“加载”。
https://stackoverflow.com/questions/13623257
复制相似问题