WebDriverIO предоставляет мощный и гибкий набор инструментов для автоматизированного тестирования веб-приложений. Однако, не всегда стандартных возможностей достаточно для реализации специфических тестов. В таких случаях полезно расширить функциональность WebDriverIO с помощью собственных методов. Это позволяет не только улучшить читаемость тестов, но и ускорить процесс разработки, избавив от повторяющихся действий и сложных конструкций.
WebDriverIO предоставляет механизм для добавления собственных команд
с помощью метода addCommand. Этот метод позволяет
регистрировать новые команды, которые можно использовать в тестах точно
так же, как и стандартные методы WebDriverIO.
Команда добавляется в контекст клиента WebDriverIO и может быть использована в тестах. Важно отметить, что такие команды выполняются в контексте существующего экземпляра браузера или сессии, и они имеют доступ к основным методам WebDriverIO.
// Добавление кастомной команды "waitForElementVisible"
browser.addCommand('waitForElementVisible', function (selector, timeout = 5000) {
const element = $(selector);
element.waitForExist({ timeout });
element.waitForDisplayed({ timeout });
});
Теперь команда waitForElementVisible может быть
использована в любом тесте:
it('should wait for the element to be visible', () => {
browser.url('https://example.com');
browser.waitForElementVisible('#someElement');
});
Доступ к текущему экземпляру браузера: Внутри
кастомной команды можно использовать методы WebDriverIO, такие как
$, $$, browser.url(),
browser.waitForExist() и другие. Это позволяет эффективно
взаимодействовать с веб-страницей, при этом расширяя
функциональность.
Асинхронность: WebDriverIO использует
асинхронную модель работы с браузером, что требует использования
асинхронных функций для работы с элементами. Поэтому важно правильно
работать с промисами или использовать async/await для
обеспечения корректной работы кастомных команд.
browser.addCommand('clickElement', async function (selector) {
const element = await $(selector);
await element.click();
});
browser.addCommand('login', function (username, password) {
$('#username').setValue(username);
$('#password').setValue(password);
$('button[type="submit"]').click();
});
browserЕсли необходимо добавить глобальные методы или изменить поведение
существующих команд для всего тестового набора, можно расширить прототип
объекта browser. Это позволяет использовать расширенные
функции без необходимости передавать их в каждом тесте.
Object.defineProperty(browser, 'isMobile', {
get: function () {
return this.capabilities.deviceName && this.capabilities.deviceName.includes('mobile');
}
});
Теперь в тестах можно использовать свойство
browser.isMobile, чтобы проверить, работает ли тест на
мобильном устройстве, без необходимости писать дополнительные
проверки.
В некоторых случаях необходимо расширить стандартные ожидания WebDriverIO. Например, часто требуется проверка наличия определённого текста на странице или состояние элемента в определённое время.
browser.addCommand('waitForText', function (selector, text, timeout = 5000) {
const element = $(selector);
element.waitForExist({ timeout });
element.waitForText({ timeout, text });
});
С помощью этой команды можно ожидать, что текст в определённом элементе станет равным нужному в течение заданного времени.
Помимо кастомных команд, можно использовать плагины для расширения функциональности WebDriverIO. Плагины предоставляют готовые решения для распространённых задач, таких как интеграция с другими тестовыми фреймворками, улучшенная поддержка браузеров и т. д. Для интеграции с плагином достаточно добавить его в конфигурацию WebDriverIO.
exports.config = {
plugins: {
'some-plugin': {
option1: true,
option2: 'value'
}
}
};
С помощью плагинов можно интегрировать WebDriverIO с различными инструментами, такими как отчетность, анализ производительности и другие, что значительно расширяет возможности фреймворка.
Кастомизация методов WebDriverIO позволяет не только сократить количество повторяющегося кода, но и повысить читаемость тестов. Добавление понятных и высокоуровневых команд делает тесты более декларативными и легче воспринимаемыми.
Допустим, необходимо реализовать проверку, что форма на веб-странице была успешно отправлена. Вместо того чтобы в каждом тесте писать много строк кода, можно добавить одну команду:
browser.addCommand('submitForm', function (formSelector) {
$(formSelector).submit();
const successMessage = $('.success-message');
successMessage.waitForExist({ timeout: 5000 });
});
Теперь для проверки отправки формы достаточно вызвать эту команду:
it('should submit the form successfully', () => {
browser.url('https://example.com/contact');
browser.submitForm('#contactForm');
});
Это не только сокращает количество строк кода, но и делает тесты более ясными.
Расширение встроенных методов WebDriverIO с помощью кастомных команд и плагинов открывает широкие возможности для оптимизации и упрощения процесса тестирования. Это помогает сделать код более читаемым, переиспользуемым и поддерживаемым. Умение правильно использовать эти возможности позволяет эффективно настроить автоматизированные тесты под любые нужды проекта.