Java Selenium作为Windows服务运行,以截图显示错误

Java Selenium作为Windows服务运行,以截图显示错误,java,windows,continuous-integration,selenium,Java,Windows,Continuous Integration,Selenium,我想要一个基于Selenium RC的自动化web测试套件,以便在遇到一些错误时对页面进行截图。测试套件是持续集成过程的一部分,技术上由CruiseControl作为Windows服务执行 调用selenium.captureScreenshot()方法来触发实际的屏幕截图。我已经注册了一个JUnitRunListener,以便在任何测试失败时调用它 问题是屏幕截图只是空白文件-PNG文件完全是黑色的。尺寸为1440x900 当从Eclipse手动运行相同的测试时,屏幕截图是正常的(尽管它们是整

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

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

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

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

当Selenium测试中发生异常时,如何获取页面的屏幕截图

使用的软件:

  • Windows 2003服务器
  • 硒1.0.1

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

这篇文章摘自此

阅读更多关于此的内容,可能与您的windows服务需要额外的安全权限有关。回到WindowsNT3.5/4,服务必须安装到应用程序桌面(截图所需),我猜他们的安全限制一直持续到今天


此关于的线程可能会提供使其工作所需的线索。

您在哪个浏览器中运行这些测试?如果是Firefox,我建议使用CaptureEntityRepageScreenshot来捕获整个画布,而不仅仅是视图(而不是屏幕)中的内容,如果您远程工作并希望在本地保存文件,则建议使用CaptureEntityRepageScreenshot


不确定它是否有助于解决您的问题,但由于它使用Firefox的附加组件,可能值得一试。

我在windows服务下运行时遇到CaptureScreenshot生成黑色图像的问题


使用Dave Hunt推荐的CaptureEnterpageScreenshot对我来说一直有效。

看起来有一个完全不同的答案。Windows服务(由管理)是在
wrapper.ntservice.interactive
设置为
false
的情况下启动的。将其设置为
true
有帮助。最终,屏幕截图包含真实的屏幕内容


有关详细信息,请参阅。对包装器代码的分析导致[
服务\u交互\u过程
](启动Windows服务时设置标志。

我不知道巡航控制将如何执行GUI测试,但我最近自己实现了一个屏幕截图机制,我了解到,您正在绘制的组件必须位于窗口或其他根元素中。“无根”元素将无法正确绘制,大多数情况下会生成黑色图像


因此,如果cruise control或您的单元测试使用了一些魔法,无法正确显示gui元素,您可能希望在绘制之前将它们添加到虚拟JFrame中。

RunListener方法的替代解决方案:

将测试放在try-catch块中,并在catch块中进行屏幕截图,这是我经常做的

示例java代码:

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

如果您的编码规则允许,您也可以捕获可丢弃或异常,但逐个捕获特定的异常是有意义的。这种方法会在代码中产生更多的混乱,但在失败分析时会对您有很大帮助。您可以根据错误类型调整异常处理。您可能希望捕获其他异常与SeleniumException相比,AssertionError中的信息是错误的。

谢谢。我会试试这个。但我怀疑它是否有帮助。我以前看过这个网站。事实上,Selenium对“CaptureShreenshot”命令的实现似乎使用了完全相同的技术:@GrzegorzOledzki-我怀疑Selenium可能正在使用相同的方法。请让我们知道它是否有效并祝我们好运。确认。行为完全相同。机器人生成一个完全空白(黑色)图像大小完全相同。因此,没有任何进展…我试图与其他Selenium人员进行一些检查,但他们没有遇到问题。如果没有其他方法,联系Selenium并记录错误可能有助于解决问题。黑暗中的疯狂刺杀…屏幕保护程序是否会影响屏幕截图?如果禁用(空白)选项,该怎么办完全屏幕保护程序?java.net链接似乎建议使用VNC连接到localhost。我认为这是最后的手段。如果需要远程调用,那么没有什么可以阻止我们在具有适当Xserver支持的Linux机器上调用selenium服务器。但这会使构建基础结构复杂很多,我希望可以避免。Fir使用了efox。我不确定是哪个版本,我必须检查它。无论如何,谢谢你的提示-我会检查它。嗯……我正要写下这个建议有效。因为它给出了一到两次正确的屏幕截图。但是有些东西又坏了,现在我又得到了空白文件。现在尺寸不同了-有时是978x36,有时是978x36有时是978x232(取决于调用的实际测试),但仍然是100%黑色PNG。啊。我以为它已经解决了。我看过一两次黑色PNG,但大多数时候它对我来说都很好。虽然我不是作为服务运行的……希望你能找到一些有用的东西。不幸的是,我只看过CaptureRepageScreenshot()拍摄的一次非黑色屏幕截图。只是在切换之后(而不是CaptureShreenshot())。但从那时起,它就不起作用了。它如何解决空白屏幕截图的问题?这样,在退出测试方法之前->在报告任何错误和调用将删除的拆卸方法之前截图