При автоматизированном тестировании веб-приложений одним из ключевых аспектов является проверка наличия элементов в DOM. В WebdriverIO эта задача решается с помощью методов поиска элементов и проверки их состояния. Правильное использование этих инструментов позволяет создавать устойчивые и предсказуемые тесты, минимизируя ошибки, связанные с асинхронной загрузкой страницы или динамическим контентом.
WebdriverIO предоставляет несколько методов для поиска элементов:
$(selector) — возвращает первый элемент,
соответствующий селектору. Если элемент не найден, возвращается
объект-обертка, который при попытке взаимодействия с ним вызовет
ошибку.$$(selector) — возвращает массив элементов,
соответствующих селектору. Если элементов нет, возвращается пустой
массив.Пример:
const button = $('#submit-button');
const links = $$('a.nav-link');
Для проверки наличия элемента в DOM используется метод
isExisting(). Он возвращает булево
значение: true, если элемент присутствует в DOM, и
false, если его нет.
Пример использования:
const loginForm = $('#login-form');
if (loginForm.isExisting()) {
console.log('Форма логина присутствует на странице');
} else {
console.log('Форма логина отсутствует');
}
Метод isExisting() проверяет именно наличие
элемента в DOM, а не его видимость. Элемент может существовать,
но быть скрытым с помощью CSS (display: none или
visibility: hidden).
Если требуется убедиться, что элемент не только существует, но и
видим пользователю, используется метод
isDisplayed():
const submitButton = $('#submit-button');
if (submitButton.isDisplayed()) {
console.log('Кнопка доступна для взаимодействия');
}
Разница между isExisting() и isDisplayed()
критична для тестов, которые должны имитировать действия пользователя:
пользователь не может взаимодействовать с невидимым элементом.
WebdriverIO поддерживает ожидания через метод
waitForExist(), который позволяет
подождать появления элемента в DOM заданное время. Это полезно для
динамических страниц с задержкой загрузки элементов.
Пример:
const notification = $('#notification');
notification.waitForExist({ timeout: 5000 });
console.log('Уведомление появилось в DOM');
Параметры метода waitForExist():
timeout — максимальное время ожидания в
миллисекундах.reverse — если true, ожидает исчезновения
элемента.timeoutMsg — сообщение об ошибке, если элемент не
появился.Пример с отрицательным условием:
const modal = $('#modal');
modal.waitForExist({ timeout: 3000, reverse: true });
console.log('Модальное окно исчезло из DOM');
Для проверки наличия нескольких элементов используется массив,
возвращаемый $$(selector). Часто нужно убедиться, что хотя
бы один элемент присутствует:
const items = $$('.product-item');
if (items.length > 0) {
console.log(`Найдено ${items.length} элементов`);
} else {
console.log('Элементы отсутствуют');
}
Также можно проверять наличие конкретного количества элементов:
expect($$('.product-item')).toBeElementsArrayOfSize(5);
isDisplayed(). Если важен только факт присутствия в DOM —
isExisting().waitForExist() и waitForDisplayed()
предотвращают ошибки из-за задержек рендеринга.Проверка появления уведомления после действия пользователя:
$('#save-button').click();
const toast = $('#toast-message');
toast.waitForExist({ timeout: 4000 });
expect(toast.isDisplayed()).toBe(true);
Проверка исчезновения загрузочного индикатора:
const loader = $('#loader');
loader.waitForExist({ timeout: 5000, reverse: true });
console.log('Загрузка завершена');
Проверка наличия хотя бы одного элемента из списка:
const products = $$('.product-item');
expect(products.length).toBeGreaterThan(0);
Методы проверки наличия элементов в DOM в WebdriverIO обеспечивают
гибкость и надёжность тестов, позволяя учитывать как статические, так и
динамически изменяющиеся страницы. Правильное сочетание
isExisting(), isDisplayed() и ожиданий
waitForExist() позволяет создавать тесты, которые устойчиво
работают в любых условиях.