【问题标题】:Selenium run as a Windows service to take screenshots on errorsSelenium 作为 Windows 服务运行以截取错误截图
【发布时间】:2013-04-14 16:04:05
【问题描述】:

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

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

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

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

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

使用的软件:

  • Windows 2003 服务器
  • 硒 1.0.1

【问题讨论】:

    标签: java windows continuous-integration selenium


    【解决方案1】:

    看起来有一个完全不同的答案。 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) 标志。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 使用火狐。不太清楚是哪个版本,我得检查一下。无论如何,谢谢你的提示 - 我会检查它。
      • 嗯...我正要写这个建议有效。因为它已经给出了一次或两次正确的屏幕截图。但是有些东西又坏了,现在我又不断地得到空白文件。现在尺寸不同了——有时是 978x36,有时是 978x232(取决于调用的实际测试),但仍然是 100% 黑色 PNG。啊。我以为已经解决了。
      • 我见过一两次黑色 PNG,但大多数时候它对我来说都很好。不过,我没有作为服务运行......希望你能找到有用的东西。
      【解决方案3】:

      阅读更多内容,这可能与您的 Windows 服务需要额外的安全权限有关。回到 Windows NT 3.5/4 服务有restricted access 到应用程序桌面(截图需要),我猜他们的安全限制一直持续到今天。

      这个关于services on the java.net forums 的帖子可能会提供你需要让它工作的线索。

      【讨论】:

      • java.net 链接似乎建议使用 VNC 连接到 localhost。我认为这是最后的手段。如果需要远程调用,那么没有什么可以阻止我们在具有适当 Xserver 支持的 Linux 机器上调用 selenium 服务器。但这会使构建基础架构复杂很多,我希望可以避免这种情况。
      【解决方案4】:

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

      使用 Dave Hunt 推荐的 CaptureEntirePageScreenshot 对我来说始终如一。

      【讨论】:

      • 不幸的是。我只见过一次由 captureEntirePageScreenshot() 拍摄的非黑色屏幕截图。就在切换它之后(而不是 captureScreenshot())。但从那以后它就不起作用了。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 谢谢。我会试试这个。但我怀疑它会有所帮助。我以前看过这个网站。实际上,“captureScreenshot”命令的 Selenium 实现似乎使用完全相同的技术:tinyurl.com/Selenium1260106
        • @GrzegorzOledzki - 我怀疑 Selenium 可能会采用相同的方法。请让我们知道它是否有效并祝你好运。
        • 已确认。行为完全相同。机器人生成了一个大小完全相同的完全空白(黑色)图像。所以,没有进展……
        • 我尝试与其他 Selenium 人员进行一些检查,但他们没有遇到问题。如果没有其他方法可以解决此问题,请联系 Selenium 并记录错误可能有助于解决问题。
        • Wild stab-in-the-dark.... 屏幕保护程序会启动并影响屏幕截图吗?如果您完全禁用(空白)屏幕保护程序怎么办?
        【解决方案7】:

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

        将您的测试包含在 try-catch 块中并在 catch 块中进行屏幕截图,这就是我一直在做的事情。

        示例java代码:

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

        如果您的编码规则允许,您也可以捕获 Throwable 或 Exception,但是一个接一个地捕获特定的 Exception 是有意义的。这种方法会在您的代码中产生更多的混乱,但它会在故障分析的情况下为您提供很多帮助。您可以根据错误类型定制异常处理。与 SeleniumException 相比,您可能希望在 AssertionError 的情况下捕获其他信息。

        【讨论】:

        • 如何解决空白截图问题?
        • 这样您在退出测试方法之前截取屏幕截图 -> 在报告任何错误并调用将破坏浏览器实例的拆卸方法之前。
        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2010-11-29
        • 2014-03-15
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多