Selenium作为Windows服务运行,以捕获错误的屏幕截图

时间:2009-08-11 12:42:48

标签: java windows continuous-integration selenium

我希望基于Selenium RC的自动化网络测试套件能够在遇到某些错误时截取页面的屏幕截图。测试套件是持续集成过程的一部分,技术上由作为 Windows服务运行的CruiseControl执行。

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

问题是截图只是空白文件 - PNG文件全黑。尺寸为1440x900。

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

如果在Selenium测试中发生异常,我如何获取页面截图?

使用的软件:

  • Windows 2003 Server
  • Selenium 1.0.1

7 个答案:

答案 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。