Всем привет. Использую старый добрый грид. Хаб у меня расположен на вин-сервере, нода - на убунту-сервере (кроме ноды там ничего не запущено). Селениум сервер, хром, драйвер - последние, убунта 16.04.
Проблема - нода падает раз в ± 4 дня (самая распространённая проблема - отсутствие сессий. По убыванию топ ошибок внизу вопроса). Хромдрайвер после тестов убивается стабильно, хромов висящих pgrep процессов не показывает. Собственно нужен вариант для контроля состояния ноды, и соответственно перезагрузки ноды.
В текущий момент реализовано костылём. Как показала практика, в момент падения количество свободной оперативной памяти на сервере снижается до ± 25 процентов, был написан скрипт которой периодично чекает память и перезагружает целиком сервер.
Интернет говорит о недостатке ресурсов, но, у меня очень специфичные тесты, длятся 1-2 секунды, но их довольно много. Т.е. каждую минуту запускается около 20 тестов. Параллельно редко бывает больше 2 сессий и по железу я сильных перегрузок не вижу во время работы.
Пытался прикрутить какой-нибудь юникс-процесс-менеджер, но проблема в том, что когда сессии мертвы, процесс ноды-то живой, а соответственно не совсем понятно на что ссылаться. Можно было бы как условие слать запрос на ноду с пробой получить сессию, но кажется тоже костыльным метод. Возможно у кого-то есть красивые решения.
Распространённые ошибки:
Error forwarding the new session Empty pool of VM for setup Capabilities {browserName: chrome, goog:chromeOptions: {args: [headless, window-size=1200x600, no-sandbox]}}
A exception with a null response was thrown sending an HTTP request to the remote WebDriver server for URL http://localhost:11298/wd/hub/session. The status of the exception was KeepAliveFailure, and the message was: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server.
Session [**] was terminated due to PROXY_REREGISTRATION
@ordeh да, я знаю, что такое селеноид. Но в целесообразности его использования надо ещё убедить заказчика. С учётом специфики моих тестов (тесты длительностью 1-2 секунды, но ранаются каждые 3-4 секунд) будет ли это полезным ? Только контейнер с хромом будет подниматься несколько секунд. Я так понимаю есть вариант ранать контейнер не для каждого теста, а для “пачек”, возможно в этом случае будет обоснованно.
@NikS ноду в докер-контейнере всё-равно прийдётся как-то контроллировать. Вопрос - как ?
Ноду не надо контролить, убиваете контейнер и все, когда надо поднимаете.
Касательно пачки тестов в контейнере, то так и делают, никто не ранит 1-2 теста в отдельной среде.
можно написать сервлет который запускается по своему route и с пом которого грид сообщает о своем каком нибудь health check metric (eсть же com.sun.jna.Library.
if you really like it подтвердите у меня даже гдето был проект готовый…
Как уже было сказано, не надо её контролировать просто пересоздавайте контейнер.
Главными аргументами могут быть:
стабильность тестов за счёт минимизации падения тестов из-за нестабильности окружения
усилия и время для перехода на Селенойд минимальны - в коде будет работать та же ссылка для доступа к браузеру
комьюнити с нормальным тех саппортом (разработчики Селенойд доступны в Телеграм чате и быстро отвечают)
меньше ресурсопотребляемость (проверено на себе)
легкая масштабируемость
Обычно в ноде открытие браузера занимает секунды 3.
Контейнер в Селенойде поднимается при создании сессии браузера и закрывается при закрытии браузера. Т.е. Запуск нескольких тестов в одной браузерной сессии будет означать, что эти тесты будут выполнятся в одном контейнере.