Size: a a a

Selenide на русском

2020 December 20

СР

Саша Росолько... in Selenide на русском
а там сконфигурировать запуск используя browser параметр
источник

СР

Саша Росолько... in Selenide на русском
источник

A

Alex in Selenide на русском
Большое спасибо за помощь. Идею понял. Завтра уже буду пробовать
источник
2020 December 21

AB

Alexei Barantsev 🗹... in Selenide на русском
WebDriverWait и ThreadLocal-переменные

Думаю, многие знают, что WebDriver предоставляет два механизма ожиданий — неявные и явные.

При использовании неявных ожиданий функции поиска элементов (findElement и findElements) не возвращают результат до тех пор, пока не найдутся нужные элементы, либо пока не истечёт установленный таймаут. Это ожидание реализовано на стороне браузера, поэтому WebDriver никак не может его прервать, ему остаётся только ждать либо положительного, либо отрицательного результата поиска.

Явные ожидания реализуются при помощи класса WebDriverWait, в который можно передать некоторую функцию-условие. Эта функция будет периодически вызываться до тех пор, пока либо не вернётся "хороший" результат, либо не истечёт время, в течение которого должно проверяться условие.

А что будет, если использовать оба механизма ожидания одновременно, при этом установить время неявного ожидания, скажем, на 5 минут, а потом использовать явное ожидание условия "findElements возвращает непустой список элементов" и указать в нём время ожидания 1 минута?

Оказывается, неявные ожидания побеждают явные. Так как функция findElement заблокируется на 5 минут, класс WebDriverWait не сможет завершить работу через 1 минуту, он будет честно ждать 5 минут, пока функция findElement не вернёт результат. Потому что WebDriverWait вызывает проверяемое условие в текущем потоке, тем самым блокируя его.

А что если функция-условие вообще заблокируется навсегда и не вернёт никакой результат? Тогда и WebDriverWait тоже зависнет навсегда.

Примерно год назад нам пришёл пулл-реквест, который решал эту проблему:
https://github.com/SeleniumHQ/selenium/pull/7692

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

И всё было бы хорошо, но после выпуска версии 4.0-alpha-5 с этим улучшенным механизмом ожиданий мы получили целую серию баг-репортов, в которых сообщалось, что явные ожидания перестали работать вообще!

Оказывается, многие люди хранят ссылку на драйвер в виде ThreadLocal-переменной, то есть с каждым потоком ассоциируется свой экземпляр драйвера. Это делается якобы для того, чтобы тесты было проще распараллеливать. И если такая ThreadLocal-переменная используется для получения ссылки на драйвер в условии ожидания, а условие проверяется в отдельном потоке — оно не может получить доступ к драйверу!

Вообще-то драйвер передаётся в условие в виде параметра, так что обращаться к ThreadLocal-переменной не нужно вообще. Тот факт, что люди этот параметр игнорируют и вместо этого достают ссылку на драйвер из  ThreadLocal-переменной, оказался для нас сюрпризом. Это же явный признак плохого дизайна тестов именно с точки зрения их распараллеливания!

Но... Спустя несколько месяцев и кучку баг-репортов мы решили это изменение откатить и вернуться к старой блокирующейся реализации. Обратная совместимость важнее.

Возможно, в будущем рядом с классом WebDriverWait появится похожий на него класс WebDriverWaitAsync, который будет проверять условия в отдельном потоке. А пока признаем, что любители ThreadLocal-переменных победили.
источник

AB

Alexei Barantsev 🗹... in Selenide на русском
Andrei ^^^ баг-репорты по этому поводу можно закрывать, и селенид тоже можно не править (хотя лучше бы исправить...)
источник

СР

Саша Росолько... in Selenide на русском
источник

AN

Alex Nemoy in Selenide на русском
а это разве не код selenide ??
источник

СР

Саша Росолько... in Selenide на русском
Нет, это код чистого селениума
источник

AN

Alex Nemoy in Selenide на русском
ок спасибо
источник

AS

Andrei Solntsev in Selenide на русском
Alexei Barantsev 🗹
Andrei ^^^ баг-репорты по этому поводу можно закрывать, и селенид тоже можно не править (хотя лучше бы исправить...)
Так а мы в селениде то подправили. Сейчас все тесты селенида успешно пробегают с этой асинхронной версией Selenium 4.
источник

AB

Alexei Barantsev 🗹... in Selenide на русском
круто! молодцы!
источник

AS

Andrei Solntsev in Selenide на русском
У нас и падало-то всего пара тестов , и то в странной ситуации при переключении фреймов.
источник

AB

Alexei Barantsev 🗹... in Selenide на русском
ну, мы всё равно откатили. потому что не только от вас жалобы поступали
источник

AB

Alexei Barantsev 🗹... in Selenide на русском
а таймауты команд уменьшили, так что длинных зависаний на 3 часа, как раньше было, теперь не должно случаться
источник

AS

Andrei Solntsev in Selenide на русском
Да, такие длинные таймауты - это изначально было странно.
источник

AS

Andrei Solntsev in Selenide на русском
Но вообще изначальная жалоба на то, что кто задал одновременно и implicit wait, и explicit - какой-то детский сад, по-моему. На это вообще не надо реагировать. Задал - сам виноват.
источник

AB

Alexei Barantsev 🗹... in Selenide на русском
вот и мы так решили, что проблемы индейцев — не наше дело :)
источник
2020 December 22

RC

Roman Chelombitko in Selenide на русском
Подскажите пожалуйста как задать Configuration для скачивания файла в определённую директорию?
источник

PB

Petr Borisyonok in Selenide на русском
Roman Chelombitko
Подскажите пожалуйста как задать Configuration для скачивания файла в определённую директорию?
.downloadsFolder
источник

RC

Roman Chelombitko in Selenide на русском
Petr Borisyonok
.downloadsFolder
спасибо
источник