Как работает implicitly_wait в selenium
Всем привет!
Читаю документацию и не могу понять, как работает implicitly_wait. Ну и плюс не совсем понимаю как работает последовательность запуска действий в Selenium.
Вопрос 1: если не ставить искусственные задержки, то webdriver будет запускать все процессы non-stop и все развалится(например не ставить задержку после создания драйвера driver = webdriver.Firefox() )?
Вопрос 2: как именно работает строка driver.implicitly_wait(10) , чего она ожидает и сколько? В документации написано, что опрашивает DOM и ждет какой-то элемент? Какой именно?
Ответы (1 шт):
Команда 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.