Глобальная обработка ошибок в Protractor решает задачу централизованного перехвата, анализа и логирования сбоев, возникающих на разных уровнях: в тестовом коде, в асинхронных операциях WebDriver, в самом браузере и внутри Angular-приложения. Без такой обработки тестовый набор быстро превращается в источник нестабильных и плохо диагностируемых падений.
Ошибки тестового кода
beforeAll,
beforeEach, afterEachОшибки WebDriver
NoSuchElementErrorStaleElementReferenceErrorОшибки приложения
Protractor исторически использовал Control Flow, позже перешёл на
нативные async/await. Независимо от подхода, глобальная
обработка должна перехватывать необработанные отклонения.
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection:', reason);
throw reason;
});
Такой обработчик предотвращает «тихие» падения, когда тест завершается без явной причины в отчёте.
onPrepareonPrepare выполняется перед запуском всех спецификаций и
является ключевой точкой инициализации глобальной обработки.
exports.config = {
onPrepare: async () => {
browser.ignoreSynchronization = false;
}
};
Здесь же подключаются репортёры и обработчики ошибок тестового фреймворка.
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');
}
});
Это позволяет считать ошибкой теста любые критические сообщения в консоли приложения.
Ошибки, возникающие внутри страницы, не всегда приводят к падению
теста. Для их фиксации используется внедрение обработчика
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, а
таймауты оформляются в виде общих утилит, выбрасывающих информативные
исключения.
Protractor ожидает стабильности Angular-приложения. При ошибках
$http или зависших таймерах тесты могут зависать.
browser.waitForAngularEnabled(true);
В нестандартных сценариях глобально отключается синхронизация и используется ручной контроль ожиданий. Ошибки в зоне Angular в таком случае фиксируются через консоль браузера.
Глобальная обработка ошибок теряет смысл без единого хранилища логов. Обычно фиксируются:
Информация собирается в одном месте и сохраняется независимо от причины падения теста.
onCompleteФинальный этап выполнения тестов используется для анализа накопленных ошибок и корректного завершения процесса.
exports.config = {
onComplete: () => {
// агрегация логов и очистка ресурсов
}
};
Это особенно важно при интеграции с CI-системами, где статус сборки зависит от корректного завершения всех обработчиков.
Глобальная обработка ошибок в Protractor строится на нескольких принципах:
Такая архитектура превращает набор UI-тестов из хрупкого инструмента в надёжный механизм контроля качества, где каждая ошибка имеет предсказуемый и воспроизводимый путь обработки.