Использование неявного ожидания в селене

Я начинающий. Я понимаю, что в основном делает ожидание, но я смущен тем, как различные учебники в Интернете размещают его и объясняют. Например, в приведенном ниже коде он помещается перед загрузкой 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, с другой стороны, неявное ожидание обычно используется для обработки проблем синхронизации приложений.

Другие вопросы по тегам