Під час написання автоматичних 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).