Платформ-зависимые проверки

WebdriverIO предоставляет мощные инструменты для написания кроссплатформенных тестов, но часто возникает необходимость адаптировать проверки под конкретные платформы — десктоп, мобильные браузеры, Android или iOS. Платформ-зависимые проверки позволяют гарантировать корректное выполнение сценариев независимо от среды тестирования.


Определение платформы

WebdriverIO предоставляет объект browser.capabilities, содержащий информацию о текущей среде выполнения. Основные ключи, которые используются для идентификации платформы:

  • platformName — имя платформы (например, 'iOS', 'Android', 'Windows').
  • browserName — имя браузера (например, 'chrome', 'firefox').
  • deviceName — название устройства (для мобильных эмуляторов или реальных устройств).
  • platformVersion — версия платформы.

Пример использования:

if (browser.capabilities.platformName === 'iOS') {
    console.log('Тест выполняется на iOS');
} else if (browser.capabilities.platformName === 'Android') {
    console.log('Тест выполняется на Android');
} else {
    console.log('Десктопная платформа');
}

Использование этих данных позволяет динамически изменять поведение тестов в зависимости от платформы.


Условные проверки в тестах

Для реализации платформ-зависимых проверок применяются условные конструкции (if, switch). На практике это может включать различия в локаторах, элементах интерфейса или действиях пользователя.

Пример различий в локаторах:

const loginButton = browser.capabilities.platformName === 'iOS'
    ? $('~login_button_ios')
    : browser.capabilities.platformName === 'Android'
        ? $('~login_button_android')
        : $('#loginButton');

loginButton.click();

Здесь один и тот же логический шаг (клик по кнопке входа) адаптируется под платформу с помощью условного выбора локатора.


Использование кастомных команд для платформ-зависимой логики

Для повышения читаемости тестов и уменьшения дублирования рекомендуется создавать кастомные команды WebdriverIO. Это позволяет инкапсулировать платформ-зависимую логику.

Пример кастомной команды:

browser.addCommand('tapLoginButton', function() {
    if (this.capabilities.platformName === 'iOS') {
        return $('~login_button_ios').click();
    } else if (this.capabilities.platformName === 'Android') {
        return $('~login_button_android').click();
    } else {
        return $('#loginButton').click();
    }
});

// Использование в тесте
browser.tapLoginButton();

Преимущество такого подхода в том, что тесты остаются чистыми и независимыми от деталей платформы.


Платформ-зависимые проверки видимости и состояния элементов

Некоторые элементы могут отображаться по-разному на мобильных и десктопных версиях сайта или приложения. Для корректной работы тестов необходимо учитывать это при проверках видимости (isDisplayed) или состояния (isEnabled, isSelected).

Пример:

const menu = browser.capabilities.platformName === 'iOS'
    ? $('~menu_ios')
    : $('~menu_android');

if (menu.isDisplayed()) {
    menu.click();
}

WebdriverIO также позволяет комбинировать платформ-зависимые проверки с ожиданиями (waitForDisplayed), чтобы избежать ошибок, связанных с асинхронным отображением элементов:

menu.waitForDisplayed({ timeout: 5000 });
menu.click();

Организация платформ-зависимых тестов

Для удобства поддержки большого числа платформ рекомендуется структурировать тесты следующим образом:

  1. Разделение локаторов: хранение платформ-зависимых селекторов в отдельных объектах или файлах конфигурации.
const selectors = {
    loginButton: {
        iOS: '~login_button_ios',
        Android: '~login_button_android',
        desktop: '#loginButton'
    }
};
  1. Унифицированные функции действий: использование кастомных команд для кликов, ввода текста и навигации.
  2. Конфигурация WebdriverIO: возможность запуска тестов на разных платформах с использованием параметров capabilities в файле wdio.conf.js.

Пример запуска для разных платформ:

capabilities: [
    {
        platformName: 'iOS',
        deviceName: 'iPhone 14',
        browserName: 'Safari'
    },
    {
        platformName: 'Android',
        deviceName: 'Pixel 7',
        browserName: 'Chrome'
    },
    {
        platformName: 'Windows',
        browserName: 'chrome'
    }
]

Такой подход позволяет одним тестовым сценарием охватывать множество платформ без дублирования кода.


Практические советы

  • Для мобильных платформ часто требуется учитывать разные размеры экранов, что может влиять на расположение элементов. В WebdriverIO можно использовать getSize() и getLocation() для динамического вычисления координат.
  • Использовать условные ассерты: иногда проверки состояния элемента различаются на iOS и Android.
  • Для сложных сценариев подходит паттерн Page Object, где платформ-зависимые селекторы и методы инкапсулируются в отдельных классах.

Платформ-зависимые проверки в WebdriverIO — ключевой инструмент для обеспечения стабильности тестов на различных устройствах и браузерах. Они позволяют поддерживать единый набор сценариев и адаптировать их под конкретные условия исполнения, минимизируя дублирование кода и повышая читабельность тестов.