Найкращі практики
Цей посібник має на меті поділитися нашими найкращими практиками, які допоможуть вам писати ефективні та стійкі тести.
Використовуйте стійкі селектори
Використовуючи селектори, які стійкі до змін у DOM, ви отримаєте менше або навіть взагалі не матимете тестів, що не працюють, коли, наприклад, клас видаляється з елемента.
Класи можуть застосовуватися до кількох елементів, і їх слід уникати, якщо це можливо, якщо ви навмисно не хочете отримати всі елементи з цим класом.
// 👎
await $('.button')
Усі ці селектори повинні повертати один елемент.
// 👍
await $('aria/Submit')
await $('[test-id="submit-button"]')
await $('#submit-button')
Примітка: Щоб дізнатися про всі можливі селектори, які підтримує WebdriverIO, перегляньте нашу сторінку Selectors.
Обмежте кількість запитів до елементів
Кожного разу, коли ви використовуєте команду $
або $$
(це включає їх ланцюжок), WebdriverIO намагається знайти елемент у DOM. Ці запити є дорогими, тому вам слід намагатися обмежити їх кількість.
Запитує три елементи.
// 👎
await $('table').$('tr').$('td')
Запитує лише один елемент.
// 👍
await $('table tr td')
Єдиний випадок, коли слід використовувати ланцюжок, — це коли ви хочете поєднати різні стратегії селекторів. У прикладі ми використовуємо Deep Selectors, це стратегія для входу в shadow DOM елемента.
// 👍
await $('custom-datepicker').$('#calendar').$('aria/Select')
Віддавайте перевагу знаходженню одного елемента замість вибору одного зі списку
Не завжди можливо це зробити, але за допомогою CSS-псевдокласів, таких як :nth-child, ви можете зіставляти елементи на основі індексів елементів у дочірньому списку їхніх батьків.
Запитує всі рядки таблиці.
// 👎
await $$('table tr')[15]
Запитує один рядок таблиці.
// 👍
await $('table tr:nth-child(15)')
Використовуйте вбудовані твердження
Не використовуйте ручні твердження, які не чекають автоматично, поки результати відповідатимуть, оскільки це призведе до нестабільних тестів.
// 👎
expect(await button.isDisplayed()).toBe(true)
Використовуючи вбудовані твердження, WebdriverIO автоматично чекатиме, поки фактичний результат відповідатиме очікуваному, що призведе до стійких тестів. Він досягає цього, автоматично повторюючи т вердження, доки воно не пройде або не вичерпається час.
// 👍
await expect(button).toBeDisplayed()
Ліниве завантаження та ланцюжок обіцянок
WebdriverIO має деякі трюки для написання чистого коду, оскільки він може ліниво завантажувати елемент, що дозволяє створювати ланцюжки обіцянок і зменшує кількість await
. Це також дозволяє передавати елемент як ChainablePromiseElement замість Element для легшого використання з об'єктами сторінок.
Отже, коли потрібно використовувати await
?
Ви завжди повинні використовувати await
, за винятком команд $
та $$
.
// 👎
const div = await $('div')
const button = await div.$('button')
await button.click()
// або
await (await (await $('div')).$('button')).click()
// 👍
const button = $('div').$('button')
await button.click()
// або
await $('div').$('button').click()