Конфигурация уровня логирования

В Protractor логирование играет ключевую роль при отладке и мониторинге выполнения тестов. Грамотно настроенный уровень логирования позволяет отслеживать поведение тестов, выявлять ошибки и оптимизировать тестовые сценарии без лишнего шума в консоли.

Встроенный логгер 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
    }
  }
};

Ключевые моменты настройки:

  1. browser – сообщения, выводимые в консоль браузера. Позволяет отлавливать ошибки JS, предупреждения и сообщения console.log.
  2. driver – логи самого WebDriver, полезно для анализа взаимодействия с браузером.
  3. client – логи на стороне клиента Protractor. Особенно полезно при отладке асинхронных операций.
  4. 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 для браузера и клиента.
  • Сохранять логи в отдельные файлы с указанием времени выполнения облегчает анализ после прогона большого набора тестов.
  • В интеграции с CI/CD системы логирование помогает отслеживать проблемы на удалённых серверах без доступа к графическому интерфейсу браузера.

Логирование ошибок и скриншоты

Часто логирование комбинируют с автоматическим снятием скриншотов при ошибках:

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));
});

Это обеспечивает централизованное хранение критических событий и упрощает анализ больших тестовых наборов.