TestNG тесты с указанными свойствами (timeOut = *any_time*) + selenide

java
testng
webdriver
selenide
Теги: #<Tag:0x00007fedc4675138> #<Tag:0x00007fedc4674ff8> #<Tag:0x00007fedc4674c88> #<Tag:0x00007fedc46748a0>

(Дмитрий Гордиенко) #1

Всем доброго времени суток!

Столкнулся со следующей проблемой при совместном использовании #selenide / #testng :

В методе аннотированом @BeforeClass создается объект вебдрайвера, который дальше используется всеми тестами. Вебдрайвер передается в selenide с помощью WebDriverRunner.setWebDriver().
Как только для тестовых методов к аннотации @Test добавляется параметр (timeOut = 60000) - selenide “утверждает” что "INFO: No webdriver is bound to current thread: 19 - let's create new webdriver".

Предполагаю, что с добавлением таймаута каждый тест ранится в своем потоке в то время как драйвер был создан в другом потоке.

Подскажите, как правильно засетить драйвер с учетом id потока? Или как корректо нужно использовать один вебдрайвер на все тесты?


(Dmitrii Demin) #2

TestNG при наличие timeout запускает тест в отдельном потоке. Selenid же хранит экземпляры в ThreadLocal. В итоге новый поток с тестом просто не находит уже созданный ранее WebDriver


(Дмитрий Гордиенко) #3

Попробовал:

  1. На уровне кастомного листнера (implements ITestListener) в методе onTestStart “закидывать” текущий вебдрайвер в WebDriverRunner (selenide) - не взлетело, т.к. id потоков (теста и листнера) таки разные при использовании timeOut.

  2. В самом тесте впилил принудительный сет созданного вебдрайвера в WebDriverRunner - взлетело.

Так и надо или есть красивое решение?


(asolntsev) #4

Всё верно, TestNG pапускает тесты и @BeforeClass в разных потоках.
В TestNG ещё много чего через ж… сделано. :frowning:

Есть просто и правильное решение: не используйте метод WebDriverRunner.setWebDriver().
Зачем он вам вообще нужен? Почему не подходит стандартный селенидовский вебдрайвер? Селенид сам создаст и закроет вебдрайвер в нужные моменты, вам не нужно об этом беспокоиться.

P.S. Если же очень хочется использовать именно свой вебдрайвер, реализуйте интерфейс WebDriverProvider. Селенид вызовет его в нужные моменты в правильных потоках.