c# - 使用 selenium、Nunit、Selenium Grid、C#、webdriver/remote control 的自动浏览器测试

标签 c# selenium automated-tests webdriver selenium-grid

几周来,我一直在研究如何使用各种不同的方法来自动化浏览器测试。 Seleniums 网站对于最佳选择路径非常模糊。

我已经安装了

  1. Selenium Webdriver
  2. 远程控制
  3. Selenium 网格
  4. Apache Ant
  5. 单位 (以及执行此操作可能需要的几乎所有其他内容)

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

我希望能够

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

我了解 C# 编程,并且更愿意通过 Nunit 运行我的测试。

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

最佳答案

我已经使用 junit 和 Selenium WebDriver 构建了一个测试框架,可以满足您的每一个要点。虽然这并不完全符合您的要求,但我认为无论如何它都可能对您有所帮助。

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

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

  • 使用 IE7 和 FireFox 的 Windows
  • 使用 IE8 和 FireFox 的 Windows
  • 使用 IE9 和 Firefox 的 Windows
  • 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 测试都使用我放在一起的共享线程库,它创建了单独线程中所需的所有必要的 RemoteWebDriver。这些线程中的每一个都在其节点上同时运行,而父线程则等待所有线程终止。然后进行下一个测试,该测试也是多线程运行的。

我遇到了几个问题,例如在所有子线程中检索 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 开发人员都会感到高兴。

关于c# - 使用 selenium、Nunit、Selenium Grid、C#、webdriver/remote control 的自动浏览器测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759157/

相关文章:

c# - 生成的 WCF 代理配置使用服务器的本地名称

java - WebElement#getScreenShotAs(OutputType.File)不工作

python - 机器人框架扩展 Selenium 来处理加载元素

python selenium send_key() 不起作用

node.js - 移动设备上的自动化测试执行

.net - 如何对与 VS DOM 交互的 Visual Studio 插件进行单元测试

jMeter .jmx 到对应的 java 代码

c# - 如何在目标线程上运行事件处理程序

c# - ISupportIncrementalLoading 从下到上

c# - ObservableCollection<T>.Add 是如何工作的?