gpt4 book ai didi

javascript - 带有自己的 headless 浏览器的 Heisenbug

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:45 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

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

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

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

最佳答案

与其轮询 DOM 变化,不如观察网络请求?这似乎是一种更安全的启发式方法。如果 X 毫秒没有网络事件(并且没有待处理的请求),则假定页面已完全“加载”。

关于javascript - 带有自己的 headless 浏览器的 Heisenbug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com