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();
Для удобства поддержки большого числа платформ рекомендуется структурировать тесты следующим образом:
const selectors = {
loginButton: {
iOS: '~login_button_ios',
Android: '~login_button_android',
desktop: '#loginButton'
}
};
capabilities в файле wdio.conf.js.Пример запуска для разных платформ:
capabilities: [
{
platformName: 'iOS',
deviceName: 'iPhone 14',
browserName: 'Safari'
},
{
platformName: 'Android',
deviceName: 'Pixel 7',
browserName: 'Chrome'
},
{
platformName: 'Windows',
browserName: 'chrome'
}
]
Такой подход позволяет одним тестовым сценарием охватывать множество платформ без дублирования кода.
getSize() и
getLocation() для динамического вычисления координат.Платформ-зависимые проверки в WebdriverIO — ключевой инструмент для обеспечения стабильности тестов на различных устройствах и браузерах. Они позволяют поддерживать единый набор сценариев и адаптировать их под конкретные условия исполнения, минимизируя дублирование кода и повышая читабельность тестов.