В Protractor логирование играет ключевую роль при отладке и мониторинге выполнения тестов. Грамотно настроенный уровень логирования позволяет отслеживать поведение тестов, выявлять ошибки и оптимизировать тестовые сценарии без лишнего шума в консоли.
Protractor использует встроенный логгер, который базируется на модуле
selenium-webdriver. Логгер обеспечивает
вывод сообщений разных уровней:
DEBUG – подробная информация для
детальной отладки.INFO – основная информация о ходе
выполнения тестов.WARN – предупреждения, на которые
стоит обратить внимание, но они не прерывают выполнение.ERROR – критические ошибки, которые
требуют вмешательства.Каждое сообщение логгера сопровождается временем и уровнем важности, что упрощает анализ журнала тестов.
Уровень логирования задается через объект
config Protractor. Основной параметр для
этого — capabilities.loggingPrefs. Он
позволяет определить, какие сообщения и с каким уровнем должны
выводиться. Пример конфигурации:
exports.config = {
capabilities: {
browserName: 'chrome',
loggingPrefs: {
browser: 'ALL', // Лог браузера
driver: 'INFO', // Лог драйвера
client: 'DEBUG', // Лог клиентской части
server: 'WARNING' // Лог сервера Selenium
}
}
};
Ключевые моменты настройки:
browser – сообщения, выводимые в
консоль браузера. Позволяет отлавливать ошибки JS, предупреждения и
сообщения console.log.driver – логи самого WebDriver,
полезно для анализа взаимодействия с браузером.client – логи на стороне клиента
Protractor. Особенно полезно при отладке асинхронных операций.server – логи Selenium Server.
Рекомендуется включать на уровне WARNING или выше, чтобы не
перегружать вывод.Protractor предоставляет доступ к логам через объект
browser.manage().logs(). Основные
методы:
browser.manage().logs().get('browser').then(function(browserLogs) {
browserLogs.forEach(function(log){
console.log(`[${log.level.name}] ${log.message}`);
});
});
get() принимает тип лога
('browser', 'driver', 'client',
'server').level,
message и
timestamp.browser.manage().logs().get('browser').then(function(browserLogs) {
browserLogs.filter(log => log.level.name === 'SEVERE')
.forEach(log => console.error(log.message));
});
Иногда необходимо изменять уровень логирования во время выполнения
тестов. Protractor поддерживает динамическое управление через объект
webdriver.logging:
const { logging } = require('selenium-webdriver');
browser.manage().logs().get(logging.Type.BROWSER).then(logs => {
logs.forEach(log => console.log(log.message));
});
browser.manage().logs().setLevel(logging.Level.WARNING);
Это позволяет уменьшить объем логов на этапе массового выполнения тестов, оставив только критические сообщения.
INFO или WARNING, чтобы не захламлять
консоль.DEBUG или ALL для браузера и
клиента.Часто логирование комбинируют с автоматическим снятием скриншотов при ошибках:
afterEach(async () => {
const logs = await browser.manage().logs().get('browser');
logs.forEach(log => console.log(`[${log.level.name}] ${log.message}`));
const currentSpec = jasmine.getEnv().currentSpec;
if (currentSpec.failedExpectations.length > 0) {
const png = await browser.takeScreenshot();
const fs = require('fs');
fs.writeFileSync('screenshot.png', png, {encoding: 'base64'});
}
});
Такой подход позволяет не только фиксировать текст ошибок, но и визуально анализировать состояние страницы в момент сбоя.
Protractor легко интегрируется с внешними логирующими библиотеками, такими как winston или log4js, что дает гибкость в форматировании, ротации файлов и отправке логов на сервер. Например, можно настроить запись всех ошибок браузера в отдельный лог-файл с таймштампом:
const log4js = require('log4js');
log4js.configure({
appenders: { file: { type: 'file', filename: 'browser-errors.log' } },
categories: { default: { appenders: ['file'], level: 'error' } }
});
const logger = log4js.getLogger('default');
browser.manage().logs().get('browser').then(logs => {
logs.filter(log => log.level.name === 'SEVERE')
.forEach(log => logger.error(log.message));
});
Это обеспечивает централизованное хранение критических событий и упрощает анализ больших тестовых наборов.