Расширение встроенных методов

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');
});

Особенности создания кастомных команд

  1. Доступ к текущему экземпляру браузера: Внутри кастомной команды можно использовать методы WebDriverIO, такие как $, $$, browser.url(), browser.waitForExist() и другие. Это позволяет эффективно взаимодействовать с веб-страницей, при этом расширяя функциональность.

  2. Асинхронность: WebDriverIO использует асинхронную модель работы с браузером, что требует использования асинхронных функций для работы с элементами. Поэтому важно правильно работать с промисами или использовать async/await для обеспечения корректной работы кастомных команд.

browser.addCommand('clickElement', async function (selector) {
    const element = await $(selector);
    await element.click();
});
  1. Встроенные команды WebDriverIO: Кастомные команды можно сочетать с существующими встроенными методами WebDriverIO. Это позволяет создавать более сложные и многозадачные команды, которые могут включать в себя несколько действий.
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 с помощью кастомных команд и плагинов открывает широкие возможности для оптимизации и упрощения процесса тестирования. Это помогает сделать код более читаемым, переиспользуемым и поддерживаемым. Умение правильно использовать эти возможности позволяет эффективно настроить автоматизированные тесты под любые нужды проекта.