Примеры неявного, явного и плавного ожидания WebDriver

В чем разница между неявным ожиданием, явным ожиданием и плавным ожиданием в WebDriver? В частности, какова связь между WebDriverWait и FluentWait?

Вот примеры использования каждого метода ожидания в WebDriver с Java.



Неявное ожидание

An неявное ожидание заключается в том, чтобы указать WebDriver опрашивать DOM в течение определенного времени при попытке найти элемент или элементы, если они не доступны немедленно. Значение по умолчанию - 0. После установки неявное ожидание устанавливается на время существования экземпляра объекта WebDriver.


Пример использования неявного ожидания

WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('http://somedomain/slow_loading_url'); WebElement dynamicElement = driver.findElement(By.id('dynamicElement'));

Когда следует использовать неявное ожидание?


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



Явное ожидание

An явное ожидание - это код, который вы определяете для ожидания наступления определенного условия, прежде чем продолжить выполнение кода. WebDriverWait по умолчанию вызывает ExpectedCondition каждые 500 миллисекунд, пока оно не вернется успешно.

Пример использования явного ожидания

WebDriver driver = new FirefoxDriver(); driver.get('http://somedomain/someurl'); WebElement dynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id('dynamicElement')));

Когда следует использовать явное ожидание?


Обычно мы используем явное ожидание, если элемент загружается долго. Мы также использовали явное ожидание, чтобы проверить свойство CSS элемента (присутствие, кликабельность и т. Д.), Которое может измениться в приложениях Ajax.



Беглое ожидание

При использовании экземпляра FluentWait мы можем указать:

  • Частота, с которой FluentWait должен проверять определенные условия.
  • Игнорируйте определенные типы ожидающих исключений, такие как NoSuchElementExceptions, при поиске элемента на странице.
  • Максимальное время ожидания условия

Пример использования FluentWait

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

Когда нам следует использовать FluentWait?


Когда вы пытаетесь проверить наличие элемента, который может появляться каждые x секунд / минут.



Разница между WebDriverWait и FluentWait

WebDriverWait - это подкласс FluentWait. В FluentWait у вас есть больше параметров для настройки, а также максимальное время ожидания, например интервал опроса, исключения для игнорирования и т. Д.

Итак, вместо ожидания и последующего использования findElement:

WebDriverWait wait = new WebDriverWait(driver, 18); wait.until(ExpectedConditions.elementToBeClickable(By.linkText('Account'))); WebElement element = driver.findElement(By.linkText('Account')); element.sendKeys(Keys.CONTROL); element.click();

мы можем использовать:


WebElement element = wait.until(
ExpectedConditions.elementToBeClickable(By.linkText('Account')));

Дальнейшее чтение: