Как работает implicitly_wait в selenium

Всем привет!

Читаю документацию и не могу понять, как работает implicitly_wait. Ну и плюс не совсем понимаю как работает последовательность запуска действий в Selenium.

Вопрос 1: если не ставить искусственные задержки, то webdriver будет запускать все процессы non-stop и все развалится(например не ставить задержку после создания драйвера driver = webdriver.Firefox() )?

Вопрос 2: как именно работает строка driver.implicitly_wait(10) , чего она ожидает и сколько? В документации написано, что опрашивает DOM и ждет какой-то элемент? Какой именно?


Ответы (1 шт):

Автор решения: Roman Konoval

Команда driver.implicitly_wait(10) сама по себе ничего не ждет. Она конфигурирует драйвер, включая неявное ожидание при операция поиска элементов.

Вот что говорит документация:

An implicit wait tells WebDriver to poll the DOM for a certain amount of time when trying to find any element (or elements) not immediately available.

Поясню на примере:

driver = webdriver.Firefox()
# driver.implicitly_wait(10)
driver.get("http://someurl")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

После того, как выполнится команда driver.get(...) браузер начнет загрузку страницы, потом распарcит html, создаст DOM дерево, отрендерит страницу, и запустит javascript, если он используется и т.д. Но сама программа на питоне, которая инициировала этот процесс, продолжит исполняться.

Т.е. не дожидаясь ни запроса, ни рендеринга программа будет выполнять следующую строку. А это значит, что с настройками по умолчанию, пробуя выполнить find_element_by_id, она скорее всего его не найдет (так как страница попросту еще не успеет загрузится или успеет, но браузер не успеет создать DOM дерево), и функция find_element_by_id просто бросит исключение - элемент не найден.

Если же сконфигурировать неявное ожидание с помощью implicilty_wait (раскомментировать строку), то функция find_element_by_id будет ждать до 10 секунд, если элемент не найдет и только после этого, если элемента все еще нет, бросит исключение.

Это касается не только find_element_by_id, но и всего семейства функций поиска find_*, на все время пока драйвер не закрыть или не изменить его настройки новым вызовом implicitly_wait.

→ Ссылка