Глобальная обработка ошибок

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


Ошибки тестового кода

  • синтаксические и логические ошибки JavaScript
  • необработанные исключения в хуках beforeAll, beforeEach, afterEach
  • некорректная работа с асинхронностью

Ошибки WebDriver

  • NoSuchElementError
  • StaleElementReferenceError
  • таймауты ожиданий
  • ошибки навигации и сессии браузера

Ошибки приложения

  • JavaScript-исключения в браузере
  • ошибки Angular-зоны
  • сетевые сбои, влияющие на состояние UI

Асинхронность и необработанные отклонения Promise

Protractor исторически использовал Control Flow, позже перешёл на нативные async/await. Независимо от подхода, глобальная обработка должна перехватывать необработанные отклонения.

process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled Rejection:', reason);
  throw reason;
});

Такой обработчик предотвращает «тихие» падения, когда тест завершается без явной причины в отчёте.


Глобальные хуки в конфигурации Protractor

onPrepare

onPrepare выполняется перед запуском всех спецификаций и является ключевой точкой инициализации глобальной обработки.

exports.config = {
  onPrepare: async () => {
    browser.ignoreSynchronization = false;
  }
};

Здесь же подключаются репортёры и обработчики ошибок тестового фреймворка.


Интеграция с Jasmine: перехват падений спецификаций

Jasmine позволяет добавлять кастомные репортёры, которые получают информацию обо всех ошибках тестов.

jasmine.getEnv().addReporter({
  specDone: async (result) => {
    if (result.status === 'failed') {
      const png = await browser.takeScreenshot();
      // сохранение скриншота
    }
  }
});

Такой подход обеспечивает:

  • единый механизм фиксации ошибок
  • автоматическое создание артефактов (скриншоты, логи)
  • независимость от конкретных спецификаций

Глобальный afterEach как уровень защиты

Хук afterEach часто используется как дополнительный слой перехвата ошибок, связанных с состоянием браузера.

afterEach(async () => {
  const logs = await browser.manage().logs().get('browser');
  const severe = logs.filter(l => l.level.name === 'SEVERE');
  if (severe.length) {
    throw new Error('Browser console errors detected');
  }
});

Это позволяет считать ошибкой теста любые критические сообщения в консоли приложения.


Перехват JavaScript-ошибок в браузере

Ошибки, возникающие внутри страницы, не всегда приводят к падению теста. Для их фиксации используется внедрение обработчика window.onerror.

await browser.executeScript(() => {
  window.__errors = [];
  window.oner ror = function (msg, url, line, col, error) {
    window.__errors.push({ msg, url, line, col });
  };
});

Позже эти данные извлекаются и анализируются после выполнения теста. Такой механизм особенно важен для SPA-приложений, где UI может выглядеть корректно при наличии внутренних ошибок.


Работа с таймаутами и ожиданиями

Глобальная стратегия обработки ошибок невозможна без унификации ожиданий.

browser.manage().timeouts().implicitlyWait(0);
browser.manage().timeouts().pageLoadTimeout(60000);
browser.manage().timeouts().scriptTimeout(30000);

Для явных ожиданий используется ExpectedConditions, а таймауты оформляются в виде общих утилит, выбрасывающих информативные исключения.


Обработка ошибок синхронизации Angular

Protractor ожидает стабильности Angular-приложения. При ошибках $http или зависших таймерах тесты могут зависать.

browser.waitForAngularEnabled(true);

В нестандартных сценариях глобально отключается синхронизация и используется ручной контроль ожиданий. Ошибки в зоне Angular в таком случае фиксируются через консоль браузера.


Централизованное логирование

Глобальная обработка ошибок теряет смысл без единого хранилища логов. Обычно фиксируются:

  • stack trace исключения
  • URL страницы
  • состояние DOM или ключевых элементов
  • логи браузера и драйвера

Информация собирается в одном месте и сохраняется независимо от причины падения теста.


Обработка ошибок в onComplete

Финальный этап выполнения тестов используется для анализа накопленных ошибок и корректного завершения процесса.

exports.config = {
  onComplete: () => {
    // агрегация логов и очистка ресурсов
  }
};

Это особенно важно при интеграции с CI-системами, где статус сборки зависит от корректного завершения всех обработчиков.


Стратегия отказоустойчивости

Глобальная обработка ошибок в Protractor строится на нескольких принципах:

  • ни одна ошибка не должна быть проигнорирована
  • источник ошибки должен быть максимально детализирован
  • диагностика не должна зависеть от конкретного теста
  • инфраструктурные сбои должны отличаться от дефектов приложения

Такая архитектура превращает набор UI-тестов из хрупкого инструмента в надёжный механизм контроля качества, где каждая ошибка имеет предсказуемый и воспроизводимый путь обработки.