我正在通宵运行 Selenium 测试(使用 Java 和 WebDriver),并且想在其中一个测试用例失败时截取屏幕截图。如果我使用机器人的 createScreenCapture()
方法,它仅在监视器打开时才有效,如果我使用 Selenium 的 getScreenshotAs()
方法,它不会捕获任何弹出窗口或窗口顶部的任何内容(通常包含问题的原因)。 getScreenshotAs()
方法在 pc 锁定时有效,这就是我当前使用的方法。如果重要的话,我的机器运行 Windows 7。
我改编了这段代码(在这个网站上找到)并且目前正在使用它:
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy somewhere
FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));
这是我以前用过的,但如果电脑被锁定,它只会捕获底部任务栏的灰色屏幕,但如果我已登录,它会很好用并捕获所有内容。问题是我需要在一夜之间锁定我的计算机,也就是这段代码需要运行的时候:
Robot robot = new Robot();
// Get size of screen
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
// Capture the screen
BufferedImage screenFullImage = robot.createScreenCapture(screenRect);
// Save the screen to to disk
ImageIO.write(screenFullImage, "jpg", new File(fileName));
我在这里发现了其他一些提出类似问题的帖子,但它们都很陈旧,与我的问题不太相符,所以我想知道在这种情况下是否有可能的解决方案?
编辑: 当我使用机器人代码时,这些就是结果。我尝试同时使用 Chrome 作为浏览器 (ChromeDriver) 和 Firefox (FirefoxDriver)。
如果我在一个类中单独运行机器人版本的屏幕捕获,只是一个每 5 秒捕获一次屏幕的循环(运行方式 > Java 应用程序),即使在计算机锁定的情况下它也能正常工作,但是当当测试失败时,我让 Selenium 运行相同的代码(它的运行方式 > JUnit 测试),如果电脑被锁定,它会提供上面的屏幕截图。我什至尝试让 Selenium 代码在执行 Thread.sleep()
时生成一个新线程来截取屏幕截图,但是一旦 pc 被锁定就得到了相同的结果。
最佳答案
On a personal desktop, locking screen should not be an issue in capturing screen using AWT Robot.
您可以使用脚本 ScreenCapture.java 对其进行测试
- 将 java 文件下载到文件夹中。
- 在下载文件所在的文件夹中打开cmd
javac ScreenCapture.java
java 截屏
您应该会看到在文件夹中循环捕获的屏幕截图。锁屏,等待5秒后解锁,查看截图
In case of a virtual machine or a remote computer which is accessed via RDP, locking can result in black screenshots.
当用户正常访问桌面时(没有 RDP,如笔记本电脑或个人计算机),用户 session 设置为控制台。您可以使用以下命令查看它。
c:\Users\*******\Desktop>query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>********* console 1 Active none 12/18/2018 5:50 PM
您可以看到用户已连接到 session 控制台
。在这种模式下,捕获屏幕截图效果很好。
但是如果您使用 RDP 访问桌面,您会看到以下结果。
c:\Users\*******\Desktop>FOR /L %N IN () DO (query user
timeout 2)
// When the screen is locked (RDP closed)
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>********* 1 Disc . 8/21/2018 12:25 PM
// When RDP session is active
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>********* rdp-tcp#0 1 Active none 8/21/2018 12:25 PM
您可以看到,当 RDP session 断开连接时,没有 Activity session 。这导致空白屏幕截图
Solution
当 RDP 关闭时,您必须使用以下命令激活 console
session 。这可以通过设置计划任务来完成。
创建一个包含以下内容的批处理文件。
Tscon 1 /dest:console /v
- 通过打开
Run
并键入taskschd.msc
打开任务计划程序 - 在
操作菜单
中,点击创建任务
- 给任务起个名字
- 选择
无论用户是否登录都运行
复选框 - 在
Triggers
选项卡中,点击New
按钮 - 选择
On disconnect from user session
并点击OK
- 在
Actions
选项卡中,单击New
按钮 - 操作
启动程序
并指向批处理文件的位置并单击确定
- 点击
OK
创建任务
关于java - 是否可以在计算机锁定时以编程方式截取屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53842821/