Під час написання автоматичних UI тестів за допомогою Selenium WebDriver, очікування є необхідною умовою для синхронізації роботи тестового скрипту та AUT (Application Under Testing). Це пов’язано з тим, що скрипт автотестів зазвичай виконується набагато швидше, ніж відгук на команди, програми що тестується. Тому в скриптах доводиться чекати певного стану програми, для подальшої взаємодії з нею.

Selenium WebDriver надає два різних механізми очікувань, а саме implicit та explicit очікування.

Implicit Waits

Implicit Waits (неявні очікування) – налаштовують екземпляр WebDriver таким чином, що якщо елемент не знайдено одразу, драйвер буде робити багаторазові спроби знайти елемент на сторінці, протягом заданого періоду часу. Якщо елемент не буде знайдено в заданий період, WebDriver згенерує виключення NoSuchElementException.

Неявне очікування є глобальним налаштуванням і застосовується до всіх елементів під час виконання тестів.

Приклад implicit wait для Java:

WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));

WebElement element = driver.findElement(By.id("elementId"));
element.click();

Якщо елемент буде знайдено раніше, ніж мине тайм-аут, скрипт одразу продовжить роботу та виконає наступну дію.

Неявні очікування зазвичай налаштовуються одразу після створення екземпляра WebDriver, і діють протягом усього життя цього екземпляра, хоча перевизначити їх можна будь-якої миті.

Explicit Waits

Explicit Waits (явні очікування) – дозволяють вказати WebDriver явну умову очікування, що застосовується тільки в конкретному місці до одного елемента, перед виконанням наступних дій. Це більш гнучкий і контрольований підхід, оскільки можна встановити різні умови для різних елементів.

Приклад explicit wait для Java:

WebDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));
element.click();

В цьому випадку, скрипт чекатиме доки елемент стане видимим та клікабельним протягом 5 секунд. Якщо умова буде виконана раніше ніж заданий тайм-аут, скрипт одразу продовжить виконання та перейде до наступного кроку. В протилежному випадку буде кинуто виключення TimeoutException.

Клас WebDriverWait виступає в ролі конфігурації очікування – задаємо як довго чекати на подію.

Клас ExpectedConditions – містить найчастіше використовувані під час виконання тестів умови для очікування (повний перелік доступних умов можна побачити за посиланням Class ExpectedConditions).