繁体   English   中英

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

[英]Is it possible to programmatically take a screenshot while the computer is locked?

我一夜之间运行Selenium测试(使用Java和WebDriver),并希望在其中一个测试用例失败时截取屏幕截图。 如果我使用Robot的createScreenCapture()方法,它只在显示器打开时才有效,如果我使用Selenium的getScreenshotAs()方法,它不会捕获任何弹出窗口或窗口顶部的任何东西(通常包含原因)问题)。 当pc被锁定时, getScreenshotAs()方法可以正常工作,这就是我目前正在使用的方法。 如果重要的话,我的机器运行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被锁定就得到了相同的结果。

在个人桌面上,使用AWT Robot捕获屏幕时,锁定屏幕不应成为问题。

您可以使用脚本ScreenCapture.java对其进行测试

  • 将java文件下载到文件夹。
  • 在下载文件的文件夹中打开cmd
  • javac ScreenCapture.java
  • java ScreenCapture

你应该看到截图被捕获在文件夹中的循环中。 锁定屏幕,等待5秒钟,然后解锁屏幕并检查屏幕截图

对于通过RDP访问的虚拟机或远程计算机,锁定可能导致黑屏幕截图。

当用户正常访问桌面时(没有笔记本电脑或个人计算机的RDP),用户会话设置为控制台。 您可以使用以下命令查看它。

c:\Users\*******\Desktop>query user
USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>*********              console             1  Active      none   12/18/2018 5:50 PM 

您可以看到用户已连接到会话console 在此模式下,捕获屏幕截图非常有效。

但是,如果您使用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会话断开连接时,没有活动的会话。 这导致空白屏幕截图

当RDP关闭时,您必须使用以下命令激活console会话。 这可以通过设置计划任务来完成。

  1. 使用以下内容创建批处理文件。

     Tscon 1 /dest:console /v 
  2. 通过打开Run并键入taskschd.msc打开任务计划程序
  3. 在“ Action menu ,单击“ Create Task
  4. 为任务命名
  5. 选择Run whether user is logged in or not复选框
  6. 在“ Triggers选项卡中,单击“ New按钮
  7. 选择On disconnect from user session ,然后单击OK
  8. Actions选项卡中,单击New按钮
  9. 操作Start a program并指向批处理文件的位置,然后单击“ OK
  10. 单击“ OK以创建任务

当然,你可以在使用浏览器锁定电脑时截取屏幕截图 -

public static String captureScreen(WebDriver driver, String screenName) throws IOException {
    String dest = null;
    try {
        Screenshot screenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(1000)).takeScreenshot(driver);
        dest = ScreenshotsPath() + "\\" + screenName + ".png";
        ImageIO.write(screenshot.getImage(), "PNG", new File(dest));
    } catch (Exception e) {
        e.printStackTrace(writeException.toFile());
    }
    return dest;
}

我的方法是将目标(图像的路径)作为字符串返回,因为我在报告中使用它们。 我也在使用AShot(),因为我想拍一整页的截图。

谢谢,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM