Route и Request API

Playwright предоставляет мощные средства для контроля и анализа сетевых запросов через Route и Request API. Они позволяют перехватывать, модифицировать и проверять HTTP-запросы и ответы, что критически важно для тестирования сложных веб-приложений, работы с API и эмуляции различных условий сети.


Перехват запросов с помощью page.route

Метод page.route(url, handler) позволяет перехватывать все запросы, соответствующие определённому URL или шаблону, и обрабатывать их кастомным образом. Основные параметры:

  • url — строка, регулярное выражение или функция, которая возвращает true для нужных URL.
  • handler — функция, принимающая объект route и объект request.

Пример:

await page.route('**/api/users', async (route, request) => {
    console.log('Перехваченный запрос:', request.url());
    await route.continue(); // продолжает запрос без изменений
});

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

  • route.continue([overrides]) — продолжает запрос, позволяя изменить его метод, заголовки или тело.
  • route.fulfill(response) — завершает запрос с пользовательским ответом.
  • route.abort([errorCode]) — прерывает запрос, можно эмулировать сетевую ошибку.

Пример модификации запроса:

await page.route('**/api/login', async (route) => {
    await route.continue({
        headers: {
            'Authorization': 'Bearer тестовый_токен'
        }
    });
});

Пример подмены ответа:

await page.route('**/api/users', async (route) => {
    await route.fulfill({
        status: 200,
        contentType: 'application/json',
        body: JSON.stringify([{id: 1, name: 'Test User'}])
    });
});

Использование request и response для анализа сетевых операций

Объект Request предоставляет доступ к информации о каждом сетевом запросе:

  • request.url() — URL запроса.
  • request.method() — HTTP-метод.
  • request.postData() — тело запроса для POST/PUT.
  • request.headers() — заголовки запроса.
  • request.isNavigationRequest() — является ли запрос навигационным.

Пример логирования всех запросов страницы:

page.on('request', request => {
    console.log('Запрос:', request.method(), request.url());
});

Объект Response позволяет анализировать ответы сервера:

  • response.status() — код состояния.
  • response.headers() — заголовки ответа.
  • response.body() — тело ответа в виде Buffer.
  • response.text() и response.json() — удобные методы для получения данных в текстовом или JSON формате.

Пример проверки ответа API:

page.on('response', async response => {
    if (response.url().includes('/api/users')) {
        console.log('Статус:', response.status());
        const data = await response.json();
        console.log('Данные пользователей:', data);
    }
});

Фильтрация и шаблоны URL

Playwright поддерживает подстановочные шаблоны и регулярные выражения для точной фильтрации запросов:

  • "**/api/**" — любой путь, содержащий /api/.
  • /.*\.css/ — все CSS-файлы.
  • Функция: (url) => url.includes('/login') — динамическая фильтрация.

Пример с регулярным выражением:

await page.route(/.*\.png/, route => route.abort('failed'));

Это позволяет эмулировать ошибки загрузки ресурсов для тестирования поведения страницы.


Асинхронная обработка и задержка ответа

Методы route.fulfill и route.continue могут быть асинхронными. Это открывает возможности для:

  • Добавления задержки: имитация медленного соединения.
  • Изменения ответа на лету: динамическая генерация данных.

Пример с задержкой:

await page.route('**/api/data', async (route) => {
    await new Promise(resolve => setTimeout(resolve, 1000));
    await route.continue();
});

Совместное использование с page.waitForResponse и page.waitForRequest

Для тестов, где важно дождаться конкретного запроса или ответа, используются:

  • page.waitForRequest(urlOrPredicate, options) — ожидает запрос, соответствующий условию.
  • page.waitForResponse(urlOrPredicate, options) — ожидает ответ сервера.

Пример:

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

Практические сценарии применения

  1. Тестирование API без реального сервера Перехват запросов и возврат фейковых данных ускоряет тесты и делает их изолированными.

  2. Проверка заголовков и авторизации Модификация запросов позволяет тестировать поведение сервиса при разных токенах или параметрах.

  3. Эмуляция ошибок сети route.abort() помогает проверить, корректно ли приложение обрабатывает ошибки сети.

  4. Загрузка медленных ресурсов Добавление задержек позволяет проверить UX при медленных соединениях.


Особенности и ограничения

  • Перехватываются только запросы браузера, генерируемые страницей. Node.js запросы внутри теста не контролируются.
  • Объект route действует только однократно, поэтому для многократного перехвата нужно использовать page.route с постоянным шаблоном.
  • При тестировании SPA важно учитывать, что навигационные запросы могут вызвать множество подзапросов, и фильтры должны быть точными.

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