Selenium和HtmlUnit有何区别?

47
我正在努力了解测试框架,并研究Selenium。以前我使用过HTMLUnit,主要是在需要从网站上爬取一些信息时使用。
在编写测试自动化的情况下,Selenium相对于HTMLUnit的优缺点是什么?看起来Selenium比HTMLUnit更难设置,尽管同时有一个HTMLUnitDriver用于Selenium,我认为它的行为与HTMLUnit本身完全相同。
显然,Selenium提供了更强大的框架,它具有Selenium RC进行并行测试,还有可以使用的不同浏览器驱动程序-尽管当您使用浏览器驱动程序时,测试实际上会打开/关闭浏览器应用程序而不是无头的。
也许我没有正确理解Selenium。一些方向和指针将是很好的!
另外一个问题-一个单独的问题-我也在研究在移动浏览器上进行自动化测试,我看到Selenium有一个IPhoneDriver,但这也不是无头测试,因为它需要实际的iOS模拟器。

有没有办法在移动网站上进行无头测试?更改用户代理是否足够?我看到了一些关于更改用户代理的帖子,似乎有自己的挑战,例如在Selenium RC中设置用户代理

非常感谢!


1
你有没有考虑使用PhantomJS或“无头Chrome”呢? - djangofan
6个回答

70

好的,我会尝试详细解释其中的差异。

谈到并行测试时,最好使用Selenium Grid。 Selenium RC和Selenium Grid的基本概念。 traditional selenium setup selenium grid setup selenium grid:Requesting a Specific Environment 你可以在这里了解更多细节。

关于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-WebDriver,你可能需要或不需要Selenium Server。如果你只使用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 Driver 这是目前最快速和最轻量级的WebDriver实现。顾名思义,它基于HtmlUnit。HtmlUnit是一个没有GUI的WebBrowser的Java实现。对于任何语言绑定(除了java之外),都需要Selenium Server才能使用此驱动程序。

优点

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

缺点

  • 仿真其他浏览器的JavaScript行为(见下文)
JavaScript在HtmlUnit驱动程序中的应用 流行的浏览器都没有使用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的setUp,请参见this

HtmlUnit文档中得知: HtmlUnit不是通用的单元测试框架。它是一种专门用于模拟浏览器进行测试的方式,旨在在其他测试框架(如JUnit或TestNG)中使用。 因此总结Selenium和HtmlUnit的区别HtmlUnit是一个基于Java实现的WebBrowser,没有GUI界面,可以模拟浏览器进行测试,而Selenium-WebDriver通过调用每个浏览器本地支持的自动化功能来直接调用浏览器。我们可以看到,HtmlUnit提供了API无需GUI界面进行自动化,而WebDriver则提供了内置浏览器进行自动化的可能性。
谈到移动自动化, Selenium也有iPhone Driver iPhone Driver wiki article 和Android Driver Android Driver wiki article 另请参阅this presentation 很遗憾,我无法提供有关移动驱动程序的工作经验评估,因为我处理的是Web自动化(不涉及移动设备)。此外,了解到Cucumber(自动化工具)在移动自动化领域非常流行。请参见thisthis。希望现在对您来说更加清晰了 =)

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

3

Selenium和HTMLUnit在概念上有些相似,但Selenium更为成熟/稳定,且具备更多功能。

请注意,Selenium包括Firefox的录制(IDE)插件,允许您录制测试,并且RC/WebDriver自动化框架基本上驱动浏览器。两者可以一起使用,使测试创建非常容易。

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


2

当您在 Jenkins 上夜间运行测试时,通常无法访问窗口系统(例如 X11 或 Windows)以运行 Web 浏览器。因此,在这种情况下,使用 HTMLUnit Web 驱动程序可以带来好处,因为它不需要访问窗口系统。


2
你可以使用Xvbf在Jenkins中运行任何GUI浏览器。 - ALex_hha
Selenium太依赖系统了,所以我投票支持HTMLUnit。 - dalmate

1
在我的经验中,HtmlUnit在浏览自动化方面表现良好,但在处理Javascript时可能会有些错误。实际上,我遇到了一个情况,无法使用HtmlUnit自动下载图像,不得不转向Selenium,它的表现超出了我的预期。这个案例实际上在SO thread中注册了。

1
我使用 Selenium WebDriver 进行自动化。有一种非常简单的方法可以使浏览器无头化。只需应用 ChromeOptions 即可(在我的情况下,其他 DriverOptions 也可用)ChromeOptions("Headless")
使用 Options 或 Services 可以得到许多熟练的方法,例如这个例子,它将阻止 Driver/CommandPrompt 窗口“出现”,因此它将保持“静默”和未暴露状态。ChromeDriverServices ("Silent")

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接