5

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

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

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

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

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

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

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

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

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

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

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

4

1 回答 1

0

与其轮询 DOM 变化,不如观察网络请求?这似乎是一种更安全的启发式使用。如果 X 毫秒内没有网络活动(并且没有挂起的请求),则假设页面已完全“加载”。

于 2013-02-14T06:43:57.370 回答