Загрузка и настройка WebDriver

Protractor построен поверх Selenium WebDriver и расширяет его возможностями для тестирования Angular-приложений. В основе лежит стандартный WebDriver-протокол, отвечающий за управление браузером: запуск, навигацию, поиск элементов, взаимодействие с DOM и получение состояния страницы. Protractor добавляет уровень синхронизации с Angular, автоматическое ожидание стабилизации приложения и дополнительные локаторы.

Ключевые компоненты:

  • Selenium WebDriver — низкоуровневый механизм управления браузером
  • Browser — объект Protractor, инкапсулирующий WebDriver
  • WebDriver Manager — утилита для загрузки и управления бинарными драйверами
  • Config — конфигурация запуска тестов и инициализации драйвера

Установка зависимостей и подготовка окружения

Protractor устанавливается как npm-пакет и требует Node.js. Selenium Server и драйверы браузеров не входят в основной пакет и управляются отдельно.

npm install -g protractor

После установки необходимо загрузить Selenium Server и драйверы:

webdriver-manager update

В результате будут загружены:

  • selenium-server-standalone.jar
  • chromedriver
  • при необходимости geckodriver, iedriver, edgedriver

Каталог с бинарными файлами управляется WebDriver Manager и не требует ручной настройки путей.

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

Все параметры инициализации WebDriver описываются в конфигурационном файле, обычно protractor.conf.js.

Базовая структура конфигурации

exports.config = {
  framework: 'jasmine',
  specs: ['specs/**/*.spec.js'],
  capabilities: {
    browserName: 'chrome'
  }
};

Объект capabilities напрямую передаётся WebDriver и определяет тип браузера и его параметры.

Настройка браузеров

Chrome

capabilities: {
  browserName: 'chrome',
  chromeOptions: {
    args: ['--disable-infobars', '--start-maximized']
  }
}

Часто используемые аргументы:

  • --headless — запуск без UI
  • --disable-gpu — обязательный параметр для headless-режима на Windows
  • --window-size=1920,1080 — фиксированный размер окна

Firefox

capabilities: {
  browserName: 'firefox',
  'moz:firefoxOptions': {
    args: ['-headless']
  }
}

Несколько браузеров

Для параллельного запуска используется multiCapabilities:

multiCapabilities: [
  { browserName: 'chrome' },
  { browserName: 'firefox' }
]

Каждый capability создаёт отдельный экземпляр WebDriver.

Selenium Address и удалённые драйверы

При использовании 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
  }
}

Управление жизненным циклом WebDriver

Protractor предоставляет хуки для работы с драйвером на разных этапах выполнения.

onPrepare

Вызывается перед запуском тестов, после инициализации WebDriver.

onPrepare: async () => {
  await browser.manage().window().setSize(1366, 768);
  browser.waitForAngularEnabled(true);
};

Типичные задачи:

  • настройка размера окна
  • регистрация кастомных матчеров
  • глобальные ожидания и таймауты

onComplete

Выполняется после завершения всех тестов.

onComplete: () => {
  console.log('Тесты завершены');
};

Таймауты и ожидания WebDriver

WebDriver управляет тремя основными типами таймаутов:

browser.manage().timeouts().implicitlyWait(5000);
browser.manage().timeouts().pageLoadTimeout(30000);
browser.manage().timeouts().setScriptTimeout(30000);
  • implicitlyWait — ожидание при поиске элементов
  • pageLoadTimeout — загрузка страницы
  • setScriptTimeout — выполнение асинхронных скриптов

В Protractor implicit wait используется редко, предпочтение отдаётся явным ожиданиям.

Синхронизация с Angular

Одно из ключевых отличий Protractor — автоматическая синхронизация с Angular.

По умолчанию:

  • ожидается завершение $http и $timeout
  • отслеживается стабильность зоны выполнения

Для не-Angular страниц синхронизацию необходимо отключить:

browser.waitForAngularEnabled(false);

Это важно при тестировании страниц авторизации, внешних сервисов или hybrid-приложений.

Работа с несколькими экземплярами WebDriver

В сложных сценариях может потребоваться управление несколькими браузерами одновременно.

const browser2 = await browser.forkNewDriverInstance();

await browser.get('https://app1.example.com');
await browser2.get('https://app2.example.com');

Каждый экземпляр имеет собственную сессию WebDriver и независимое состояние.

Логирование и отладка WebDriver

Для диагностики проблем используются:

  • логи Selenium Server
  • логи браузера
  • stack trace WebDriver

Получение логов браузера:

browser.manage().logs().get('browser').then(logs => {
  logs.forEach(log => {
    console.log(log.message);
  });
});

Это особенно полезно для выявления JavaScript-ошибок, влияющих на стабильность тестов.

Кастомные capabilities и расширенные настройки

WebDriver поддерживает передачу произвольных параметров драйверу:

capabilities: {
  browserName: 'chrome',
  acceptInsecureCerts: true,
  unexpectedAlertBehaviour: 'accept'
}

Расширенные настройки позволяют:

  • игнорировать SSL-ошибки
  • управлять поведением alert-окон
  • настраивать прокси

Типичные проблемы при настройке WebDriver

Несовпадение версий браузера и драйвера Решается обновлением через webdriver-manager update.

Зависание тестов при ожидании Angular Причина — некорректная инициализация Angular или сторонние скрипты. Используется waitForAngularEnabled(false).

Проблемы с headless-режимом Часто связаны с отсутствием размера окна или GPU-параметров.


Грамотная загрузка и настройка WebDriver в Protractor определяет стабильность, скорость и предсказуемость тестов. Конфигурация драйвера должна учитывать тип приложения, инфраструктуру запуска и требования к параллельности, а также особенности браузеров и среды выполнения.