Использование неявного ожидания в селене
Я начинающий. Я понимаю, что в основном делает ожидание, но я смущен тем, как различные учебники в Интернете размещают его и объясняют. Например, в приведенном ниже коде он помещается перед загрузкой URL. Итак, стоит ли ждать загрузки URL-адреса или поиска элемента или того и другого? Верно ли, что если я однажды использую неявное ожидание в своем блоке try, это будет применимо для каждого поиска элемента, который я выполняю в своем коде?
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
3 ответа
ImplicitWait
ImplicitWait
согласно Java Docs нужно указать количество времени, в течение которого экземпляр WebDriver, т. е. драйвер должен ждать при поиске элемента, если он не присутствует непосредственно в HTML DOM с точки зрения NANOSECONDS
, MICROSECONDS
, MILLISECONDS
, SECONDS
, MINUTES
, HOURS
или же DAYS
при попытке найти элемент или элементы, если они не доступны сразу. Значение по умолчанию 0, что означает driver
Когда находит инструкцию, чтобы найти элемент или элементы, поиск начинается, и результаты доступны на немедленной основе.
В этом случае после новой загрузки веб-страницы элемент или элементы могут быть / не могут быть найдены при немедленном поиске. Так что ваши Automation Script
может столкнуться с любым из этих исключений:
NoSuchElementException
TimeoutException
ElementNotVisibleException
ElementNotSelectableException
Поэтому мы вводим ImplicitWait. Вводя ImplicitWait, драйвер будет опрашивать дерево DOM, пока элемент не будет найден в течение настроенного периода времени, ищущего элемент или элементы, прежде чем выдать исключение NoSuchElementException. К тому времени элемент или элементы, которые вы искали, могут быть доступны в HTML DOM. Так как в вашем коде вы уже установили значение ImplicitWait в 10 секунд, драйвер будет опрашивать HTML DOM в течение 10 секунд.
Python:
driver.implicitly_wait(10)
Java:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
DotNet:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Наконец, как только вы установите ImplicitWait
, WebDriver
экземпляр то есть driver
способен нести эту конфигурацию до ее срока службы. Но если вам нужно изменить грубое время для WebDriver
экземпляр то есть driver
в wait
тогда вы можете перенастроить его следующим образом:
Python:
driver.implicitly_wait(5)
Java:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
DotNet:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
Если в какой-то момент вы хотите обнулить ImplicitWait
Вы можете перенастроить его следующим образом:
Python:
driver.implicitly_wait(0)
Java:
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
DotNet:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
Ответьте на ваши вопросы:
Wait for the URL
: Нет,ImplicitWait
не влияет на загрузку страницы.For finding the element
: Да,ImplicitWait
будет определять грубое времяWebDriver
экземпляр будет ждать, ища элемент или элементы.Implicit wait once
Да, вам нужно настроитьImplicitWait
только один раз, и это применимо в течение всей жизниWebDriver
пример.Every element search
Да, применимо, когда-либоfindElement()
или жеfindElements()
вызывается.
Да, implicit_wait
применимо во всем мире. поэтому, как только вы установите его, он будет применен ко всем элементам.
Я бы не предложил использовать implicit_wait
если ваше приложение не слишком медленное. Вы могли бы использовать explicit wait
или любое другое ожидание в зависимости от ваших требований на следующей странице.
это JAVADOC, но реализация должна быть такой же для Python.
https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html
Неявное ожидание применимо для всех веб-элементов, тогда как явное ожидание применимо только для указанного элемента.
Явное ожидание является более интеллектуальным и действительно используется полностью при обработке Ajax, с другой стороны, неявное ожидание обычно используется для обработки проблем синхронизации приложений.