使用selenium、Nunit、Selenium Grid、C#、webdriver/远程控制实现自动化浏览器测试

5

我已经研究了好几周如何使用各种不同的方法自动化浏览器测试。 Selenium官网模糊不清,不知道哪个是最好的方法。

我安装了:

  1. Selenium WebDriver
  2. 远程控制
  3. Selenium Grid
  4. Apache Ant
  5. Nunit(以及几乎你可以需要的一切)

我最终放弃了自己尝试,想知道最佳方法。

我想要能够:

  1. 在许多不同浏览器上加载相同的网页
  2. 在许多虚拟机上加载相同的网页(我已经设置好了)
  3. 能够对比不同浏览器结果的快照。

我懂得使用C#编程,并希望通过Nunit运行我的测试。

有人能给我指引或者指向一个已经包含这些信息的网站吗? 谢谢。


当你说“1.在许多不同的浏览器上加载相同的网页”时,你是指同时还是顺序地加载? - Adam Sweeney
同时打开多个浏览器加载同一个网页。 - lbrown
你能否考虑转换到MBunit呢?经过一番调查,我得出结论:Nunit并不是最适合并行化的工具。 - Aleh Douhi
4个回答

8
我已经使用JUnit和Selenium WebDriver构建了一个测试框架,满足您提出的所有要求。虽然它不完全符合您的要求,但我认为这对您可能有益。
在多个不同的浏览器上加载相同的网页
使用Selenium的网格,这非常容易设置。设置一些带有您要测试的环境的虚拟机。例如,在我们的环境中,我们运行有四个节点(作为虚拟机)的网格,其设置如下所示:
- Windows上有IE7和FireFox - Windows上有IE8和FireFox - Windows上有IE9和Firefox - Linux上有FireFox
请注意,Selenium建议在Windows节点上只允许运行一个IE实例。在上述每个节点上,指定的IE有一个实例,并且允许在任何给定时间运行五个指定的FF实例。通过配置网格和中心节点,启动测试非常容易。在WebDriver中,使用DesiredCapabilities对象设置所需的环境,然后发送测试并等待结果返回即可。
Platform desiredPlatform;
DesiredCapabilities desiredCapabilities;
desiredPlatform = Platform.LINUX;
desiredCapabilities = DesiredCapabilities.firefox();
desiredCapabilities.setPlatform(desiredPlatform);
desiredCapabilities.setVersion("11");

WebDriver driver = new RemoteWebDriver("http://hubURL", desiredCapabilities);

在一些虚拟机上加载相同的网页(我已经设置好了)
我通过一种非传统的方式解决了这个问题,即强制测试以线程方式运行。每个JUnit测试使用我编写的共享线程库,该库在不同的线程中创建所有必要的RemoteWebDrivers。这些线程都在其节点上同时运行,而父线程则坐等所有线程终止,然后进入下一个测试,该测试也是多线程运行。
我遇到了几个问题,例如如何在所有子线程中检索Junit堆栈跟踪。我通过将Std.err重定向到父线程上的字节流来解决此问题。所有错误都被路由到该流中,然后我将其转换为字符串并在每个测试结束时打印到Std.out中。测试结果生成的html页面包括Std.out,这完美解决了这个问题。
能够比较不同浏览器结果的快照
虽然我已经让它工作了,但在远程抓取屏幕截图时存在一些固有问题。如果IE进程作为服务运行,则会返回黑色屏幕截图。解决方法是仅从命令行运行jar,并保持用户登录,这样屏幕截图就能正确返回。这是浏览器中已知的问题,而且真的没有什么好的解决方法。抓取屏幕截图大致如下。
WebDriver augmentedDriver = new Augmenter().augment(driver);
TakesScreenshot ss = (TakesScreenshot) augmentedDriver;
String base64Screenshot = ss.getScreenshotAs(OutputType.BASE64);
byte[] decodedScreenshot = Base64.decodeBase64(base64Screenshot.getBytes());
FileOutputStream fos = new FileOutputStream(new File(imageName));
fos.write(decodedScreenshot);
fos.close();

这段代码将远程计算机运行的浏览器中截图保存到本地机器上。

实际上,浏览器自动化仍在努力稳定。有许多重要的功能,例如您所询问的功能,在任何框架中都没有得到牢固的实现。不过,随着时间的推移,我相信这种情况会得到改善,到那时,QA开发人员们将会欣喜万分。


我注意到你在其他几个问题上的工作,似乎非常擅长自动化测试。你是否有教程或已经公开发布的代码可以分享? - lbrown

1
关于第二点:您可以让持续集成服务器来完成工作,而不是使用Grid。在我的公司中,我们使用Jenkins和所谓的配置矩阵 - 它可以让您在多个Jenkins节点上运行相同的作业。
至于第一点,我认为Jenkins在这里也可能有所帮助。您可以在同一节点上运行多个作业。虽然我从未尝试过,所以我不是完全确定。这只是一个想法,我不会真正推荐这样的解决方案。您还可以阅读this blog post,其中描述了如何使用Selenium Grid并行运行测试的方法。对于使用Java的人,我建议阅读parallel tests with TestNG
您的第三点有点模糊。您所说的快照是什么意思?您想要比较什么样的结果?

0

Selenium RC已经过时,webdriver是创建selenium测试更可靠的方式。我看到上面的回复更多地关注于Java方面。下面提供更多信息,介绍如何使用C#和selenium webdriver来实现这里提出的问题。

关于如何设置IDE(VS Express)、nUnit和selenium,请参考如何在VSExpress上设置C#、nUnit和selenium客户端驱动程序以进行自动化测试

关于创建启动浏览器并执行几个步骤的简单脚本,请参考使用Nunit和C#创建基本的Selenium Web Driver测试用例

关于如何在许多不同的浏览器上加载相同的网页,请参考如何使用selenium和C#调用本地不同类型的浏览器驱动程序

在多个虚拟机上加载同一网页(我已设置)时,您需要使用远程webdriver而不是普通的webdriver。而且,使用远程webdriver,您可以启动不同类型的浏览器。请参考此网页 如何在C#中使用远程webdriver调用/运行不同类型的webdriver浏览器

要在不同的浏览器上进行快照,请参考链接 使用远程/本地webdriver在C#/Selenium webdriver中捕获屏幕截图


-1

您可能还考虑使用免费的Telerik测试框架。这是Telerik商业Test Studio产品的基础。测试框架提供跨浏览器支持,在动态内容情况(AJAX)下表现出色,并且还可以处理操作系统级别的对话框,如文件上传/下载对话框。您还可以在任何时候对浏览器进行快照。

您可以将该框架包装在您喜欢的任何运行程序中。我已经使用了NUnit和MbUnit而没有遇到问题。

如果您需要自动化方面的帮助,还有一个支持包选项。

(声明:我是Telerik的Test Studio布道者)


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