Структурированное логирование является важным инструментом при автоматизированном тестировании с использованием Playwright на JavaScript. Оно позволяет собирать подробную информацию о выполнении тестов, легко фильтровать события и интегрировать логи с системами мониторинга и анализа.
1. Форматирование логов: Логи представляются в формате JSON, где каждая запись содержит одинаковую структуру полей. Основные поля включают:
timestamp — время события в формате ISO 8601.level — уровень логирования (info,
warn, error, debug).message — краткое описание события.context — объект с дополнительными данными (например,
URL страницы, селекторы, результаты действий).Пример JSON-записи:
{
"timestamp": "2026-01-09T12:30:45.123Z",
"level": "info",
"message": "Страница загружена успешно",
"context": {
"url": "https://example.com",
"responseStatus": 200
}
}
2. Разделение логов по уровням:
info — основная информация о ходе выполнения
тестов.debug — детальная информация, полезная для
отладки.warn — потенциальные проблемы, не прерывающие
выполнение.error — ошибки, которые влияют на выполнение
теста.Playwright не предоставляет встроенного структурированного
логирования для тестов, но его легко реализовать через стандартные
возможности JavaScript и внешние библиотеки, например pino
или winston.
Пример использования pino:
import { test } from '@playwright/test';
import pino from 'pino';
const logger = pino({
level: 'debug',
formatters: {
level(label) {
return { level: label };
}
},
timestamp: pino.stdTimeFunctions.isoTime
});
test('Пример структурированного логирования', async ({ page }) => {
logger.info({ message: 'Начало теста', context: { testName: 'Пример теста' } });
await page.goto('https://example.com');
logger.info({ message: 'Страница открыта', context: { url: page.url() } });
const title = await page.title();
logger.debug({ message: 'Заголовок страницы', context: { title } });
if (title !== 'Example Domain') {
logger.error({ message: 'Заголовок не соответствует', context: { expected: 'Example Domain', actual: title } });
}
logger.info({ message: 'Тест завершен', context: { testName: 'Пример теста' } });
});
Playwright позволяет отслеживать множество событий на уровне страницы и браузера, что полезно для структурированного логирования. Основные события:
console — вывод консоли в браузере.request — отправка HTTP-запросов.response — получение HTTP-ответов.pageerror — ошибки JavaScript на странице.Пример логирования запросов и ответов:
page.on('request', request => {
logger.info({ message: 'Отправлен запрос', context: { url: request.url(), method: request.method() } });
});
page.on('response', response => {
logger.info({
message: 'Получен ответ',
context: { url: response.url(), status: response.status() }
});
});
Структурированные логи становятся особенно полезными, если включить в них контекст теста, такой как:
Пример использования контекста:
logger.info({
message: 'Проверка элемента',
context: {
testName: 'Проверка кнопки Submit',
selector: '#submit',
exists: await page.isVisible('#submit')
}
});
Структурированные JSON-логи легко интегрируются с внешними системами:
Принцип прост: каждый тест пишет логи в файл JSON или поток stdout, после чего CI/CD собирает их для анализа.
info или
debug).Структурированное логирование позволяет не только фиксировать события тестирования, но и превращает их в аналитический инструмент для улучшения стабильности автоматизации и понимания поведения приложения.