Response API

Response API в Playwright предназначен для детального контроля и анализа сетевых ответов при тестировании веб-приложений. Она позволяет получать данные о статусе ответа, заголовках, теле, времени отклика и других параметрах HTTP-ответа. Такой функционал особенно полезен при тестировании REST API, GraphQL или динамически загружаемых ресурсов на страницах.


Перехват и анализ ответов

Перехват сетевых ответов осуществляется через объект page. Основной метод — page.on('response', callback), где callback принимает объект типа Response.

page.on('response', async response => {
    console.log('URL:', response.url());
    console.log('Status:', response.status());
    console.log('Headers:', response.headers());
});

Ключевые методы объекта Response:

  • response.url() — возвращает URL запроса, на который пришёл ответ.
  • response.status() — HTTP-статус код ответа (например, 200, 404, 500).
  • response.ok() — булевое значение, true, если статус в диапазоне 200–299.
  • response.headers() — объект заголовков ответа.
  • response.body() / response.text() / response.json() — получение тела ответа в разных форматах.

Методы для работы с телом ответа являются асинхронными, поэтому всегда используются с await.

const response = await page.waitForResponse('**/api/data');
const data = await response.json();
console.log(data);

Ожидание и фильтрация ответов

Для точного контроля за асинхронными сетевыми событиями Playwright предоставляет методы page.waitForResponse и page.waitForRequest. Это особенно важно, когда нужно дождаться конкретного запроса, чтобы проверить его результат.

const response = await page.waitForResponse(response => 
    response.url().includes('/api/items') && response.status() === 200
);
const items = await response.json();
console.log(items.length);

Особенности фильтрации:

  • Можно использовать строковые шаблоны ('**/endpoint') или регулярные выражения.
  • Фильтры позволяют выбрать конкретные ответы среди множества сетевых запросов.
  • Метод waitForResponse возвращает только первый подходящий ответ, после чего выполнение продолжается.

Проверка статусов и заголовков

Проверка HTTP-статусов и заголовков — важный шаг для тестирования корректности API и безопасности приложения.

page.on('response', async response => {
    if (!response.ok()) {
        console.error(`Ошибка: ${response.status()} на URL ${response.url()}`);
    }
    const contentType = response.headers()['content-type'];
    if (contentType && contentType.includes('application/json')) {
        const jsonData = await response.json();
        console.log('Данные JSON:', jsonData);
    }
});

Рекомендации:

  • Проверять status() и ok() для быстрого определения успешности запроса.
  • Для JSON-ответов использовать response.json() вместо response.text() для прямого получения объекта.
  • Проверка заголовков помогает убедиться в правильной работе CORS, кеширования и типов контента.

Работа с асинхронными потоками данных

В современных приложениях ответы часто приходят не сразу, а в потоках или после последовательных запросов. Playwright позволяет работать с такими сценариями:

const [response] = await Promise.all([
    page.waitForResponse(resp => resp.url().includes('/api/stream')),
    page.click('#loadButton')
]);
const data = await response.json();
console.log(data);

Метод Promise.all обеспечивает синхронизацию действия на странице и перехвата сетевого ответа, что особенно полезно для динамических элементов и SPA-приложений.


Модификация запросов и тестирование ошибок

Playwright предоставляет возможность мокать ответы, что позволяет тестировать обработку ошибок и нестандартных данных:

await page.route('**/api/data', route => {
    route.fulfill({
        status: 500,
        contentType: 'application/json',
        body: JSON.stringify({ error: 'Internal Server Error' }),
    });
});
await page.goto('https://example.com');

Применение моков:

  • Проверка поведения приложения при ошибках сервера.
  • Тестирование отсутствия данных или пустых ответов.
  • Контроль над задержкой ответов с помощью route.fulfill({ ... , delay }).

Логирование и отладка сетевых событий

Для глубокого анализа тестов полезно логировать сетевые ответы и их параметры:

page.on('response', async response => {
    const request = response.request();
    console.log('Request Method:', request.method());
    console.log('Request Post Data:', request.postData());
    console.log('Response Status:', response.status());
});

Такой подход позволяет связывать запросы и ответы, отслеживать последовательность вызовов и находить узкие места в API.


Работа с бинарными и нестандартными форматами

Для работы с изображениями, PDF или другими бинарными данными используется метод response.body():

const response = await page.waitForResponse('**/download/file.pdf');
const buffer = await response.body();
require('fs').writeFileSync('file.pdf', buffer);

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

  • response.body() возвращает Buffer, который можно сохранять или анализировать.
  • Поддержка любых типов данных, включая JSON, текст, бинарные файлы и медиаресурсы.
  • Полезно для тестирования загрузок, отчетов и мультимедиа.

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

  • Всегда использовать асинхронное ожидание (await) для работы с телом ответа.
  • Применять фильтры URL и статус-кода для точной работы с нужными ответами.
  • Логировать и проверять заголовки для обеспечения безопасности и правильной обработки данных.
  • Использовать route.fulfill для тестирования нестандартных сценариев и ошибок сервера.
  • Для сложных динамических страниц синхронизировать действия пользователя и перехват ответов через Promise.all.

Response API в Playwright обеспечивает полный контроль над сетевой активностью страницы, что делает его незаменимым инструментом для автоматизированного тестирования сложных веб-приложений.