硒与 HtmlUnit? [关闭]

Posted

技术标签:

【中文标题】硒与 HtmlUnit? [关闭]【英文标题】:Selenium vs HtmlUnit? [closed] 【发布时间】:2012-09-30 05:40:22 【问题描述】:

我正在尝试更好地理解测试框架并一直在研究 Selenium。我以前用过htmlUnit,主要是当我需要从网站或类似网站上抓取一些信息时。

在编写测试自动化的背景下,Selenium 与 HTMLUnit 的优缺点是什么?在我看来,Selenium 的设置比 HTMLUnit 更复杂,尽管同时有一个用于 Selenium 的 HTMLUnitDriver,我认为它的行为方式与 HTMLUnit 本身完全相同?

Selenium 显然提供了更健壮的框架,它有用于并行测试的 Selenium RC,它还可以使用不同的浏览器驱动程序 - 虽然当您使用浏览器驱动程序时,测试实际上会打开/关闭浏览器应用程序而不是无头。

可能是我没有正确理解 Selenium。一些方向和指针会很棒!

在另一个注意事项 - 一个单独的问题 - 我也在考虑在移动浏览器上进行自动化测试,我看到 Selenium 有一个 IPhoneDriver ,但这也不是无头测试,因为它需要实际的 ios 模拟器.

是否可以在移动网站上进行无头测试?改变用户代理就足够了吗?我看过一些关于更改用户代理的帖子,这些帖子似乎有自己的挑战,例如。 Set user-agent in Selenium RC

非常感谢!

【问题讨论】:

你有没有想过用 PhantomJS 或者“Headless Chrome”来代替? 【参考方案1】:

好吧,会尝试详细解释差异。

谈到并行测试,最好使用 selenium 网格。 硒 RC 和硒网格的基本概念。 您可以了解更多详情here

关于selenium webDriver的一些话:

Selenium 2.0 的主要新特性是集成了 WebDriver API。 WebDriver 旨在提供更简单、更简洁的编程接口,同时解决 Selenium-RC API 中的一些限制。 Selenium-WebDriver 是为了更好地支持动态网页而开发的,其中页面元素可能会更改而无需重新加载页面本身。 WebDriver 的目标是提供一个设计良好的面向对象的 API,为现代高级 Web 应用测试问题提供更好的支持。

与 Selenium-RC 相比,WebDriver 如何“驱动”浏览器?

Selenium-WebDriver 使用每个浏览器对自动化的原生支持直接调用浏览器。这些直接调用的方式以及它们支持的功能取决于您使用的浏览器。本章稍后将提供有关每个“浏览器驱动程序”的信息。 对于熟悉 Selenium-RC 的人来说,这与您习惯的完全不同。 Selenium-RC 对于每个支持的浏览器都以相同的方式工作。它在浏览器加载时将 javascript 函数“注入”到浏览器中,然后使用其 javascript 在浏览器中驱动 AUT。 WebDriver 不使用这种技术。同样,它使用浏览器内置的自动化支持直接驱动浏览器。

WebDriver 和 Selenium-Server

您可能需要也可能不需要 Selenium 服务器,这取决于您打算如何使用 Selenium-WebDriver。如果您只使用 WebDriver API,则不需要 Selenium-Server。如果您的浏览器和测试都将在同一台机器上运行,并且您的测试只使用 WebDriver API,那么您不需要运行 Selenium-Server; WebDriver 将直接运行浏览器。 使用 Selenium-Server 和 Selenium-WebDriver 有一些原因。

您正在使用 Selenium-Grid 将测试分布在多个 机器或虚拟机 (VM)。 您要连接到具有特定浏览器的远程计算机 不在您当前机器上的版本。 您没有使用 Java 绑定(即 Python、C# 或 Ruby)并且 想使用 HtmlUnit 驱动程序

Selenium-WebDriver 的驱动程序 WebDriver 是针对其编写测试的关键接口的名称,但有几种实现。其中包括:

HtmlUnit 驱动程序 这是目前最快、最轻量级的 WebDriver 实现。顾名思义,这是基于 HtmlUnit。 HtmlUnit 是一个基于 Java 的 WebBrowser 实现,没有 GUI。对于任何语言绑定(Java 除外),Selenium Server 都需要使用此驱动程序。

优点

WebDriver 的最快实现 纯 Java 解决方案,因此与平台无关。 支持 JavaScript

缺点

模拟其他浏览器的 JavaScript 行为(见下文)

HtmlUnit 驱动程序中的 JavaScript 没有一个流行的浏览器使用 HtmlUnit (Rhino) 使用的 JavaScript 引擎。如果您使用 HtmlUnit 测试 JavaScript,结果可能与那些浏览器有很大不同。 当我们说“JavaScript”时,我们实际上是指“JavaScript 和 DOM”。尽管 DOM 是由 W3C 定义的,但每个浏览器在 DOM 的实现以及 JavaScript 与它的交互方式方面都有自己的怪癖和差异。 HtmlUnit 有一个令人印象深刻的完整的 DOM 实现,并且对使用 JavaScript 有很好的支持,但它与任何其他浏览器没有什么不同:它与 W3C 标准和主要浏览器的 DOM 实现都有自己的怪癖和差异,尽管它模仿其他浏览器的能力。 使用 WebDriver,我们必须做出选择;我们是否启用了 HtmlUnit 的 JavaScript 功能并冒着团队遇到问题的风险,这些问题只在那里表现出来,或者我们是否知道有越来越多的网站依赖于 JavaScript,而禁用 JavaScript?我们采取了保守的方法,在使用 HtmlUnit 时默认禁用支持。对于 WebDriver 和 HtmlUnit 的每个版本,我们都会重新评估这个决定:我们希望在某个时候在 HtmlUnit 上默认启用 JavaScript。

要深入研究 webDriver 的设置,请参阅 this

来自HtmlUnit documentation: HtmlUnit 不是一个通用的单元测试框架。它专门是一种模拟浏览器以进行测试的方法,旨在用于其他测试框架,例如 JUnit 或 TestNG。

所以总结一下 Selenium 和 HtmlUnit 的区别HtmlUnit 是一个基于 java 的 WebBrowser 实现,没有 GUI一种模拟浏览器用于测试目的的方法Selenium-WebDriver 使用直接调用浏览器每个浏览器对自动化的原生支持。 我们可以看到 HtmlUnit 提供了 API,而没有 GUI 自动化的可能性,而 WebDriver 提供了内部浏览器的自动化可能性。

谈到移动自动化, Selenium 也有一个 iPhone 驱动程序 iPhone Driver wiki article 和安卓驱动 android Driver wiki article

另见this presentation

不幸的是,由于我处理网络自动化(非移动),因此我无法向您提供我对移动驱动程序的工作经验评估。还知道Cucumber(自动化工具)在移动自动化中很受欢迎。 见this 和this。

希望你现在更清楚一点 =)

