java - 是否可以在计算机锁定时以编程方式截取屏幕截图?

标签 java selenium selenium-webdriver automated-tests

我正在通宵运行 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)。

Chrome : Screenshot Using Google Chrome

火狐: enter image description here

如果我在一个类中单独运行机器人版本的屏幕捕获,只是一个每 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 。这可以通过设置计划任务来完成。

  1. 创建一个包含以下内容的批处理文件。

    Tscon 1 /dest:console /v
    
  2. 通过打开 Run 并键入 taskschd.msc 打开任务计划程序
  3. 操作菜单中,点击创建任务
  4. 给任务起个名字
  5. 选择无论用户是否登录都运行复选框
  6. Triggers 选项卡中,点击 New 按钮
  7. 选择 On disconnect from user session 并点击 OK
  8. Actions 选项卡中,单击 New 按钮
  9. 操作启动程序并指向批处理文件的位置并单击确定
  10. 点击OK创建任务

关于java - 是否可以在计算机锁定时以编程方式截取屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53842821/

相关文章:

java - Java虚拟机是机器依赖的吗?

java - 为什么 "Ꙭ".codePointAt(0)==205 和其他 Java 字符奇怪?

javascript - 选择下拉列表中标记为列表的元素

python - Chrome devmode 突然在 selenium 中打开

c# - 限制 NUnit 项目中的并行线程数

java - LWJGL:渲染天空盒的更有效方法

python - 获取当前页面加载时间设置 Selenium Python

java - org.openqa.selenium.remote.UnreachableBrowserException 如何定义EXE路径?

java - 找不到 taskdef 类 PackageName.ClassName

具有多变量和字符串arrayList的Java正则表达式