Protractor — инструмент для энд-ту-энд тестирования Angular и не-Angular приложений на JavaScript. В процессе выполнения тестов нередко возникают ошибки, вызванные синхронизацией, нестабильностью элементов на странице или непредвиденными исключениями. Умение корректно восстанавливаться после ошибок является ключевым аспектом надежного автоматизированного тестирования.
try-catchОсновной способ перехвата ошибок в Protractor — использование
конструкции try-catch. Это позволяет предотвратить полное
завершение теста при возникновении ошибки и реализовать стратегию
восстановления.
it('должен безопасно кликнуть по кнопке', async () => {
try {
const button = element(by.css('.submit-btn'));
await button.click();
} catch (error) {
console.error('Не удалось кликнуть по кнопке:', error.message);
// Альтернативное действие для восстановления
const fallbackButton = element(by.css('.alternative-btn'));
await fallbackButton.click();
}
});
Ключевые моменты:
catch, иначе теряется
информация о причине ошибки.Большинство ошибок в Protractor связано с тем, что элемент ещё не
готов к взаимодействию. Методы ExpectedConditions позволяют
задавать условия, при которых действие будет выполняться безопасно.
const EC = protractor.ExpectedConditions;
const inputField = element(by.css('#username'));
await browser.wait(EC.visibilityOf(inputField), 5000, 'Поле username не появилось');
await inputField.sendKeys('test_user');
Особенности:
visibilityOf, elementToBeClickable,
presenceOf — самые часто используемые условия.Иногда ошибка возникает не системно, а случайно из-за временных факторов (например, загрузка страницы). В таких случаях полезно реализовать механизм повторных попыток (retry).
async function clickWithRetry(element, attempts = 3) {
for (let i = 0; i < attempts; i++) {
try {
await element.click();
return;
} catch (err) {
if (i === attempts - 1) throw err;
await browser.sleep(500); // пауза перед повтором
}
}
}
Преимущества метода:
Для анализа ошибок часто используется автоматическое создание скриншотов. Protractor предоставляет возможности работы с браузерными снимками.
afterEach(async function() {
if (this.currentTest.state === 'failed') {
const png = await browser.takeScreenshot();
const fs = require('fs');
fs.writeFileSync(`./screenshots/${this.currentTest.title}.png`, png, { encoding: 'base64' });
}
});
Рекомендации:
После возникновения ошибки важно вернуть приложение в стабильное состояние, чтобы последующие тесты не были нарушены. Основные подходы:
browser.refresh().try {
await element(by.css('.dangerous-action')).click();
} catch (err) {
console.warn('Действие не удалось, выполняется восстановление');
await browser.refresh();
}
Принцип: всегда предусматривать шаги по восстановлению до следующей ключевой проверки теста.
Логирование ошибок должно быть структурированным. Вместо простого
console.log рекомендуется использовать модули вроде
winston или log4js, чтобы хранить:
Это облегчает диагностику проблем и позволяет выявлять систематические сбои, а не только случайные.
Эффективная обработка ошибок и восстановление после них делают тесты на Protractor стабильными и надежными, что особенно важно при работе с динамическими и сложными веб-приложениями.