我已经使用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开发人员们将会欣喜万分。