我希望基于Selenium RC的自动化网络测试套件能够在遇到某些错误时截取页面的屏幕截图。测试套件是持续集成过程的一部分,技术上由作为 Windows服务运行的CruiseControl执行。
调用selenium.captureScreenshot()
方法来触发实际屏幕截图。我已经注册了一个JUnit RunListener
,可以在任何测试失败时调用它。
问题是截图只是空白文件 - PNG文件全黑。尺寸为1440x900。
当从Eclipse手动运行相同的测试时,截图是可以的(虽然它们是整个桌面的截图而不是浏览器窗口,但这是一个不同的故事和一个小问题)。所以我猜问题的原因是Selenium作为Windows服务运行。
如果在Selenium测试中发生异常,我如何获取页面截图?
使用的软件:
答案 0 :(得分:5)
看起来有一个完全不同的答案。 Windows服务(由TanukiSoftware Java Service Wrapper管理)是在wrapper.ntservice.interactive
设置为false
的情况下启动的。将其设置为true
有所帮助。最终截图包含真实的屏幕内容。
详情请咨询wrapper.ntservice.interactive
。对包装器代码的分析会导致在启动Windows服务时设置[SERVICE_INTERACTIVE_PROCESS
](http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx)标志。
答案 1 :(得分:3)
您在哪些浏览器中运行这些测试?如果是Firefox,我建议使用captureEntirePageScreenshot捕获整个画布 - 不仅仅是视图中的内容(而不是屏幕)和captureEntirePageScreenshotToString,如果你正在远程工作并希望在本地保存文件。
不确定它是否对您的问题有所帮助,但由于它使用了Firefox的附加组件,因此值得一试。
答案 2 :(得分:2)
阅读更多内容,可能与需要额外安全权限的Windows服务有关。回到Windows NT 3.5 / 4服务有restricted access到应用程序桌面(截图需要),我猜他们的安全限制一直持续到今天。
关于services on the java.net forums的这个主题可能会提供让它运作所需的线索。
答案 3 :(得分:1)
我遇到了CaptureScreenshot在Windows服务下运行时生成黑色图像的问题。
按照Dave Hunt的建议使用CaptureEntirePageScreenshot,我一直在努力。
答案 4 :(得分:0)
以下是使用Selenium和Java Robot类拍摄照片的一些代码:
public void takeAScreenShotOfTheApp() {
Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenBounds = new Rectangle(0, 0, screenDim.width, screenDim.height);
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(screenBounds);
File screenshotFile = new File("target" + File.separator
+ "image" + System.currentTimeMillis() + ".png");
ImageIO.write(image, "png", screenshotFile);
}
取自site
答案 5 :(得分:0)
我不知道巡航控制将如何执行GUI测试,但我最近自己实现了一个屏幕截图机制,我学到的是你正在绘制的组件必须在窗口中或其他一些根元素。 “无根”元素将无法正确绘制,并且大部分时间都会产生黑色图像。
因此,如果巡航控制或你的单元测试使用一些魔法来正确显示gui元素,你可能想在绘画之前将它们添加到虚拟JFrame中。
答案 6 :(得分:-1)
RunListener方法的替代解决方案:
将你的测试包含在try-catch块中并在catch块中进行截图,这就是我一直以来所做的。
示例java代码:
public void testEnterFormFields()
try {
enterFormFields();
} catch(SeleniumException e) {
//do screenshot, logging, dumping, stacktracing or whatever here
}
}
如果您的编码规则允许,您也可以捕获Throwable或Exception,但是逐个捕获特定的Exception是有意义的。这种方法会在代码中产生更多的混乱,但在故障分析的情况下它会对您有所帮助。您可以根据错误类型定制异常处理。您可能希望在AssertionError的情况下捕获其他信息,而不是SeleniumException。