Управление логами браузера

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


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

Protractor использует WebDriver для взаимодействия с браузером. Для доступа к логам необходимо настроить capabilities в конфигурационном файле protractor.conf.js. Основной параметр, влияющий на логирование, — loggingPrefs. Пример:

capabilities: {
  browserName: 'chrome',
  chromeOptions: {
    args: ['--disable-infobars']
  },
  loggingPrefs: {
    browser: 'ALL',
    driver: 'INFO',
    performance: 'ALL'
  }
}
  • browser — логи, генерируемые веб-страницей (JavaScript, ошибки, предупреждения).
  • driver — логи самого WebDriver.
  • performance — данные о производительности, сетевых запросах, рендеринге.

Значения могут быть OFF, SEVERE, WARNING, INFO, DEBUG, ALL.


Получение логов браузера

Для получения логов используется метод browser.manage().logs().get(). Пример получения ошибок Jav * aScript:

it('должен выводить ошибки браузера', async () => {
  await browser.get('https://example.com');

  const logs = await browser.manage().logs().get('browser');
  logs.forEach(entry => {
    if (entry.level.name === 'SEVERE') {
      console.error(`[JS ERROR] ${entry.message}`);
    }
  });
});

Особенности:

  • Логи возвращаются в виде массива объектов LogEntry, содержащих level, message и timestamp.
  • level — уровень события (SEVERE, WARNING, INFO и т.д.).
  • message — текст сообщения, который может содержать стек-трейс ошибок.
  • timestamp — время события в миллисекундах с начала эпохи UNIX.

Фильтрация и обработка логов

Для удобного анализа логов полезно фильтровать их по уровню или типу сообщения. Например, вывод только предупреждений:

const warnings = logs.filter(entry => entry.level.name === 'WARNING');
warnings.forEach(entry => console.warn(`[JS WARNING] ${entry.message}`));

Можно реализовать интеграцию с системами отчетности, записывая лог-сообщения в отдельные файлы:

const fs = require('fs');

fs.writeFileSync('browser_logs.json', JSON.stringify(logs, null, 2));

Такой подход позволяет сохранять все события браузера для последующего анализа.


Логи сетевых запросов и производительности

ChromeDriver поддерживает логирование сети через performance:

const perfLogs = await browser.manage().logs().get('performance');
perfLogs.forEach(entry => {
  const message = JSON.parse(entry.message).message;
  console.log(message.method, message.params);
});
  • method — тип события (Network.requestWillBeSent, Network.responseReceived и др.).
  • params — объект с подробной информацией о запросе или ответе.

Использование производительных логов особенно полезно для:

  • Отслеживания AJAX-запросов.
  • Анализа времени загрузки ресурсов.
  • Поиска медленных или неуспешных сетевых вызовов.

Логирование на уровне тестов

Для интеграции с фреймворками вроде Jasmine или Mocha можно добавлять проверку логов в afterEach:

afterEach(async () => {
  const logs = await browser.manage().logs().get('browser');
  const errors = logs.filter(entry => entry.level.name === 'SEVERE');
  if (errors.length > 0) {
    console.error('Обнаружены ошибки JS:', errors.map(e => e.message).join('\n'));
  }
});

Такой подход позволяет автоматически фиксировать ошибки JavaScript после каждого теста, что повышает надежность тестовой среды.


Советы по оптимизации

  1. Не запрашивать логи постоянно — это может замедлять тесты. Получение логов следует выполнять по необходимости, например, после действия, вызывающего потенциальную ошибку.
  2. Использовать фильтрацию на уровне WebDriver — в Chrome можно настроить логирование только нужных категорий через loggingPrefs, чтобы уменьшить объем данных.
  3. Комбинировать с инструментами мониторинга — сохранение логов в JSON или подключение к ELK Stack позволяет анализировать тенденции ошибок и производительность приложений.

Особенности работы с различными браузерами

  • Chrome — поддерживает browser, driver, performance, детализированные логи.
  • Firefox — поддержка логов браузера и драйвера, но performance реализовано частично.
  • Edge — аналогично Chrome, совместим с DevTools Protocol.
  • Safari — ограниченная поддержка логов, часто рекомендуется использовать внешние инструменты для детального анализа.

Эти различия необходимо учитывать при разработке кросс-браузерных тестов, чтобы обработка логов была корректной для всех сред.


Итоговые рекомендации

  • Использовать loggingPrefs для настройки уровней логов.
  • Получать логи через browser.manage().logs().get() после ключевых действий.
  • Фильтровать и структурировать данные для удобного анализа.
  • Хранить логи для последующего аудита и интеграции с системами отчетности.
  • Учитывать различия между браузерами при реализации универсальных тестов.

Эффективное управление логами браузера повышает качество автоматизированного тестирования, помогает быстро выявлять ошибки и улучшает понимание поведения веб-приложения в различных условиях.