Selenium作为Windows服务运行,以对错误进行截图

我想要一个基于Selenium RC的自动化Webtesting套件,当遇到一些错误时,可以对页面进行截图。 testing套件是持续集成过程的一部分,在技术上由作为Windows服务运行的CruiseControl执行。

调用selenium.captureScreenshot()方法来触发实际的屏幕截图。 我已经注册了一个JUnit RunListener来在任何testing失败时调用它。

问题是截图只是空白的文件 – PNG文件全黑。 尺寸是1440×900。

当从Eclipse手动运行相同的testing时,屏幕截图是可以的(虽然它们是整个桌面而不是浏览器窗口的截图,但这是一个不同的故事和一个小问题)。 所以我猜这个问题的原因是Selenium作为Windows服务运行。

如何在Seleniumtesting中发生exception时使用页面截图?

使用的软件:

  • Windows 2003 Server
  • selenium1.0.1

看起来有一个完全不同的答案。 Windows服务(由TanukiSoftware Java服务包装器管理)启动时将wrapper.ntservice.interactive设置为false 。 将其设置为true已经有所帮助。 最终屏幕截图包含真实的屏幕内容。

有关详细信息,请参阅wrapper.ntservice.interactive 。 包装程序代码的分析会导致在启动Windows服务时设置[ SERVICE_INTERACTIVE_PROCESS ]( http://msdn.microsoft.com/en-us/library/ms683502 ( VS.85).aspx)标志。

你在哪些浏览器中运行这些测试? 如果是Firefox,我建议使用captureEntirePageScreenshot捕获整个画布 – 不仅仅是视图(而不是屏幕)和captureEntirePageScreenshotToString,如果您正在远程工作并且想要在本地保存文件。

不知道这是否会帮助你的问题,但是因为它使用Firefox的附加组件,所以值得一试。

多读一点,这可能是你的Windows服务需要额外的安全权限。 回到Windows NT 3.5 / 4服务已经限制了应用程序桌面的访问 (屏幕截图所需),我猜他们的安全限制一直持续到今天。

这个关于java.net论坛上的服务的线程可能会提供你需要的线索。

CaptureScreenshot在Windows服务下运行时生成黑色图像,我遇到了这个问题。

使用Dave Hunt推荐的CaptureEntirePageScreenshot对我来说是一贯的工作。

下面是使用seleniumium和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); } 

它从这个站点被采取

我不知道如何巡航控制将执行GUI测试,但我最近实现了自己的屏幕截图机制,我所学到的是,你正在绘制的组件必须在窗口或其他根元素。 “无根”的元素将不能正确绘画,并在大多数时间导致黑色图像。

因此,如果巡航控制或单元测试正在使用某些魔法来不能正确显示gui元素,则可能需要在绘制之前将它们添加到虚拟JFrame中。

您的Runlistner方法的替代解决方案:

把你的测试放到一个try-catch块中,并在catch块中做这个截图,这就是我总是这样做的。

示例java代码:

 public void testEnterFormFields() try { enterFormFields(); } catch(seleniumiumException e) { //do screenshot, logging, dumping, stacktracing or whatever here } } 

如果您的编码规则允许,您也可以捕获Throwable或Exception,但是逐个捕获特定的异常是有意义的。 这种方法会在代码中产生一些混乱,但在失败分析的情况下,它会帮助你很多。 您可以将您的异常处理定制为错误类型。 您可能想要捕获AssertionError中的其他信息,而不是seleniumiumException。