Selenium запускается как служба Windows, чтобы делать скриншоты ошибок - PullRequest
12 голосов
/ 11 августа 2009

Мне бы хотелось, чтобы пакет автоматизированных веб-тестов на базе Selenium RC делал скриншоты страниц при возникновении некоторых ошибок. Набор тестов является частью процесса непрерывной интеграции и технически выполняется CruiseControl в качестве службы Windows .

Метод selenium.captureScreenshot() вызывается для запуска фактического снимка экрана. Я зарегистрировал JUnit RunListener для вызова при любом сбое теста.

Проблема в том, что на скриншотах просто пустых файлов - PNG-файлы полностью черные. Размеры 1440х900.

При ручном запуске тех же тестов из Eclipse, скриншоты в порядке (хотя это скриншоты всего рабочего стола, а не окна браузера, но это другая история и небольшая проблема) Так что я думаю, что причина проблемы в том, что Selenium запускается как служба Windows.

Как сделать скриншоты страниц, снятых при возникновении исключений в тестах Selenium?

Используемое программное обеспечение:

  • Windows 2003 Server
  • Селен 1.0.1

Ответы [ 7 ]

5 голосов
/ 08 сентября 2009

Похоже, что есть совершенно другой ответ. Служба Windows (управляемая TanukiSoftware Java Service Wrapper ) была запущена с wrapper.ntservice.interactive, установленным на false. Установка true помогла. В конце концов скриншоты содержат реальное содержимое экрана.

Обратитесь к wrapper.ntservice.interactive за подробностями. Анализ кода оболочки приводит к установке флага [SERVICE_INTERACTIVE_PROCESS] (http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx) при запуске службы Windows.

3 голосов
/ 12 августа 2009

В каком браузере вы запускаете эти тесты? Если это Firefox, я бы порекомендовал captureEntirePageScreenshot для захвата всего холста - не только того, что видно (а не экрана), и captureEntirePageScreenshotToString, если вы работаете удаленно и хотите сохранить файлы локально.

Не уверен, поможет ли это в вашей проблеме, но поскольку он использует дополнение к Firefox, возможно, стоит попробовать.

2 голосов
/ 11 августа 2009

Читая немного больше об этом, это может быть связано с вашей службой Windows, требующей дополнительных разрешений безопасности. Возвращаясь к службам Windows NT 3.5 / 4, имел ограниченный доступ к рабочему столу приложения (необходим для скриншотов), и я предполагаю, что их ограничения безопасности сохраняются и по сей день.

Эта ветка о сервисах на форумах java.net может дать подсказки, необходимые для ее работы.

1 голос
/ 03 сентября 2009

Я столкнулся с проблемой с CaptureScreenshot, генерирующим чёрные изображения при работе под управлением Windows.

Использование CaptureEntirePageScreenshot в соответствии с рекомендациями Дэйва Ханта постоянно работает для меня.

0 голосов
/ 23 октября 2009

Альтернативное решение для вашего подхода RunListener:

Поместите свой тест в блок try-catch и сделайте скриншот в блоке catch, это то, что я всегда делаю.

Пример кода Java:

public void testEnterFormFields()
  try {
    enterFormFields();
  } catch(SeleniumException e) {
    //do screenshot, logging, dumping, stacktracing or whatever here
  }
}

Вы также можете поймать Throwable или Exception, если ваши правила кодирования позволяют это, но имеет смысл перехватывать конкретное Exception по одному. Этот подход создает немного больше помех в вашем коде, но он очень вам поможет в случае анализа сбоев. Вы можете адаптировать обработку исключений к типу ошибки. Возможно, вы захотите получить другую информацию в случае AssertionError, чем в случае SeleniumException.

0 голосов
/ 08 сентября 2009

Я не знаю, как круиз-контроль будет выполнять тесты GUI, но недавно я сам внедрил механизм скриншотов, и я узнал, что компоненты, которые вы рисуете , должны находиться в окне или в некоторых других другой корневой элемент. «некорневые» элементы просто не будут правильно рисоваться и в большинстве случаев приводят к черным изображениям.

Так что, если круиз-контроль или ваши юнит-тесты используют магию для неправильного отображения элементов графического интерфейса, вы можете добавить их в фиктивный JFrame перед рисованием.

0 голосов
/ 11 августа 2009

Вот код для съемки фотографий с использованием Selenium и класса Java Robot:

public void takeAScreenShotOfTheApp() {
  Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
  Rectangle screenBounds = new Rectangle(0, 0, screenDim.width, screenDim.height);

  Robot robot = new Robot();
  BufferedImage image =  robot.createScreenCapture(screenBounds);

  File screenshotFile = new File("target" + File.separator
                               + "image" + System.currentTimeMillis() + ".png");
  ImageIO.write(image, "png", screenshotFile);
}

взято с этого сайта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...