Protractor — это специализированный инструмент для энд-ту-энд тестирования веб-приложений на базе Angular и AngularJS. Он построен на WebDriverJS и обеспечивает удобный интерфейс для взаимодействия с элементами DOM, ожиданиями и синхронизацией с асинхронными операциями Angular.
Ключевые возможности Protractor:
by.model,
by.binding, by.repeater.Установка Protractor выполняется через npm:
npm install -g protractor
После установки необходимо обновить WebDriver:
webdriver-manager update
Запуск сервера WebDriver осуществляется командой:
webdriver-manager start
Конфигурационный файл (protractor.conf.js) определяет
основные параметры тестирования:
exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['tests/**/*.spec.js'],
capabilities: {
browserName: 'chrome'
},
baseUrl: 'http://localhost:4200',
allScriptsTimeout: 11000,
getPageTimeout: 10000
};
Основные параметры конфигурации:
framework — выбор фреймворка для тестов.seleniumAddress — адрес запущенного Selenium
Server.specs — массив путей к файлам тестов.capabilities — описание браузера и его настроек.baseUrl — базовый URL тестируемого приложения.allScriptsTimeout и getPageTimeout —
таймауты выполнения скриптов и загрузки страниц.Protractor расширяет стандартные локаторы WebDriver за счёт Angular-специфичных:
by.model('user.name') — находит элемент по привязке к
модели.by.binding('user.name') — находит элемент, содержащий
биндинг.by.repeater('item in items') — находит элементы внутри
повторяющегося блока ng-repeat.by.css и by.id — стандартные CSS и ID
селекторы.Пример использования локаторов:
element(by.model('user.name')).sendKeys('Иван');
element(by.binding('user.name')).getText().then(function(text) {
console.log(text);
});
Protractor предоставляет методы для взаимодействия с элементами:
click() — клик по элементу.sendKeys() — ввод текста.getText() — получение текста элемента.getAttribute('attr') — получение значения
атрибута.isDisplayed() и isEnabled() — проверка
видимости и доступности элемента.Пример:
let loginButton = element(by.id('login'));
loginButton.click();
element(by.model('user.password')).sendKeys('пароль123');
Protractor автоматически синхронизируется с Angular, но для
нестандартных сценариев используются явные ожидания через
ExpectedConditions:
let EC = protractor.ExpectedConditions;
let submitButton = element(by.id('submit'));
browser.wait(EC.elementToBeClickable(submitButton), 5000);
submitButton.click();
Возможные условия:
visibilityOf(element) — элемент видим.elementToBeClickable(element) — элемент
кликабелен.presenceOf(element) — элемент присутствует в DOM.Protractor поддерживает переключение между окнами и фреймами:
browser.getAllWindowHandles().then(function(handles) {
browser.switchTo().window(handles[1]);
});
browser.switchTo().frame(element(by.id('frame1')).getWebElement());
Protractor позволяет управлять размером окна, навигацией и очисткой сессии:
browser.manage().window().maximize();
browser.get('/login');
browser.manage().deleteAllCookies();
Тесты пишутся с использованием Jasmine или Mocha:
describe('Авторизация пользователя', function() {
it('должна входить с корректными данными', function() {
browser.get('/login');
element(by.model('user.name')).sendKeys('Иван');
element(by.model('user.password')).sendKeys('пароль123');
element(by.id('login')).click();
expect(element(by.binding('welcome')).getText()).toContain('Иван');
});
});
Рекомендации по структуре тестов:
describe для логической группировки
сценариев.it описывает отдельный тестовый кейс.Page Objects позволяют структурировать тесты и минимизировать дублирование кода. Пример:
class LoginPage {
constructor() {
this.username = element(by.model('user.name'));
this.password = element(by.model('user.password'));
this.loginButton = element(by.id('login'));
}
login(user, pass) {
this.username.sendKeys(user);
this.password.sendKeys(pass);
this.loginButton.click();
}
}
module.exports = new LoginPage();
Использование в тесте:
let loginPage = require('../pages/login.page');
describe('Тест авторизации', function() {
it('успешный вход', function() {
browser.get('/login');
loginPage.login('Иван', 'пароль123');
expect(element(by.binding('welcome')).getText()).toContain('Иван');
});
});
Protractor легко интегрируется с Jenkins, GitLab CI и другими инструментами автоматизации:
protractor protractor.conf.js.jasmine-reporters или
protractor-beautiful-reporter.multiCapabilities.Protractor позволяет получать детализированную информацию о прохождении тестов:
let JasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new JasmineReporters.JUnitXmlReporter({
savePath: 'test_results',
consolidateAll: false
}));
Это обеспечивает автоматическую генерацию XML и HTML отчетов для анализа результатов.
Protractor остаётся мощным инструментом для тестирования Angular-приложений, сочетая возможности WebDriver с расширенными локаторами и синхронизацией. Применение page objects, явных ожиданий и грамотной конфигурации позволяет создавать стабильные, масштабируемые и поддерживаемые автотесты.