Protractor является инструментом для энд-ту-энд тестирования Angular и AngularJS приложений. В контексте CI/CD его основная задача — автоматическая проверка функциональности на различных этапах сборки проекта. Для корректной работы в CI окружении необходимо учитывать особенности:
Для работы в CI окружении требуется корректная установка Node.js и Protractor. Минимальный набор:
npm install -g protractor
webdriver-manager update
webdriver-manager скачивает необходимые бинарные файлы
для Selenium Server и драйверы для браузеров. В CI лучше использовать
локальный запуск драйверов через directConnect, чтобы не
зависеть от отдельного Selenium сервера:
exports.config = {
directConnect: true,
capabilities: {
'browserName': 'chrome',
chromeOptions: {
args: ['--headless', '--disable-gpu', '--window-size=1920,1080']
}
},
framework: 'jasmine',
specs: ['specs/**/*.spec.js'],
};
В CI окружении графический интерфейс отсутствует, поэтому обязательна конфигурация headless режима для Chrome или Firefox. Для Chrome:
chromeOptions: {
args: [
'--headless',
'--disable-gpu',
'--no-sandbox',
'--disable-dev-shm-usage',
'--window-size=1920,1080'
]
}
Параметры --no-sandbox и
--disable-dev-shm-usage критичны для Docker контейнеров и
Linux серверов, где sandboxing может блокировать запуск браузера.
CI окружения могут иметь нестабильную производительность, поэтому важно корректно настраивать таймауты:
allScriptsTimeout: 11000,
getPageTimeout: 10000,
jasmineNodeOpts: {
defaultTimeoutInterval: 30000
}
allScriptsTimeout определяет время ожидания выполнения
скриптов в браузере, getPageTimeout — время загрузки
страницы. Таймаут Jasmine defaultTimeoutInterval
предотвращает преждевременное завершение долгих тестов.
Protractor легко интегрируется с популярными CI/CD платформами: Jenkins, GitLab CI, GitHub Actions, TeamCity. Основные принципы:
webdriver-manager update --standalone
"scripts": {
"test:e2e": "protractor protractor.conf.js"
}
Для стабильной отладки важно сохранять логи и результаты прогонов.
Protractor поддерживает интеграцию с различными репортерами, например
jasmine-spec-reporter:
const { SpecReporter } = require('jasmine-spec-reporter');
onPrepare: () => {
jasmine.getEnv().addReporter(new SpecReporter({
spec: { displayStacktrace: true }
}));
}
Для CI полезно сохранять скриншоты при падении теста:
afterEach(async function() {
const fs = require('fs');
const path = require('path');
if (this.currentTest.failedExpectations.length > 0) {
const png = await browser.takeScreenshot();
const filePath = path.resolve('reports/screenshots', `${this.currentTest.description}.png`);
fs.writeFileSync(filePath, png, { encoding: 'base64' });
}
});
Для ускорения прогонов можно использовать параллельное выполнение
через shardTestFiles:
capabilities: {
browserName: 'chrome',
shardTestFiles: true,
maxInstances: 3,
chromeOptions: { args: ['--headless'] }
}
Каждый shard запускает отдельный экземпляр браузера с
частью тестов, что снижает общее время выполнения.
В CI окружениях часто используется Docker для изоляции. Важно учитывать:
selenium/standalone-chrome или
node:20-bullseye + установка Chrome).--no-sandbox и
--disable-dev-shm-usage для корректного запуска
браузера.spec файлы для
параллельного запуска.Эти шаги обеспечивают стабильный, быстрый и воспроизводимый запуск Protractor тестов в любом CI/CD окружении.