Protractor построен поверх Selenium WebDriver и расширяет его возможностями для тестирования Angular-приложений. В основе лежит стандартный WebDriver-протокол, отвечающий за управление браузером: запуск, навигацию, поиск элементов, взаимодействие с DOM и получение состояния страницы. Protractor добавляет уровень синхронизации с Angular, автоматическое ожидание стабилизации приложения и дополнительные локаторы.
Ключевые компоненты:
Protractor устанавливается как npm-пакет и требует Node.js. Selenium Server и драйверы браузеров не входят в основной пакет и управляются отдельно.
npm install -g protractor
После установки необходимо загрузить Selenium Server и драйверы:
webdriver-manager update
В результате будут загружены:
selenium-server-standalone.jarchromedrivergeckodriver, iedriver,
edgedriverКаталог с бинарными файлами управляется WebDriver Manager и не требует ручной настройки путей.
WebDriver Manager может работать в двух режимах:
1. Локальный Selenium Server
webdriver-manager start
Запускается Selenium Hub на
http://localhost:4444/wd/hub. Protractor подключается к
нему через параметр seleniumAddress.
2. Прямое подключение к драйверу (Direct Connect)
Для Chrome и Firefox возможен запуск без Selenium Server. В этом случае Protractor управляет драйвером напрямую, что ускоряет выполнение тестов и упрощает инфраструктуру.
directConnect: true
Direct Connect не поддерживает сложные Grid-конфигурации и удалённые браузеры.
Все параметры инициализации WebDriver описываются в конфигурационном
файле, обычно protractor.conf.js.
exports.config = {
framework: 'jasmine',
specs: ['specs/**/*.spec.js'],
capabilities: {
browserName: 'chrome'
}
};
Объект capabilities напрямую передаётся WebDriver и
определяет тип браузера и его параметры.
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--disable-infobars', '--start-maximized']
}
}
Часто используемые аргументы:
--headless — запуск без UI--disable-gpu — обязательный параметр для
headless-режима на Windows--window-size=1920,1080 — фиксированный размер
окнаcapabilities: {
browserName: 'firefox',
'moz:firefoxOptions': {
args: ['-headless']
}
}
Для параллельного запуска используется
multiCapabilities:
multiCapabilities: [
{ browserName: 'chrome' },
{ browserName: 'firefox' }
]
Каждый capability создаёт отдельный экземпляр WebDriver.
При использовании Selenium Server или Grid указывается адрес хаба:
seleniumAddress: 'http://localhost:4444/wd/hub'
Для облачных сервисов (BrowserStack, Sauce Labs) дополнительно задаются параметры аутентификации:
capabilities: {
browserName: 'chrome',
'bstack:options': {
os: 'Windows',
osVersion: '10',
userName: process.env.BS_USER,
accessKey: process.env.BS_KEY
}
}
Protractor предоставляет хуки для работы с драйвером на разных этапах выполнения.
Вызывается перед запуском тестов, после инициализации WebDriver.
onPrepare: async () => {
await browser.manage().window().setSize(1366, 768);
browser.waitForAngularEnabled(true);
};
Типичные задачи:
Выполняется после завершения всех тестов.
onComplete: () => {
console.log('Тесты завершены');
};
WebDriver управляет тремя основными типами таймаутов:
browser.manage().timeouts().implicitlyWait(5000);
browser.manage().timeouts().pageLoadTimeout(30000);
browser.manage().timeouts().setScriptTimeout(30000);
В Protractor implicit wait используется редко, предпочтение отдаётся явным ожиданиям.
Одно из ключевых отличий Protractor — автоматическая синхронизация с Angular.
По умолчанию:
$http и $timeoutДля не-Angular страниц синхронизацию необходимо отключить:
browser.waitForAngularEnabled(false);
Это важно при тестировании страниц авторизации, внешних сервисов или hybrid-приложений.
В сложных сценариях может потребоваться управление несколькими браузерами одновременно.
const browser2 = await browser.forkNewDriverInstance();
await browser.get('https://app1.example.com');
await browser2.get('https://app2.example.com');
Каждый экземпляр имеет собственную сессию WebDriver и независимое состояние.
Для диагностики проблем используются:
Получение логов браузера:
browser.manage().logs().get('browser').then(logs => {
logs.forEach(log => {
console.log(log.message);
});
});
Это особенно полезно для выявления JavaScript-ошибок, влияющих на стабильность тестов.
WebDriver поддерживает передачу произвольных параметров драйверу:
capabilities: {
browserName: 'chrome',
acceptInsecureCerts: true,
unexpectedAlertBehaviour: 'accept'
}
Расширенные настройки позволяют:
Несовпадение версий браузера и драйвера Решается
обновлением через webdriver-manager update.
Зависание тестов при ожидании Angular Причина —
некорректная инициализация Angular или сторонние скрипты. Используется
waitForAngularEnabled(false).
Проблемы с headless-режимом Часто связаны с отсутствием размера окна или GPU-параметров.
Грамотная загрузка и настройка WebDriver в Protractor определяет стабильность, скорость и предсказуемость тестов. Конфигурация драйвера должна учитывать тип приложения, инфраструктуру запуска и требования к параллельности, а также особенности браузеров и среды выполнения.