簡體   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