Неявный против явного против свободного ожидания
В чем разница между неявным, явным и быстрым ожиданием?
Если мы установим 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