В e2e-тестировании на Protractor исключения возникают регулярно: элементы не находятся, ожидания истекают, Angular не стабилизируется, браузер теряет сессию. Без осознанной обработки таких ситуаций тесты становятся нестабильными, а отчёты — малоинформативными. Грамотно выстроенная система обработки исключений позволяет отличать реальные дефекты от инфраструктурных сбоев, управлять поведением тестов и повышать доверие к результатам прогонов.
Исключения WebDriver (WebDriverJS) Возникают на уровне Selenium:
NoSuchElementErrorTimeoutErrorStaleElementReferenceErrorElementNotInteractableErrorИсключения Protractor Связаны с Angular-спецификой:
waitForAngularbrowser.waitЛогические ошибки теста Возникают в пользовательском коде:
Protractor работает поверх Promise API. Исключения не выбрасываются синхронно, а передаются через цепочки промисов. Это принципиально влияет на способы перехвата ошибок.
Неверный подход:
try {
element(by.id('save')).click();
} catch (e) {
// не сработает
}
Корректная обработка:
element(by.id('save')).click().catch(err => {
// обработка ошибки
});
При использовании async/await обработка становится более
читаемой:
try {
await element(by.id('save')).click();
} catch (err) {
// обработка ошибки
}
Перехват ошибок внутри it
Позволяет:
Пример:
it('должен сохранить форму', async () => {
try {
await saveForm();
await expectSuccessMessage();
} catch (err) {
await browser.takeScreenshot();
throw err;
}
});
Ключевой момент — повторное выбрасывание исключения, иначе тест будет помечен как успешный.
Использование process.on
Позволяет перехватывать необработанные ошибки:
process.on('unhandledRejection', reason => {
console.error('Unhandled Promise:', reason);
});
Применяется для:
browser.wait)Ожидания — один из самых частых источников исключений.
Пример с кастомным сообщением:
await browser.wait(
EC.visibilityOf(element(by.css('.alert'))),
5000,
'Сообщение не появилось'
);
Преимущества:
Иногда падение — корректное поведение системы. В таких случаях исключение должно быть частью сценария.
Пример проверки отсутствия элемента:
const isPresent = await element(by.id('modal')).isPresent();
expect(isPresent).toBe(false);
Альтернативный вариант с перехватом:
try {
await element(by.id('modal')).getText();
fail('Модальное окно не должно существовать');
} catch (err) {
expect(err.name).toBe('NoSuchElementError');
}
beforeEach, afterEach)Ошибки в хуках особенно критичны — они могут прервать целый набор тестов.
afterEach и гарантированное
выполнение
Для операций очистки:
afterEach(async () => {
try {
await logout();
} catch (err) {
console.warn('Ошибка при выходе:', err);
}
});
Здесь исключение намеренно не пробрасывается, чтобы не маскировать основную причину падения теста.
Обработка исключений часто дополняется:
Пример:
catch (err) {
const screenshot = await browser.takeScreenshot();
saveScreenshot(screenshot);
throw err;
}
Это особенно важно при использовании Allure, ReportPortal или собственных репортинговых решений.
Ошибки Angular часто выглядят как таймауты ожидания стабильности.
Управление:
browser.waitForAngularEnabled(false);
Применяется для:
Некорректная синхронизация приводит к ложным исключениям и нестабильным тестам.
Минимизация перехвата Исключения обрабатываются только там, где это оправдано логикой сценария.
Явные ожидания вместо неявных Чёткие условия уменьшают количество таймаутов.
Осмысленные сообщения об ошибках Каждое выброшенное исключение должно объяснять причину сбоя.
Единый подход к логированию Все исключения обрабатываются по одинаковым правилам.
try/catchbrowser.sleep для обхода исключенийГрамотно выстроенная обработка исключений в Protractor:
Исключения перестают быть источником хаоса и становятся управляемым механизмом диагностики и контроля поведения системы.