Автоочікування
Однією з найпоширеніших причин нестабільних тестів є взаємодія з елементами, які ще не з'явилися у вашому додатку в момент взаємодії з ними. Сучасні веб застосунки дуже динамічні, елементи можуть то з’являтися, то зникати. Ми люди, несвідомо чекаємо на появу елементів, але складаючи сценарії автоматизації ми часто забуваємо про цю "дію". Є два способи дочекатися появи елемента.
Явний vs. Неявний
Протокол WebDriver дає можливість вказати неявний тайм-аут, який визначатиме як довго драйвер має чекати, поки елемент не з’явиться. За замовчуванням для цього тайм-ауту встановлено значення 0
, тому драйвер одразу повертає помилку no such element
, якщо елемент не знайдено на сторінці. Збільшення цього тайм-ауту за допомогою setTimeout
змусить драйвер чекати та збільшить шанси того, що елемент зрештою з’явиться.
Дізнайтеся більше про тайм-аути, пов’язані з WebDriver і фреймворком, у документації з тайм-аутів
Іншим підходом є використання явного очікування, вбудованого у WebdriverIO в командах таких як waitForExist
. За допомогою цієї техніки фреймворк чекає на елемент, викликаючи команду findElements
кілька разів, доки не буде досягнуто тайм-ауту.
Вбудоване очікування
Обидва механізми очікування несумісні один з одним і можуть призвести до сповільнення роботи. Оскільки неявне очікування є глобальним параметром, воно буде застосоване до всіх елементів, що іноді не є бажаною поведінкою. Тому WebdriverIO надає вбудований механізм очікування, який автоматично та явно очікуватиме на елемент перед взаємодією з ним.
Ми рекомендуємо не використовувати неявне очікування взагалі, і дозволити WebdriverIO подбати про очікування елемента.
Використання неявних очікувань також є проблематичним у випадках, коли вам потрібно дочекатися, поки елемент зникне. WebdriverIO буде шукати елемент необхідну кількість разів, доки не отримає помилку. Встановлення неявного параметра очікування тільки дарма затримуватиме виконання команд та може спричинити збільшення часу необхідного для виконання тестів.
Ви можете встановити значення за замовчуванням для автоматичного явного очікування WebdriverIO, визначивши параметр waitforTimeout
у вашій конфігурації.
Обмеження
WebdriverIO може чекати на елементи лише у разі коли вони визначені неявно. Це буде так, якщо для отримання об'єкту елемента використовується $
. Однак це не підтримується у разу роботи із набором елементів, як продемонстровано тут:
const divs = await $$('div')
await divs[2].click() // can throw "Cannot read property 'click' of undefined"
Абсолютно нормальним є отримання набору елементів і виконання дії із n-им елементом цього набору. Однак WebdriverIO не знає, скільки елементів ви очікуєте отримати. Оскільки $$
повертає масив елементів WebdriverIO, вам потрібно вручну перевірити, чи результуючий масив містить достатню кількість елементів. Для цього ми рекомендуємо використовувати waitUntil
, наприклад:
const div = await browser.waitUntil(async () => {
const elems = await $$('div')
if (elems.length !== 2) {
return false
}
return elems[2]
}, {
timeoutMsg: 'Never found enough div elements'
})
await div.click()