Одной из самых частых проблем при автоматизации тестирования является использование неправильных или нестабильных CSS-селекторов. В WebdriverIO селекторы играют ключевую роль в нахождении элементов на странице и взаимодействии с ними. Ошибки при работе с селекторами могут привести к сбоям тестов, задержкам или неверным результатам. Основные причины проблем с селекторами могут быть связаны с их нестабильностью, неправильным выбором или изменяющимся DOM-структурам. Для успешной диагностики и устранения этих проблем важно учитывать несколько аспектов.
Селекторы являются связующим звеном между тестом и веб-страницей. Без точных селекторов WebdriverIO не может взаимодействовать с элементами на странице. Основные типы селекторов, используемые в WebdriverIO:
Ошибки в выборе селектора могут привести к сбоям тестов или к нахождению неверных элементов. Например, если на странице изменяется структура DOM или классы, это может нарушить работу тестов, если селектор не учитывает эти изменения.
Нестабильные классы и идентификаторы
Веб-страницы часто используют динамически генерируемые идентификаторы
или классы, которые могут изменяться при каждом перезапуске страницы.
Например, идентификаторы вида btn-34d2f5 могут быть
неустойчивыми и менять свою форму на каждой загрузке страницы.
Использование таких селекторов может привести к ошибкам в
тестах.
Проблемы с видимостью элементов В WebdriverIO
селекторы, связанные с видимостью элементов, такие как
visible, могут не срабатывать, если элементы находятся в
скрытых областях страницы (например, за модальными окнами или в
элементах с display: none). В таких случаях тесты могут не
находить элементы или взаимодействовать с ними неправильно.
Проблемы с асинхронностью Страница может загружаться или обновляться динамически (например, через AJAX), что приводит к ситуации, когда элемент доступен для взаимодействия только после завершения загрузки. Без правильной синхронизации WebdriverIO может попытаться взаимодействовать с элементами, которые ещё не появились на странице.
WebdriverIO метод
waitForDisplayed() Метод
waitForDisplayed() позволяет тестам подождать, пока элемент
не станет видимым. Этот метод полезен при асинхронных загрузках, когда
элемент может быть доступен только через некоторое время после начала
теста. Например:
const button = $('#submit');
button.waitForDisplayed({ timeout: 5000 });
button.click();
Это гарантирует, что тест будет ждать появления элемента в течение заданного времени перед попыткой взаимодействовать с ним.
Метод isDisplayed() Для диагностики
проблемы с видимостью можно использовать метод
isDisplayed(). Этот метод проверяет, доступен ли элемент
для взаимодействия. Он может быть полезен для подтверждения, что элемент
видим перед выполнением действия.
const button = $('#submit');
if (button.isDisplayed()) {
button.click();
} else {
console.log('Кнопка не доступна');
}Использование DevTools Один из способов диагностики — использование инструментов разработчика в браузере (DevTools) для поиска элементов и их атрибутов. Включение инспектора помогает выявить, как селекторы взаимодействуют с элементами на странице. Также полезно проверять, какие динамические изменения происходят в DOM при взаимодействии с веб-страницей.
Использование библиотеки chai для
ассершенов В WebdriverIO можно использовать различные ассершены
для диагностики состояния элементов. Например, expect() из
библиотеки chai позволяет проверить наличие или видимость
элемента:
const button = $('#submit');
expect(button).toBeDisplayed();Метод waitUntil() В некоторых
случаях может потребоваться ожидание не только видимости элемента, но и
других его состояний (например, что элемент стал кликабельным или что
его атрибуты изменились). Для этого используется метод
waitUntil():
browser.waitUntil(() => {
return $('#submit').getText() === 'Отправить';
}, { timeout: 5000, timeoutMsg: 'Кнопка не обновилась вовремя' });Использование уникальных атрибутов Если
возможно, выбирайте элементы с уникальными и стабильными атрибутами,
такими как data-test-id или data-testid. Эти
атрибуты предназначены для тестирования и не изменяются при изменении
стилей или структуры страницы.
Избегайте слишком общих селекторов Селекторы
типа div или span могут привести к
ненадёжности, поскольку на странице может быть много таких элементов.
Лучше использовать более специфичные селекторы, такие как
#login-button или .form-input.
Использование XPath с конкретными условиями XPath позволяет использовать более сложные условия для поиска элементов. Например, можно искать элементы, основываясь на их родителях или текстах:
const submitButton = $("//button[text()='Отправить']");
submitButton.click();
Это может быть полезно, когда структура страницы сложная, и другие селекторы не могут точно найти нужный элемент.
Использование псевдоклассов и псевдоэлементов
CSS Иногда полезно использовать CSS-псевдоклассы, такие как
:nth-child, :last-child,
:first-of-type, которые позволяют более точно локализовать
элемент на странице, например:
const firstInput = $('input:nth-of-type(1)');Проверка селекторов в реальном времени Проверка правильности работы селекторов в реальном времени с помощью инструментов браузера или через консоль браузера — это быстрый способ убедиться в их корректности и убедиться, что они не сломаются при изменении страницы.
Проблемы с селекторами являются одним из основных источников ошибок в тестах WebdriverIO. Для диагностики таких проблем важно не только понимать, как работают селекторы, но и уметь использовать средства для их тестирования и отладки. Основной задачей является обеспечение стабильности и точности в поиске элементов, что достигается правильным выбором селекторов, их тестированием и использованием методов синхронизации.