Множественное наследование

Protractor — это специализированный инструмент для энд-ту-энд тестирования веб-приложений на базе Angular и AngularJS. Он построен на WebDriverJS и обеспечивает удобный интерфейс для взаимодействия с элементами DOM, ожиданиями и синхронизацией с асинхронными операциями Angular.

Ключевые возможности Protractor:

  • Автоматическая синхронизация с Angular-приложением: Protractor ожидает завершения всех асинхронных операций Angular перед выполнением действий.
  • Поддержка локаторов Angular, таких как by.model, by.binding, by.repeater.
  • Полная совместимость с WebDriver API для работы с любыми элементами DOM.
  • Возможность интеграции с фреймворками Jasmine, Mocha, Cucumber для организации тестов.

Установка и настройка

Установка 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

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 для удобного переиспользования.
  • Использовать ожидания для всех асинхронных операций.

Page Objects

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('Иван');
  });
});

Интеграция с CI/CD

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, явных ожиданий и грамотной конфигурации позволяет создавать стабильные, масштабируемые и поддерживаемые автотесты.