Контроль сетевых запросов в процессе автоматизированного тестирования обеспечивает понимание поведения приложения, выявление ошибок в API, оптимизацию загрузки ресурсов и анализ корректности взаимодействия между клиентом и сервером. Puppeteer предоставляет доступ к событиям страницы, позволяя перехватывать запросы, анализировать ответы, измерять задержки и модифицировать сетевой трафик.
Инструментарий включает события request,
response и requestfailed. Это даёт возможность
фиксировать запросы, контролировать их параметры и сопоставлять с
полученными ответами. Каждый объект request предоставляет
метод url(), тип ресурса через resourceType(),
HTTP-метод и заголовки. Объект response содержит статус,
заголовки, тип контента и тело.
page.on(&
console.log('Запрос:', request.url(), request.resourceType());
});
page.on('response', async response => {
console.log('Ответ:', response.url(), response.status());
});
Фиксация данных о неудачных запросах помогает обнаруживать сетевые и серверные проблемы:
page.on('requestfailed', request => {
console.log('Ошибка запроса:', request.url(), request.failure());
});
Доступ к телу ответа полезен при тестировании REST-API и динамической подгрузки данных. Ответ может быть получен в виде текста, JSON или бинарного содержимого:
page.on('response', async response => {
if (response.url().includes('/api/data')) {
const json = await response.json();
console.log('Данные API:', json);
}
});
При работе с большими объёмами данных важно учитывать влияние ожиданий на скорость выполнения тестов.
Возможность управления запросами даёт гибкость для эмуляции серверных
сценариев, подмены данных и изоляции тестов. Функция
page.setRequestInterception(true) включает режим перехвата.
Запрос может быть пропущен, отклонён или модифицирован.
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url().endsWith('.png')) {
return request.abort();
}
request.continue();
});
Подмена полезна при создании детерминированных тестов:
page.on('request', request => {
if (request.url().includes('/api/data')) {
return request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ value: 42 })
});
}
request.continue();
});
Анализ временных характеристик выявляет задержки при загрузке ресурсов и
нестабильность API. Пара request.timing() и
response.fromCache() помогают отслеживать использование
кэша и длительность передачи.
page.on('response', async response => {
const timing = response.request().timing();
console.log('Время DNS:', timing.domainLookupEnd - timing.domainLookupStart);
console.log('Время загрузки:', timing.responseEnd - timing.requestStart);
});
Для измерения совокупных метрик удобно собирать данные в структуру, фильтровать по типу ресурса и вычислять статистические значения.
При сложных интерфейсах запросы могут инициироваться цепочками событий.
Подключение page.on(‘console’, …) помогает связать
сообщения приложения с сетевой активностью. Дополнительно может
использоваться трассировка:
await page.tracing.start({ path: 'trace.json', categories: ['devtools.timeline'] });
// Выполнение сценария
await page.tracing.stop();
Полученная трасса анализируется инструментами Chrome, что упрощает определение узких мест.
В ряде приложений сетевые взаимодействия происходят через WebSocket.
Puppeteer предоставляет API Chrome DevTools Protocol, позволяя
фиксировать сообщения. Подключение выполняется через client =
await page.target().createCDPSession():
const client = await page.target().createCDPSession();
await client.send('Network.enable');
client.on('Network.webSocketFrameReceived', params => {
console.log('Получено:', params.response.payloadData);
});
Отправленные кадры перехватываются аналогичным образом. Такая техника важна при тестировании обновлений данных в реальном времени.
Эмуляция сетевых условий моделирует работу приложения при низкой скорости или высокой задержке:
const client = await page.target().createCDPSession();
await client.send('Network.emulateNetworkConditions', {
offline: false,
latency: 200,
downloadThroughput: 200 * 1024,
uploadThroughput: 100 * 1024
});
Использование таких сценариев позволяет проверять устойчивость интерфейса к нестабильной сети.
Фиксация сетевого трафика в формате HAR упрощает анализ. Сторонние библиотеки генерируют HAR-файлы поверх событий Puppeteer. Подобные артефакты полезны при разборе сложных ошибок и интеграции с инструментами производительности.
Контроль кэша исключает случайные побочные эффекты. Отключение кэширования через Chrome DevTools Protocol делает поведение тестов предсказуемым:
const client = await page.target().createCDPSession();
await client.send('Network.setCacheDisabled', { cacheDisabled: true });
Дополнительно анализируются заголовки Cache-Control,
ETag и Last-Modified, определяющие стратегию
обновления.
Синхронизация сетевой активности с кликами, навигациями и изменениями
DOM помогает выявлять избыточные запросы и дубликаты. Использование
Promise.all([…]) фиксирует набор запросов, ожидаемых после
события:
await Promise.all([
page.waitForResponse(resp => resp.url().includes('/api/data')),
page.click('#fetch')
]);
Техника особенно полезна при проверке сложных UI-меню и отображения списков.
Повторяющиеся сценарии мониторинга удобно выносить в вспомогательные функции, собирающие статистику, ошибки и метрики. Это повышает прозрачность тестов и ускоряет поиск проблем в проектах с большой сетевой активностью.