Механизм управления web driver-ами (создание, закрытие, завершение работы подвисшых)

Доброго времени суток, форумчане!

Нужна консультация (совет) опытных коллег по следующему вопросу:
Иммеется самописный фреймворчик (на основе junit + selenide +allure + всякая мелочь), в котором в той или иной форме реализован подход Page Object.
Суть в том, что управление веб драйвером, а именно его создание/закрытие, создание дополнительного (если требуется) ложится на пользователя. Основным минусом является выполнение веб драйвера в том же потоке что и тесты, т.е. повис вебдрайвер - и все… прибить его некому, а если ставить timeout в junit то при попытке обратиться к веб драйверу все виснет.

В общем глобальная идея такая: написать механизм, который будет контролировать (создавать (идельно в новом потоке), закрывать, прибивать) все веб драйвера, даже если их буд несколько, безопасно и удобно для пользователей-тестеровщиков.

Подскажите, плз, куда смотреть, что почитать и вообще надо ли такой механизм или все уже давно готово, а я пытаюсь изобрести велосипед?
З.Ы. С сусиком немного знаком, но от него пришлось уйти.

Чем именно вас не устраивает в механизме создания драйверов в selenide? Что именно и когда у вас виснет? Давайте больше конкретики

1 лайк

Причиной всему стал конкретный случай:

Для тестирования сайта была необходимость заходить на другой (сторонний) сайт и потом сверять данные. На стороннем сайте из-за непонятных причин (не регулярно!) подвисал фаер фокс. Причем подвисал так, что любое обращение к обьекту WebDriver (даже самое елементарное - driver.getCurrenUrl()) приводило к зависанию теста. “Коматоз” фаерфокса снимался только через диспетчер задач.
На тот момент был найден выход - для сбора данных со стороннего сайта в новом потоке создавался новый вебдрайвер, который шел и выполнял указанный набор действий. Основной же поток, в котором выполняются тесты, просто ждал пока флаг, разрешающий забрать данные, собранне вторым ФФ, будет установлен в “тру”. Если етого не происходило через определенное время, то основной поток просто убивал “дочерний”, а вмести с ним и подвисшый ФФ.

Для избежания таких ситуаций в будущем, появилась идея создания универсального механизма, который бы обезопасил тесты от зависания браузера (фф, хром…).

А не существует возможности дёргать нужные вам данные через некий АПИ/get запросом банальным? ИМХО, создаёте проблему лишнюю. Вообще, отклоняясь немного от темы, окольными путями добывать тестовые данные - плохая практика

1 лайк

Привет!
Вообще-то одна из задач Selenide как раз в том и состоит, чтобы взять на себя заботу о браузере: вовремя открыть, вовремя закрыть. Если чего-то в Selenide не хватает, говорите - давайте дополним.
Кстати, в Selenide есть даже механизм борьбы с зависанием браузера - правда, он пока в “бета”-статусе, т.к. до конца не отлажен.

P.S. Присоединяюсь к @furiousduck: окольными путями добывать тестовые данные - плохая практика. Ваш тест должен сам подготавливать все необходимые данные.

1 лайк

Спасибо всем за советы.
Но никаких окольных путей, в плане добычи данных, нет. Я б с удовольствием дерагал бы койнить апи, но увы, данные нужны с “морды” стороннего сайта. Заход на сторонний сайт и получение данных - ето как раз и есть один из етапов сбора тестом данных, которые потом сравниваются.

Возвращаясь к механизму работы с драйвером, а есть более детальная информация про ету функцию Selenide? Где можно про нее прочитать и когда ее ожидать?

Всё равно не соглашусь с вами. Выходит, вы фактически тестируете нечто в боевых условиях, а лишние зависимости в тесте (а вдруг упал тот сайт, с которого вы тянете данные), увеличивают вероятность ложных падений. Совсем по-бразильски можно сделать какой-то эталонный набор данных (один раз посмотреть, что вы получаете с этого сайта) и на него в тестах опираться, а в своём приложении уже на худой конец похачить что-нить, чтобы данные эти подсунуть куда нужно.
Но если вы уж действительно тестируете продакшен - то это отдельная благодатная тема для дискусси :smile:

Его можно запустить вот так:

WebDriverRunner.webdriverContainer = new WebDriverThreadLocalContainerWithTimeouts();

Он тогда выполняет открытие и закрытие браузера в отдельном потоке с таймаутом. Правда, вот некоторые пользователи стали жаловаться, что у них браузер перестал закрываться. А у нас работало. В общем, отключили пока до лучших времён. :frowning:

2 лайка

Кстати создание интерфейса для двух реализаций, позволило мне написать свою )) интерфейс был не очень удобен, но мне с кое какими хаками удалось написать то что мне подходит ))

Так поделись. Если она может быть полезна и другим, давай включим её в селенид?

3 лайка

Отошлю класс как только допишу механизм закрытия драйвера, он еще немного сыроват :slight_smile:

1 лайк