Мониторинг и изящное уничтожение или повторное использование зомби-экземпляров GeckoDriver

Selenium предназначен для уничтожения процесса Geckodriver при удалении экземпляра веб-драйвера следующим образом: driver.quit(). В моей среде тестирования я настроил вызов driver.quit() после каждого теста.

Однако в некоторых случаях тест аварийно завершается по разным причинам, после чего этапы завершения (например, выход из драйвера) не выполняются. В результате я получаю несколько процессов geckodriver, которые я могу убить только вручную.

Есть ли хорошая практика, как обойти эту проблему? Возможно, как-то отслеживать процессы и убивать те, которые не передают никаких данных?

Или, может быть, создать несколько экземпляров, а затем использовать их повторно?

Я запускаю свои тесты в Grid, поэтому управление процессом через командную строку не сработает, так как это повлияет только на концентратор сетки.

ИЗМЕНИТЬ:

Существует возможность использования taskkill для завершения всех процессов geckodriver на машине, но это не очень хорошее решение, поскольку:

  1. Я запускаю свои тесты через Selenium Grid, поэтому это повлияет только на концентратор сетки, а не на узлы.
  2. Есть несколько тестов, которые выполняются одновременно, и если я использую taskkill, я также уничтожу те, которые все еще используются.
  3. Я не думаю, что уничтожение процессов с помощью taskkill в целом является хорошей практикой, я хотел бы найти более элегантное решение. Например. (1) процессы geckodriver отслеживаются на узле и завершаются только локально, когда они не используются или (2) каким-либо образом повторно используются.

person Eugene S    schedule 17.01.2018    source источник
comment
comment
@DebanjanB Да, я видел вопрос и ответ, и это не имеет значения в моей ситуации. Во-первых, я не думаю, что уничтожение процессов с использованием taskkill является хорошей практикой, и, поскольку я запускаю свои тесты через сетку, это повлияет только на концентратор сетки, а не на узлы. Во-вторых, я хотел бы найти более элегантное решение, при котором процессы geckodriver отслеживаются на узле и завершаются только локально, когда они не используются. Другой вариант, как я уже упоминал, как-то повторно использовать эти процессы. Я также добавил это к моему вопросу.   -  person Eugene S    schedule 17.01.2018


Ответы (1)


Я собираюсь обобщить то, что я разместил в ответ на тот же вопрос на Selenium-Пользователи google форум

Когда Driver.quit() вызывается в режиме Grid, вот что происходит:

  • Клиент (JVM, который запускает ваш тестовый метод) отправляет запрос на удаление сеанса в концентратор.
  • Концентратор перенаправляет запрос на удаление сеанса на соответствующий узел.
  • На узле автономный jar-файл selenium переводит запрос на удаление сеанса в вызов DriverCommandExecutor.execute(), который затем перенаправляется на DriverService.stop()

DriverService.stop() внутренне вызывает вызов http://localhost:port/shutdown (верно для ChromeDriver, но для Firefox реализация проверяет доступность порта, на котором был запущен geckodriver).

Однако в некоторых случаях тест аварийно завершается по разным причинам, после чего этапы завершения (например, выход из драйвера) не выполняются. В результате я получаю несколько процессов geckodriver, которые я могу убить только вручную.

Чтобы разобраться с этим, вы можете настроить тайм-ауты на уровне узла.

Цитирование документации

-timeout, -sessionTimeout в секундах: указывает время ожидания, по истечении которого сервер автоматически завершает сеанс, в котором не было активности в течение последних X секунд. После этого тестовый слот будет освобожден для использования в другом тесте. Обычно это используется для устранения сбоев клиента. Для ролей концентратора/узла сетки необходимо также установить cleanUpCycle. По умолчанию: 1800

-browserTimeout в секундах: количество секунд, в течение которых сеанс браузера может зависнуть, пока выполняется команда WebDriver (пример: driver.get(url)). Если время ожидания истекло, пока команда WebDriver все еще обрабатывается, сеанс завершится. Минимальное значение – 60. Неуказанное, нулевое или отрицательное значение означает
ожидание в течение неопределенного времени. По умолчанию: 0

См. здесь и здесь

Когда вы настраиваете тайм-ауты с помощью одного из вышеупомянутых механизмов и когда узел обнаруживает бездействие в окне браузера из-за

  1. из-за сбоя клиента (ваш тестовый пример - клиент) или
  2. из-за того, что браузер перешел в зависшее состояние (возможно, из-за мошеннического javascript) или
  3. из-за вашего тестового случая, открывая окно браузера и ничего не делая в нем,

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

person Krishnan Mahadevan    schedule 18.01.2018
comment
Большое спасибо за подробный ответ и понимание! Очень признателен. - person Eugene S; 18.01.2018