Неявный против явного против свободного ожидания

В чем разница между неявным, явным и быстрым ожиданием?

Если мы установим 10 секунд в неявном ожидании и до 10 секунд, в течение 3 секунд будет обнаружен только элемент.

В этот раз что будет? Он будет ждать 10 секунд или продолжить.

1 ответ

ImplicitWait

ImplicitWait это реализация для настройки WebDriver экземпляр то есть driver опрашивать HTML DOM в течение определенного промежутка времени NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS или же DAYS) при попытке найти элемент или элементы, если они не доступны сразу. Значение по умолчанию 0, что означает driver Когда находит инструкцию, чтобы найти элемент или элементы, поиск начинается, и результаты доступны на немедленной основе.

В этом случае после новой загрузки веб-страницы элемент или элементы могут быть / не могут быть найдены при немедленном поиске. Так что ваши Automation Script может столкнуться с любым из этих исключений:

  • NoSuchElementException
  • TimeoutException
  • ElementNotVisibleException
  • ElementNotSelectableException

Поэтому мы вводим ImplicitWait, Вводя ImplicitWait driver будет опрашивать HTML DOM для настроенного количества времени, ищущего элемент или элементы. К тому времени элемент или элементы, которые вы искали, могут быть доступны в HTML DOM, Как в вашем коде вы уже установили ImplicitWait до значения 10 секунд, driver будет опрашивать HTML DOM на 10 секунд.

  • Python:

    driver.implicitly_wait(10)
    
  • Java:

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    

Наконец, как только вы установите ImplicitWait, WebDriver экземпляр то есть driver способен нести эту конфигурацию до ее срока службы. Но если вам нужно изменить грубое время для WebDriver экземпляр то есть driver в wait тогда вы можете перенастроить его следующим образом:

  • Python:

    driver.implicitly_wait(5)
    
  • Java:

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    

Если в какой-то момент вы хотите обнулить ImplicitWaitВы можете перенастроить его следующим образом:

  • Python:

    driver.implicitly_wait(0)
    
  • Java:

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    

Fluent Wait

Fluent Wait это реализация Wait интерфейс, через который мы можем настроить timeout а также polling interval на лету. Экземпляр FluentWait может быть задано для настройки максимального количества времени ожидания условия, а также частоты, с которой условие должно проверяться. Пользователь также может настроить ожидание, чтобы игнорировать определенные типы exceptions в ожидании элемента, такого как NoSuchElementExceptions на странице.

  • Usage

       // Waiting 30 seconds for an element to be present on the page, checking
       // for its presence once every 5 seconds.
       Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
           .withTimeout(30, SECONDS)
           .pollingEvery(5, SECONDS)
           .ignoring(NoSuchElementException.class);
    
       WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
         public WebElement apply(WebDriver driver) {
           return driver.findElement(By.id("foo"));
         }
       });
    

ExplicitWait

ExplicitWait широко известный как WebDriverWait это специализированная реализация FluentWait через который пользователь может определить, настроить и реализовать для WebDriver экземпляр, чтобы дождаться выполнения определенного условия, прежде чем переходить к следующей строке кода. Есть несколько методов, которые помогают нам реализовать ExplicitWait это будет ждать только столько времени, сколько потребуется. WebDriverWait в комбинации с ExpectedCondition это один из способов ExplicitWait может быть достигнут.

Пример:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
.
.
.
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.click();

Объяснение:

Эта реализация ExplicitWait ждет до 10 секунд, прежде чем бросить TimeoutException или если он найдет элемент, он вернется в течение от 0 до 10 секунд. WebDriverWait по умолчанию вызывает ExpectedConditionкаждые 500 миллисекунд, пока он не вернется успешно. Успешное возвращаемое значение для ExpectedCondition Тип функции является Boolean значение true или ненулевой объект.

Ожидаемые условия:

Существуют некоторые часто встречающиеся условия при автоматизации веб-браузеров для Testing Web/Mobile Applications, Привязки Java, C# и Python включают эти удобные методы, поэтому нам не нужно писать ExpectedCondition сами классифицируем или создаем для них собственный пакет утилит. Некоторые из Expected Conditions являются:

  • alertIsPresent()
  • elementToBeClickable(locator)
  • elementToBeSelected(WebElement)
  • frameToBeAvailableAndSwitchToIt(locator)
  • invisibilityOf(element)

Вы можете найти информацию обо всех методах, поддерживаемых Expected Conditions Вот.


Этот конкретный запрос:

  • При поиске одного элемента драйвер будет опрашивать HTML DOM пока элемент не будет найден или настроенный тайм-аут не истечет, прежде чем бросить NoSuchElementException,
  • При поиске нескольких элементов драйвер будет опрашивать HTML DOM пока не будет найден хотя бы один элемент или не истечет настроенное время ожидания.

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

Если мы установим 10 секунд в неявном ожидании и раньше 10 секунд, в течение 3 секунд будет обнаружен только элемент.

На этот раз он будет идти дальше, а не ждать установленного времени..

Неявное ожидание сообщает веб-драйверу, что нужно подождать определенное время, прежде чем он выдаст исключение "NoSuchElementException". Значение по умолчанию - 0. После того, как мы установим время, веб-драйвер будет ждать в течение этого времени, прежде чем генерировать исключение. Если вы указали 10 секунд как время ожидания, но элемент идентифицируется как 3 секунды, то через 3 секунды он перейдет к следующему шагу.

Явное ожидание - это код, который вы определяете, чтобы дождаться наступления определенного условия, прежде чем продолжить выполнение кода. Явное ожидание сообщит веб-драйверу, что нужно дождаться определенных условий, таких как visibilityOfElementLocated и максимального времени, прежде чем генерировать исключение NoSuchElementException. Вы можете сослаться на это - https://configureselenium.blogspot.com/2019/07/implicit-explicit-fluent-wait-in.html