Можно ли программно сделать снимок экрана, пока компьютер заблокирован? - PullRequest
0 голосов
/ 19 декабря 2018

Я провожу тестирование Selenium в одночасье (с использованием Java и WebDriver) и хотел бы сделать снимок экрана, когда один из тестовых случаев дает сбой.Если я использую метод createScreenCapture() робота, он работает только при включенном мониторе, а если я использую метод getScreenshotAs() Selenium, он не захватывает всплывающие окна или что-либо, что находится в верхней части окна (и часто содержит причину).проблемы).Метод 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).

Chrome: Screenshot Using Google Chrome

Firefox: enter image description here

Если я запускаю версию захвата экрана для робота в одном классе, просто цикл, который захватывает экран каждые 5 секунд (Запуск от имени>Java-приложение), оно прекрасно работает даже при заблокированном компьютере, но когда у меня Selenium запускает тот же код (его Run As> JUnit Test), когда тест не пройден, он дает скриншоты выше, если компьютер заблокирован.Я даже пытался заставить код Selenium создавать новый поток для создания снимка экрана, пока он делал Thread.sleep(), но получал те же результаты, когда компьютер был заблокирован.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Конечно, вы можете делать снимки экрана, когда компьютер заблокирован с помощью браузера -

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 (), потому что хочу сделать снимок экрана полной страницы.

Спасибо,

0 голосов
/ 19 декабря 2018

На персональном рабочем столе блокировка экрана не должна быть проблемой при захвате экрана с помощью 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, чтобы создать задачу
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...