Эффективная работа с селекторами является ключевым аспектом при создании стабильных и быстрых тестов на WebdriverIO. Производительность селекторов напрямую влияет на скорость выполнения тестов, стабильность автоматизации и потребление ресурсов. В этой статье рассматриваются принципы выбора селекторов, их влияние на производительность и методы оптимизации.
WebdriverIO поддерживает несколько типов селекторов для поиска элементов на странице:
CSS-селекторы
Производительность: Наиболее быстрый и оптимизированный способ поиска элементов в DOM.
Примеры:
const button = await $('button.submit');
const input = await $('#username');Рекомендации: Использовать уникальные
идентификаторы (id) или классы. Сложные цепочки селекторов
(div > span > a) могут замедлять поиск и увеличивать
вероятность ломкости теста.
XPath
Производительность: Медленнее, чем CSS, особенно при сложных выражениях.
Примеры:
const element = await $('//div[@class="container"]//button[text()="Отправить"]');Особенности: Удобен для поиска элементов по тексту или структуре документа, но требует аккуратного построения выражений. Избыточное использование XPath без необходимости снижает производительность.
Link Text / Partial Link Text
WebdriverIO custom selectors
Глубокая вложенность элементов
id или
data-* атрибутов на элементы верхнего уровня уменьшает
необходимость обхода всех дочерних элементов.Динамический DOM
waitForExist,
waitForDisplayed).Приоритет уникальных идентификаторов
const loginButton = await $('#loginButton');
id выполняется быстрее, чем по классу или XPath.Использование атрибутов data-*
const submit = await $('[data-test="submit"]');
data-* специально создаются для тестирования.
Они не зависят от структуры DOM и стилей, что делает тесты
стабильными.Минимизация сложных CSS-путей
div.container > ul > li:nth-child(3) > a.ul.nav > li.active > a.Кэширование элементов
Повторный поиск одного и того же элемента на странице может быть дорогим.
Использование переменных для хранения элементов уменьшает количество обращений к DOM:
const menu = await $('#menu');
await menu.$('li.item').click();Явные ожидания вместо глобальных пауз
Использование browser.pause() замедляет
тесты.
Предпочтение отдавать методам WebdriverIO:
await element.waitForDisplayed({ timeout: 5000 });Время выполнения селектора
Измеряется с помощью логирования:
const start = Date.now();
await $('#element').click();
console.log(`Время поиска элемента: ${Date.now() - start}ms`);Количество обращений к DOM
Стабильность тестов
stale element reference.Создание Page Object модели
Хранение селекторов в отдельных классах уменьшает дублирование и упрощает изменение селекторов при обновлении UI.
class LoginPage {
get username() { return $('#username'); }
get password() { return $('#password'); }
get submit() { return $('[data-test="submit"]'); }
}Использование селекторов, независимых от дизайна
Регулярное профилирование тестов
id или data-* атрибутами —
основной инструмент для быстрого поиска элементов.Эффективная работа с селекторами позволяет создавать масштабируемые и быстрые тестовые сценарии, что особенно важно при работе с крупными и динамическими веб-приложениями.