Appium интеграция

Appium — это инструмент для автоматизации мобильных приложений, поддерживающий как Android, так и iOS. Интеграция Appium с Protractor позволяет использовать возможности Protractor для тестирования Angular-приложений на мобильных устройствах, обеспечивая единый подход к тестированию веб и гибридных приложений.

Настройка окружения

Для начала необходимо установить следующие компоненты:

  1. Node.js и npm — актуальная версия для запуска Protractor и Appium.
  2. Protractor:
npm install -g protractor
  1. Appium:
npm install -g appium
  1. Appium Doctor для проверки корректности установки:
npm install -g appium-doctor
appium-doctor
  1. WebDriver Manager для управления драйверами браузеров:
webdriver-manager update

Для iOS потребуется установка Xcode и соответствующих командных инструментов, а для Android — Android SDK и настройка переменных среды ANDROID_HOME.

Конфигурация Protractor для мобильного тестирования

Protractor изначально ориентирован на веб-приложения, поэтому интеграция с Appium требует настройки capabilities для мобильного устройства.

Пример protractor.conf.js для Android:

exports.config = {
  seleniumAddress: 'http://localhost:4723/wd/hub',
  specs: ['specs/mobile-spec.js'],
  capabilities: {
    platformName: 'Android',
    platformVersion: '12.0',
    deviceName: 'Pixel_5_API_31',
    automationName: 'UiAutomator2',
    app: '/path/to/your/app.apk',
    browserName: '',
    newCommandTimeout: 300
  },
  framework: 'jasmine',
  jasmineNodeOpts: {
    defaultTimeoutInterval: 60000
  }
};

Для iOS конфигурация отличается:

capabilities: {
  platformName: 'iOS',
  platformVersion: '16.0',
  deviceName: 'iPhone 14',
  automationName: 'XCUITest',
  app: '/path/to/your/app.app',
  newCommandTimeout: 300
}

Ключевые параметры:

  • platformName — платформа устройства (Android/iOS).
  • automationName — движок автоматизации (UiAutomator2 для Android, XCUITest для iOS).
  • app — путь к приложению, которое тестируется.
  • newCommandTimeout — время ожидания команды перед таймаутом.

Структура тестов

Тесты в Protractor для мобильных приложений имеют аналогичную структуру веб-тестов, но с использованием мобильных селекторов и жестов. Пример теста на открытие приложения и проверку элемента:

describe('Мобильное приложение', function() {
  it('должно отображать главный экран', async function() {
    const el = element(by.id('mainScreenTitle'));
    await expect(el.isDisplayed()).toBe(true);
  });

  it('должно нажимать на кнопку', async function() {
    const button = element(by.id('loginButton'));
    await button.click();
    const nextScreen = element(by.id('welcomeMessage'));
    await expect(nextScreen.isDisplayed()).toBe(true);
  });
});

Использование async/await важно для корректной работы с асинхронными командами Appium, так как методы взаимодействия с мобильным устройством возвращают промисы.

Жесты и взаимодействие с элементами

Appium поддерживает имитацию сложных действий на сенсорном экране: свайпы, прокрутки, долгие нажатия. Пример свайпа:

const touchAction = new TouchAction(browser);
await touchAction
  .press({ x: 500, y: 1000 })
  .moveTo({ x: 500, y: 500 })
  .release()
  .perform();

Другие важные действия:

  • tap — короткое нажатие на элемент.
  • longPress — удержание нажатия.
  • swipe — скользящее движение.
  • scroll — прокрутка до нужного элемента.

Интеграция с Page Object

Для удобства тестирования на мобильных устройствах рекомендуется использовать Page Object. Пример страницы:

class LoginPage {
  constructor() {
    this.usernameField = element(by.id('username'));
    this.passwordField = element(by.id('password'));
    this.loginButton = element(by.id('loginButton'));
  }

  async login(user, pass) {
    await this.usernameField.sendKeys(user);
    await this.passwordField.sendKeys(pass);
    await this.loginButton.click();
  }
}

module.exports = new LoginPage();

Тест с использованием Page Object:

const loginPage = require('../pages/loginPage');

describe('Авторизация', function() {
  it('должна успешно входить в систему', async function() {
    await loginPage.login('testuser', 'password123');
    const homeScreen = element(by.id('homeScreen'));
    await expect(homeScreen.isDisplayed()).toBe(true);
  });
});

Логирование и дебаг

Для мобильных тестов важно вести детальное логирование действий. Appium поддерживает:

  • device logs через adb logcat для Android.
  • Xcode logs для iOS.
  • В Protractor можно использовать console.log и дополнительные репортеры, такие как jasmine-spec-reporter.

Запуск тестов

Тесты запускаются стандартно через Protractor:

protractor protractor.conf.js

Для параллельного запуска на нескольких устройствах можно использовать multiCapabilities:

multiCapabilities: [
  {
    platformName: 'Android',
    deviceName: 'Pixel_5_API_31',
    app: '/path/to/app.apk'
  },
  {
    platformName: 'iOS',
    deviceName: 'iPhone 14',
    app: '/path/to/app.app'
  }
]

Особенности интеграции

  • Синхронизация Angular работает не всегда на мобильных приложениях, поэтому рекомендуется отключить автоматическую синхронизацию через browser.ignoreSynchronization = true.
  • Важно учитывать ограничения мобильных платформ: элементы могут быть недоступны до полной загрузки интерфейса. Использование browser.wait с ожидаемыми условиями критично.
  • Эмуляторы и реальные устройства ведут себя по-разному, что требует тестирования на реальных девайсах для точной проверки UI.

Работа с гибридными приложениями

Protractor позволяет работать с вебview в гибридных приложениях через переключение контекста:

const contexts = await browser.getContexts(); // ['NATIVE_APP', 'WEBVIEW_1']
await browser.switchContext('WEBVIEW_1');
// Теперь можно использовать стандартные Protractor команды для Angular

После завершения теста следует вернуть контекст на NATIVE_APP для работы с нативными элементами.

Best Practices

  • Использовать Page Object для структуры кода.
  • Применять explicit waits для элементов.
  • Сохранять логи для отладки.
  • Тестировать на разных разрешениях и устройствах.
  • Настраивать multiCapabilities для параллельного тестирования.

Эта интеграция позволяет создавать комплексные тестовые сценарии для мобильных приложений, используя знакомый синтаксис Protractor и возможности Appium для взаимодействия с мобильными устройствами.