Селен запускается как служба Windows, чтобы делать скриншоты при ошибках
Я хотел бы, чтобы набор автоматических веб-тестов на основе Selenium RC делал скриншоты страниц при возникновении некоторых ошибок. Набор тестов является частью процесса непрерывной интеграции и технически выполняется CruiseControl, работающим как служба Windows.
Метод selenium.captureScreenshot()
вызывается для запуска фактического снимка экрана. Я зарегистрировал JUnit RunListener
, чтобы вызвать его при любой ошибке теста.
Проблема заключается в том, что скриншоты - это просто пустые файлы. PNG файлы полностью черные. Размеры - 1440x900.
При ручном запуске тех же тестов из Eclipse скриншоты в порядке (хотя это скриншоты всего рабочего стола, а не окна браузера, но это другая история и незначительная проблема). Поэтому я предполагаю, что причиной проблемы является Selenium, выполняемый как служба Windows.
Как я могу получить скриншоты страниц, когда случаются исключения в тестах Selenium?
Используемое программное обеспечение:
- Сервер Windows 2003
- Selenium 1.0.1
Ответы
Ответ 1
Похоже, есть совершенно другой ответ. Служба 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.
Ответ 2
В каком браузере вы выполняете эти тесты? Если это Firefox, я бы рекомендовал captureEntirePageScreenshot для захвата всего холста - не только для просмотра (а не для экрана) и captureEntirePageScreenshotToString, если вы работаете удаленно и хотите локально сохранять файлы.
Не уверен, что это поможет с вашей проблемой, но поскольку она использует надстройку для Firefox, возможно, стоит попробовать.
Ответ 3
Читая немного больше об этом, это может быть связано с вашей службой Windows, требующей дополнительных прав доступа. Возвращаясь к услугам Windows NT 3.5/4, ограниченный доступ к рабочему столу приложения (требуется для скриншотов), и я бы предположил, что их ограничения безопасности продолжаются и по сей день.
Этот поток о сервисах на форумах java.net может предоставить ключи, необходимые для его работы.
Ответ 4
Я столкнулся с проблемой, когда CaptureScreenshot генерирует черные изображения при работе под управлением Windows.
Использование CaptureEntirePageScreenshot, как рекомендовал Дейв Хант, работает последовательно для меня.
Ответ 5
Вот какой код для взятия фото с использованием 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);
}
Из этого следует сайт
Ответ 6
Я не знаю, как круиз-контроль будет выполнять тесты GUI, но я недавно реализовал механизм скриншота, и я узнал, что компоненты, которые вы рисуете , должны находиться в окне или другой корневой элемент. Элементы "некорневые" будут просто неправильно рисоваться и в большинстве случаев будут иметь черные изображения.
Итак, если круиз-контроль или ваши юнит-тесты используют некоторую магию для неправильного отображения элементов gui, вы можете добавить их в фиктивный JFrame перед рисованием.
Ответ 7
Альтернативное решение для вашего подхода RunListener:
Приложите свой тест в блок try-catch и сделайте скриншот в блоке catch, что я всегда делаю.
Пример Java-кода:
public void testEnterFormFields()
try {
enterFormFields();
} catch(SeleniumException e) {
//do screenshot, logging, dumping, stacktracing or whatever here
}
}
Вы также можете поймать Throwable или Exception, если это позволяют правила кодирования, но имеет смысл поймать конкретное исключение по одному. Этот подход создает немного более беспорядок в вашем коде, но он поможет вам в случае анализа сбоев. Вы можете настроить обработку исключений на тип ошибки. Возможно, вы захотите захватить другую информацию в случае AssertionError, чем в случае исключения SeleniumException.