5

数周以来,我一直在研究如何使用各种不同的方法自动化浏览器测试。Seleniums 网站非常模糊,哪个是最佳途径。

我已经安装

  1. Selenium 网络驱动程序
  2. 遥控
  3. 硒网格
  4. 阿帕奇蚂蚁
  5. Nunit(以及您可能需要执行此操作的几乎所有其他内容)

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

我希望能够

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

我有 C# 编程知识,更愿意通过 Nunit 运行我的测试。

任何人都可以给我方向或指向一个已经有它们的网站吗?谢谢你。

4

4 回答 4

8

我已经使用 junit 和 Selenium WebDriver 建立了一个测试框架,可以满足你的每一个观点。虽然它并不完全符合您的要求,但我觉得无论如何它都可能对您有益。

在多个不同的浏览器上加载相同的网页

使用 Selenium 的网格,设置起来非常简单。使用您要测试的环境设置一些虚拟机。例如,在我们的环境中,我们有一个运行有四个节点(作为虚拟机)的网格,其设置如下

  • 带有 IE7 和 FireFox 的 Windows
  • 带有 IE8 和 FireFox 的 Windows
  • 带有 IE9 和 Firefox 的 Windows
  • 带有火狐的 Linux

请注意,Selenium 建议只允许一个 IE 实例在 Windows 节点上运行。在上述每个节点上,允许在任何给定时间运行指定 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 开发人员都会欣喜若狂。

于 2012-05-25T20:02:43.230 回答
1

至于第二点:您可以让您的持续集成服务器完成这项工作,而不是使用 Grid。在我的公司,我们使用 Jenkins 和所谓的配置矩阵 - 它让您可以在多个 Jenkins 节点上运行相同的作业。

至于第一个,我认为詹金斯在这里也可能会有所帮助。您可以在同一节点上运行多个作业。虽然我从未尝试过,所以我不太确定。这只是一个想法,我不会真正推荐这样的解决方案。您可能还想阅读这篇描述如何使用 Selenium Grid 并行运行测试的博客文章。对于使用 Java 的人,我建议阅读有关使用 TestNG 进行并行测试的内容。

你的第三点有点含糊。你说的快照是什么意思?你想比较什么样的结果?

于 2012-05-25T19:20:05.700 回答
0

Selenium RC 已经过时,webdriver 是更可靠的创建 selenium 测试的方法。我看到上面的回答更多地满足了 java 方面的需求。下面提到的是有关如何使用 C# 和 selenium webdriver 实现此处提出的问题的更多信息

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

在创建启动浏览器的简单脚本执行几个步骤时,请参阅 使用 Nunit 和 C# 创建基本 Selenium Web 驱动程序测试用例

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

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

要在不同的浏览器上拍摄快照,您可以参考链接 Capturing screen screenshots using remote/local webdriver in C#/Selenium webdriver

于 2013-10-09T20:22:36.527 回答
-1

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

您可以将框架包装在您喜欢的任何运行器中。我已经毫无问题地使用了 NUnit 和 MbUnit。

如果您需要自动化方面的帮助,还可以选择支持包。

(披露:我为 Telerik 工作,担任他们的 Test Studio 传道者)

于 2012-05-26T12:59:58.403 回答