Appium — это инструмент для автоматизации мобильных приложений, поддерживающий как Android, так и iOS. Интеграция Appium с Protractor позволяет использовать возможности Protractor для тестирования Angular-приложений на мобильных устройствах, обеспечивая единый подход к тестированию веб и гибридных приложений.
Для начала необходимо установить следующие компоненты:
npm install -g protractor
npm install -g appium
npm install -g appium-doctor
appium-doctor
webdriver-manager update
Для iOS потребуется установка Xcode и
соответствующих командных инструментов, а для Android — Android
SDK и настройка переменных среды ANDROID_HOME.
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();
Другие важные действия:
Для удобства тестирования на мобильных устройствах рекомендуется использовать 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 поддерживает:
adb logcat для
Android.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'
}
]
browser.ignoreSynchronization = true.browser.wait с ожидаемыми условиями критично.Protractor позволяет работать с вебview в гибридных приложениях через переключение контекста:
const contexts = await browser.getContexts(); // ['NATIVE_APP', 'WEBVIEW_1']
await browser.switchContext('WEBVIEW_1');
// Теперь можно использовать стандартные Protractor команды для Angular
После завершения теста следует вернуть контекст на
NATIVE_APP для работы с нативными элементами.
Эта интеграция позволяет создавать комплексные тестовые сценарии для мобильных приложений, используя знакомый синтаксис Protractor и возможности Appium для взаимодействия с мобильными устройствами.