Столкнулся со следующей проблемой при совместном использовании #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 потока? Или как корректо нужно использовать один вебдрайвер на все тесты?
TestNG при наличие timeout запускает тест в отдельном потоке. Selenid же хранит экземпляры в ThreadLocal. В итоге новый поток с тестом просто не находит уже созданный ранее WebDriver
На уровне кастомного листнера (implements ITestListener) в методе onTestStart “закидывать” текущий вебдрайвер в WebDriverRunner (selenide) - не взлетело, т.к. id потоков (теста и листнера) таки разные при использовании timeOut.
В самом тесте впилил принудительный сет созданного вебдрайвера в WebDriverRunner - взлетело.
Всё верно, TestNG pапускает тесты и @BeforeClass в разных потоках.
В TestNG ещё много чего через ж… сделано.
Есть просто и правильное решение: не используйте метод WebDriverRunner.setWebDriver().
Зачем он вам вообще нужен? Почему не подходит стандартный селенидовский вебдрайвер? Селенид сам создаст и закроет вебдрайвер в нужные моменты, вам не нужно об этом беспокоиться.
P.S. Если же очень хочется использовать именно свой вебдрайвер, реализуйте интерфейс WebDriverProvider. Селенид вызовет его в нужные моменты в правильных потоках.