При автоматизированном тестировании веб-приложений важным аспектом является работа с динамическими элементами. Веб-страницы могут изменять своё содержимое без перезагрузки, добавляя или удаляя элементы, что усложняет задачу написания стабильных тестов. В контексте WebdriverIO это означает, что необходимо научиться работать с элементами, которые появляются, исчезают или изменяются в зависимости от действий пользователя или состояния страницы.
Динамическими элементами называют те элементы, которые могут изменяться в процессе работы страницы. Это могут быть как новые элементы, так и уже существующие, но с изменённым состоянием. Примеры таких элементов включают:
Для успешной работы с динамическими элементами WebdriverIO предлагает несколько стратегий:
Ожидания (waits) являются основным инструментом для работы с динамическими элементами. В WebdriverIO можно использовать два основных типа ожиданий:
Пример использования явного ожидания:
const elem = await $('selector');
await elem.waitForDisplayed({ timeout: 5000 });
Этот код ожидает, пока элемент с указанным селектором не станет видимым в течение 5 секунд. Если элемент не появляется в течение этого времени, будет выброшено исключение.
Для динамически изменяющихся элементов часто нужно отслеживать
изменения их атрибутов, например, class, id
или style. WebdriverIO позволяет взаимодействовать с
атрибутами через метод .getAttribute().
Пример:
const elem = await $('#dynamic-element');
let className = await elem.getAttribute('class');
Если элемент изменяет класс после какого-либо действия, можно использовать этот метод для отслеживания изменений и ожидания изменения состояния элемента.
Одной из самых сложных задач является работа с элементами, которые могут появляться и исчезать на странице в зависимости от взаимодействия с ней. В таких случаях может понадобиться использование гибких методов, позволяющих не только дождаться появления элемента, но и учесть его исчезновение.
Для этого подходит комбинация ожидания и проверки состояния элемента.
Например, можно использовать метод waitForExist, который
ожидает появления элемента на странице:
const elem = await $('#dynamic-element');
await elem.waitForExist({ timeout: 5000, reverse: false });
Здесь reverse: false означает, что мы ожидаем появления
элемента, а если бы установили reverse: true, то ждали бы
его исчезновения.
Некоторые динамические элементы могут быть результатом анимаций, например, плавное появление элементов или их перемещение. В таких случаях важно учитывать время, необходимое для завершения анимации.
Для этого WebdriverIO предоставляет методы для ожидания завершения
анимаций. Например, можно использовать методы
.waitForDisplayed() с тайм-аутами или проверку на наличие
определённых классов, которые могут указывать на окончание анимации.
Пример:
const elem = await $('#animated-element');
await elem.waitForDisplayed({ timeout: 7000 });
Этот метод будет ждать, пока элемент не станет видимым, даже если это связано с анимацией.
Предположим, необходимо протестировать форму, в которой поля для ввода появляются только после выбора опции в выпадающем списке. Чтобы надёжно взаимодействовать с такими элементами, следует использовать явные ожидания.
Пример теста:
const dropdown = await $('#dropdown');
await dropdown.selectByVisibleText('Option 1');
// Ожидаем появления поля, которое зависит от выбора
const dynamicField = await $('#dynamic-field');
await dynamicField.waitForDisplayed({ timeout: 5000 });
await dynamicField.setValue('Test Value');
Здесь тест сначала выбирает опцию из выпадающего списка, а затем ждёт появления динамического поля для ввода, после чего вводит в него значение.
Часто на веб-страницах встречаются таблицы, данные в которых обновляются динамически без перезагрузки страницы. В таких таблицах могут быть элементы, которые добавляются или удаляются в зависимости от состояния данных.
Пример работы с динамическими таблицами:
const table = await $('#dynamic-table');
const rows = await table.$$('tr');
for (let row of rows) {
const cell = await row.$('td:nth-child(2)');
const cellText = await cell.getText();
if (cellText === 'Desired Text') {
await row.$('button').click();
break;
}
}
В этом примере мы находим все строки таблицы, извлекаем текст в определённой ячейке и, если находим нужное значение, нажимаем кнопку в той же строке. Важно учитывать, что данные в таблице могут обновляться, и использование явных ожиданий помогает избежать ошибок при тестировании.
Работа с динамическими элементами является важным аспектом автоматизированного тестирования, и WebdriverIO предоставляет необходимые инструменты для надежного и стабильного взаимодействия с такими элементами. Применение явных ожиданий, отслеживание изменений атрибутов и использование методов для работы с анимациями и динамическими таблицами позволяет создать тесты, которые эффективно проверяют функциональность веб-приложений, учитывая их динамическую природу.