WebdriverIO предоставляет разработчикам удобный способ написания автотестов для веб-приложений с использованием WebDriver API. Одной из ключевых особенностей WebdriverIO является возможность работы с цепочками операций, которые позволяют последовательно выполнять несколько действий с элементами на странице. Эффективное использование цепочек операций повышает читаемость, ускоряет тестирование и делает код более структурированным.
Цепочка операций в WebdriverIO представляет собой последовательность вызовов методов, которые выполняются друг за другом. Каждый метод в цепочке выполняет конкретное действие (например, находит элемент, кликает по кнопке, вводит текст) и возвращает объект, который позволяет вызвать следующие методы.
Пример базовой цепочки:
$('#login')
.setValue('user')
.pause(1000)
.setValue('password')
.click('#submit');
В данном примере элементы находятся по селектору #login
и #submit, а также выполняются методы
setValue, pause и click. Это
обычная цепочка операций, которая упрощает написание тестов и делает код
более лаконичным.
WebdriverIO использует асинхронное выполнение команд, что позволяет тестам работать быстрее и выполнять несколько операций одновременно. Это достигается через промисы, которые обеспечивают правильную последовательность выполнения методов.
Для того чтобы WebDriver правильно управлял асинхронностью, каждый метод, выполняющий действие над элементом, возвращает промис. WebdriverIO использует механизм ожидания, который гарантирует, что операции выполняются только после завершения предыдущих.
Для упрощения работы с асинхронностью WebdriverIO поддерживает
async/await синтаксис, который значительно
улучшает читаемость кода. В примере ниже асинхронные вызовы используются
для выполнения шагов в тесте:
async function login() {
await $('#login').setValue('user');
await $('#password').setValue('password');
await $('#submit').click();
}
В данном примере используется await, что позволяет
дождаться выполнения каждой операции перед тем, как продолжить
выполнение следующих команд.
WebdriverIO предоставляет разнообразные методы, которые могут быть использованы в цепочках. Эти методы работают с элементами страницы и возвращают объекты, позволяющие вызвать новые методы.
setValue() — вводит текст в поле
ввода.click() — кликает на элемент.getText() — получает текст
элемента.getAttribute() — извлекает атрибут
элемента.isDisplayed() — проверяет видимость
элемента на странице.waitForExist() — ожидает появления
элемента на странице.Каждый из этих методов можно использовать в цепочках, что позволяет создавать сложные и компактные тесты. Важно помнить, что методы WebdriverIO возвращают объекты, которые могут быть использованы для дальнейших операций.
Пример использования нескольких методов в цепочке:
const headerText = await $('#header').getText();
await $('#button').click();
await $('#modal').waitForExist();
В данном примере извлекается текст из элемента с идентификатором
#header, затем выполняется клик по кнопке и ожидается, что
модальное окно с идентификатором #modal появится на
странице.
Одной из важных особенностей WebdriverIO является использование механизмов ожидания, которые позволяют гарантировать, что элементы на странице успевают загружаться и становятся доступными для взаимодействия. Без правильного управления ожиданиями тесты могут завершаться с ошибками из-за того, что элементы еще не были загружены.
В WebdriverIO есть два типа ожиданий:
Пример явного ожидания:
await $('#submit').waitForExist({ timeout: 5000 });
await $('#submit').click();
В этом примере тест будет ждать, пока элемент с идентификатором
#submit появится на странице в течение 5 секунд перед тем,
как кликнуть по нему.
Кроме того, WebdriverIO предоставляет методы для работы с тайм-аутами, которые можно использовать для настройки времени ожидания:
await browser.setTimeout({ 'implicit': 10000 });
Это устанавливает неявный тайм-аут в 10 секунд для всех операций поиска элементов. После этого все попытки поиска элементов будут ожидать до 10 секунд перед тем, как завершиться ошибкой.
WebdriverIO также поддерживает работу с несколькими элементами, возвращая их в виде массива. Это позволяет эффективно управлять списками элементов на странице, например, при взаимодействии с несколькими кнопками или ссылками одновременно.
Пример работы с массивом элементов:
const links = await $$('a');
for (let link of links) {
const linkText = await link.getText();
console.log(linkText);
}
В данном примере метод $$('a') возвращает все элементы
ссылки на странице. Каждый элемент в массиве обрабатывается с
использованием метода getText(), чтобы вывести текст каждой
ссылки.
Ошибка в цепочке операций может остановить выполнение теста, если она
не обрабатывается должным образом. Для повышения надежности тестов
необходимо использовать конструкцию try/catch, чтобы
корректно обрабатывать ошибки и, при необходимости, выполнять
дополнительные действия.
Пример обработки ошибок:
try {
await $('#submit').click();
} catch (error) {
console.log('Ошибка при клике на кнопку: ', error);
}
В этом примере ошибка при клике на кнопку будет поймана и выведена в консоль, что поможет понять причину сбоя.
WebdriverIO позволяет создавать свои собственные команды, которые
могут быть использованы в цепочках. Для этого необходимо воспользоваться
методом browser.addCommand, который позволяет добавить
новый метод, доступный для вызова в цепочках.
Пример создания пользовательской команды:
browser.addCommand('clickAndWait', async function (selector) {
await this.click(selector);
await this.waitForExist(selector);
});
await $('#button').clickAndWait();
В данном примере создается команда clickAndWait, которая
выполняет клик по элементу и ожидает его существование на странице. Этот
метод можно использовать в любых тестах, где требуется такая
последовательность действий.
Цепочки операций в WebdriverIO — это мощный инструмент для упрощения и ускорения написания тестов. С помощью цепочек можно эффективно управлять взаимодействиями с элементами, работать с асинхронностью и использовать различные механизмы ожидания. Важное внимание следует уделить обработке ошибок и использованию пользовательских команд для улучшения структуры тестов и повышения их надежности.