Подтвердить что ты не робот

Селен запускается как служба Windows, чтобы делать скриншоты при ошибках

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

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

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

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

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

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

  • Сервер Windows 2003
  • Selenium 1.0.1
4b9b3361

Ответ 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.