【讨论】:

非常感谢您的解释! ...因此,特定于浏览器的驱动程序(而不是 HTMLUnitDriver)更好,因为它们可以准确地测试浏览器的行为方式 - 但这是以浏览器在您的屏幕上弹出和弹出为代价的(当您在在本地运行您的测试,您会看到这个浏览器应用程序自行弹出和弹出) - 没有办法不加载实际的浏览器(除了使用 HTMLUnitDriver)? 有一个。如果您觉得它很烦人,您可以获取远程机器 (VM) 并获取例如硒测试在远程机器上运行。分享我在当前项目中使用的方法:在 hudson -jenkins 上添加新任务以在每日构建中运行一组测试并获取有关测试状态的电子邮件通知。我们不应该忘记自动化测试集的基本目标:无论使用什么样的驱动程序,我们都应该完全确信应用程序的功能是稳定的,例如可以发布。细节(HTMLUnitDriver 或其他选择)取决于您的需求和其他依赖项。 几年前,我使用 JavaService 工具将 Selenium RC 安装为 Windows 服务,这样我就可以让它在无人看管的情况下作为无头进程运行而无需登录到机器。 Jenkins 将通过一个 ANT exec 任务启动 Windows 服务,并且在测试套件完成后,另一个 ANT 任务将停止该服务。我按照这个bit.ly/pWS7yR创建了一个自定义bat文件来执行服务安装,例如pastebin.com/zvivguaP【参考方案2】:

Selenium 和 HTMLUnit 在概念上有些相似,但 Selenium 更成熟/更强大,并且具有更多功能。

请注意,Selenium 包含用于 Firefox 的记录 (IDE) 插件,它允许您记录测试以及本质上驱动浏览器的 RC/WebDriver 自动化框架。两者可以一起使用,使测试创建变得非常容易。

我可以看到使用 HTMLUnit 的唯一优势是它占用的资源更少,因此您可以在更少的硬件上运行测试,但有了 Selenium 的并行支持,即使这不再是真的了。

【讨论】:

【参考方案3】:

在通宵运行 Jenkins 测试时,您通常无法访问诸如 X11 或 Windows 之类的窗口系统来运行 Web 浏览器。因此,我看到了在这种情况下使用 HTMLUnit Web 驱动程序的好处,因为它不需要访问窗口系统。

【讨论】:

你可以使用 Xvbf 运行任何带有 Jenkins 的 gui 浏览器 Selenium 过于依赖系统,所以我投给 HTMLUnit【参考方案4】:

根据我的经验,HtmlUnit 在浏览自动化方面做得很好,但在处理 Javascript 时可能会出现一些问题。实际上,我遇到了一个案例,其中我无法使用 HtmlUnit 自动下载图像,不得不求助于 Selenium,它的表现超出了我的预期。该案例实际上注册在SO thread。

【讨论】:

【参考方案5】:

我使用 Selenium WebDriver 进行自动化。 有一种非常简单的方法可以使浏览器无头。 只需应用 ChromeOptions(在我的情况下,其他 DriverOptions 可用) ChromeOptions("Headless")

作为另一个例子,使用 Options 或 Services 可以获得许多熟练的方法 这将阻止驱动程序/命令提示符窗口“出现”,使其保持“静默”且不暴露。 ChromeDriverServices ("Silent")

【讨论】:

【参考方案6】:

至少在 UX 系统中,您可以使用例如 Xvfb 并将浏览器指向该显示器以使其“无头” 另见http://infiniteundo.com/post/54014422873/headless-selenium-testing-with-firefox-and-xvfb 或How do I run Selenium in Xvfb?

【讨论】:

以上是关于硒与 HtmlUnit? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

HtmlUnit---网页抓取工具解析及使用

htmlunit 和 document.addEventListener

在 HtmlUnit 中设置代理

利用htmlunit登陆带验证码图片的网站

零基础快速入门mini爬虫框架HtmlUnit

如何将 SOCKS 与 HtmlUnit 一起使用?