真正的无头浏览器

Posted

技术标签:

【中文标题】真正的无头浏览器【英文标题】:Real headless browser 【发布时间】:2011-06-10 19:58:28 【问题描述】:

我负责测试一个大量使用 AJAX 的企业 Web 应用程序。我需要构建一个允许在没有人工干预的情况下连续运行测试的系统。目前我最感兴趣的是负载测试,但我希望用于生成负载的相同脚本用于功能测试。

目前我正在使用grinder 进行负载测试。我们记录脚本,然后处理它们以处理异步请求等。该系统目前有效;但是脚本很微妙,我无法在我们的开发周期中维护它们。我需要能够通过一种抽象出 htmljavascript 细节的编程语言来“运行浏览器”,但它必须是无头的。换句话说,如果我的测试脚本中断,它必须代表应用程序的实际中断。在xvfb 中运行firefox 不起作用,因为即使在运行xvfb 的无头Linux 机器上,firefox 仍然使用太多资源。我尝试在 headless x 服务器下使用 webdriver 驱动 firefox。

我已经在HTMLUnit 上工作了好几天,因为这是理想的解决方案。我一直在Jython 中编写HTMLUnit 驱动程序,因此我可以将它们与磨床一起使用。不幸的是,我遇到了 javascript 错误(这不是 firefox/chrome/IE 中的真正错误),我认为我已经走到了尽头。无论如何,我很清楚HtmlUnit,我真的需要一个替代方案。

我知道还有一些其他的解决方案(envjs 和zombie.js);但是我不知道这些技术有多发达,我不想再浪费一周时间走上死胡同。

获取 Firefox 或 Webkit 的源代码并注释掉所有渲染/GUI 调用并创建一个有多难?这已经完成了吗?一个人会比另一个人更容易做到这一点吗?老实说,我无法理解为什么这还没有完成,所以我猜这比我预期的要困难得多。

我假设如果我能获得一个具有合理性能特征的真正无头浏览器(我有一个大型服务器机群来解决这个问题,但它对于真正的带有 GUI 渲染的 firefox 来说还不够大),那么我就会做好准备。

【问题讨论】:

您是否考虑过使用 BrowserMob (browsermob.com/performance-testing) 或 Gomez (gomez.com/products-solutions/products/load-testing) 等商业服务。虽然不便宜,但似乎比尝试破解 Firefox/Webkit 更容易。 我真的没有研究过这些服务,但我听说过。我热衷于将内部系统与开源技术组合在一起。我们有很多测试服务器,我真的很想利用它们。不过感谢您的建议。 【参考方案1】:

这是由http://www.phantomjs.org/ 的人完成的。用他们自己的话说:

PhantomJS 是一个带有 JavaScript API 的无头 WebKit。它具有对各种 Web 标准的快速原生支持:DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。

PhantomJS 是基于 Web 的应用程序、网站抓取、页面捕获、SVG 渲染器、PDF 转换器和许多其他用例的无头测试的最佳解决方案。

PhantomJS 由 Ariya Hidayat 创建

【讨论】:

www.slimerjs.org 虽然没有 xvfb 它不是无头的【参考方案2】:

您也许可以利用一些可用的 JavaScript 单元测试工具来组装您需要的那种环境。

例如,我发现在rhino 中加载env.js 可以为测试大多数JavaScript 提供可接受的假浏览器。它在某些 DOM 属性上有所不足,例如元素相对于其窗口的大小,但根据我的经验,这并不是一个严重的问题。

另见:

http://ejohn.org/blog/bringing-the-browser-to-the-server/ http://pivotal.github.com/jasmine/ https://github.com/relevance/blue-ridge

【讨论】:

谢谢,接下来我可能会尝试 env.js 和 rhino。这也应该允许我与当前基于 java 的负载测试框架集成。关于它将如何与 HtmlUnit 进行比较的任何想法?有使用zombie.js 的经验吗? 据我回忆,上次我查看 HTMLUnit 时它没有我需要的 JavaScript 支持,但现在可能不再如此。我没有尝试过zombie.js,但它看起来值得研究,感谢您指出这一点。【参考方案3】:

看看LoadBooster。它是一种基于云的负载测试服务,它利用无头浏览器 PhantomJS 来测试网站。免责声明:我为LoadBooster 工作。

【讨论】:

【参考方案4】:

看看WebKitDriver。该项目包括 WebKit 的无头实现。

【讨论】:

以上是关于真正的无头浏览器的主要内容,如果未能解决你的问题,请参考以下文章

Selenium 是不是支持无头浏览器测试?

是否有适用于Behave的Python无头浏览器,而不使用Selenium或真实的浏览器

无头浏览器是啥?它有啥用?

教你怎么用JavaScript检测当前浏览器是无头浏览器

无头浏览器

你是否了解谷歌的无头浏览器?