Логирование ошибок в Protractor играет ключевую роль при построении надёжных e2e-тестов для Angular-приложений. При росте тестового набора и усложнении инфраструктуры простого вывода stack trace становится недостаточно — требуется структурированная, воспроизводимая и анализируемая система логирования.
Ошибки в Protractor можно условно разделить на несколько категорий:
Возникают на уровне взаимодействия с браузером:
NoSuchElementErrorStaleElementReferenceErrorTimeoutErrorПроявляются при:
waitForAngularСвязаны с:
Каждый тип ошибки требует разного уровня детализации в логах.
По умолчанию Protractor использует Jasmine или Mocha как тестовый фреймворк. Ошибки выводятся в консоль в виде:
Такой вывод ограничен:
browser.manage().logs()WebDriver позволяет получать логи браузера:
browser.manage().logs().get('browser').then(function(logs) {
logs.forEach(function(log) {
console.log(log.message);
});
});
browser — console.log,
console.errordriver — внутренние логи WebDriverperformance — сетевые событияОсобенно ценны console.error, так как позволяют выявлять
JavaScript-ошибки приложения, не приводящие к падению теста
напрямую.
afterEach для сбора
информацииafterEach(async function () {
const logs = await browser.manage().logs().get('browser');
logs
.filter(log => log.level.name === 'SEVERE')
.forEach(log => console.error(log.message));
});
Преимущества:
Скриншот является важным визуальным логом.
afterEach(async function () {
const spec = jasmine.getEnv().currentSpec;
if (spec.result.failedExpectations.length > 0) {
const png = await browser.takeScreenshot();
// сохранение в файл
}
});
Практика:
Использование console.log не масштабируется. Чаще
применяется библиотека логирования.
winstonconst winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
Применение в тестах:
try {
await element(by.css('.submit')).click();
} catch (e) {
logger.error('Ошибка клика по кнопке submit', {
error: e.message,
stack: e.stack
});
throw e;
}
Преимущества:
Page Object — ключевая точка логирования ошибок взаимодействия.
class LoginPage {
async login(user, pass) {
try {
await this.username.sendKeys(user);
await this.password.sendKeys(pass);
await this.submit.click();
} catch (e) {
logger.error('Ошибка логина', {
user,
error: e.message
});
throw e;
}
}
}
Подход позволяет:
Ожидания — частый источник нестабильности.
await browser.wait(
EC.visibilityOf(el),
5000,
'Элемент не стал видимым'
);
При логировании:
catch (e) {
logger.warn('Timeout ожидания элемента', {
selector: '.modal',
url: await browser.getCurrentUrl()
});
throw e;
}
Создание утилиты-обёртки:
async function safeStep(description, fn) {
try {
await fn();
} catch (e) {
logger.error(description, {
error: e.message,
stack: e.stack
});
throw e;
}
}
Использование:
await safeStep('Открытие страницы логина', async () => {
await browser.get('/login');
});
Подход формирует единый стиль логов по всему проекту.
При запуске в CI:
Рекомендуемая структура:
logs/
├─ browser.log
├─ errors.log
screenshots/
├─ login_spec_2024-01-12.png
При использовании Allure или аналогов:
Это превращает логирование из вспомогательного инструмента в полноценный диагностический механизм.
info, warn,
errorЛогирование ошибок в Protractor — это не побочный эффект падения теста, а системный процесс сбора информации, позволяющий быстро находить причину нестабильности и дефектов как в тестах, так и в самом приложении.