События request и response

Playwright предоставляет возможность взаимодействовать с HTTP-запросами и ответами в процессе тестирования. Это полезно для проверки правильности работы сетевых запросов, симуляции различных условий или анализа производительности веб-приложения. В Playwright события request и response позволяют отслеживать, изменять или даже блокировать HTTP-запросы и ответы во время выполнения тестов.

Событие request

Событие request срабатывает, когда браузер отправляет HTTP-запрос. Это событие предоставляет подробную информацию о запросе, включая URL, метод (GET, POST и другие), заголовки, тело запроса и т. д. Можно использовать это событие для мониторинга запросов, проверки их содержимого или модификации запроса перед его отправкой.

Пример использования события request
const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();

  // Обработчик события request
  page.on('request', request => {
    console.log('Запрос отправлен:', request.method(), request.url());
  });

  await page.goto('https://example.com');
  await browser.close();
})();

В этом примере, когда страница загружает ресурсы, мы выводим информацию о каждом отправленном запросе. Это может быть полезно для анализа запросов, например, чтобы проверить, отправляется ли правильный запрос к серверу.

Модификация запросов

В Playwright можно не только отслеживать запросы, но и изменять их перед отправкой. Для этого используется метод route в сочетании с событиями request. Этот метод позволяет перехватывать запросы и менять их содержимое.

const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();

  // Перехватить запрос и изменить его
  await page.route('**/api/**', (route, request) => {
    const modifiedRequest = request.continue({
      headers: {
        ...request.headers(),
        'Authorization': 'Bearer custom_token',
      },
    });
  });

  await page.goto('https://example.com');
  await browser.close();
})();

В данном примере перехватываются все запросы, которые содержат api в URL. Мы добавляем заголовок Authorization в запрос, чтобы передать авторизационный токен.

Событие response

Событие response срабатывает, когда браузер получает ответ на HTTP-запрос. Это событие предоставляет информацию о статусе ответа, его заголовках и теле. Оно полезно для анализа ответов сервера, проверки корректности полученных данных и тестирования обработки различных состояний ответов, например, 404 или 500.

Пример использования события response
const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();

  // Обработчик события response
  page.on('response', response => {
    console.log('Ответ получен:', response.status(), response.url());
  });

  await page.goto('https://example.com');
  await browser.close();
})();

Этот код выводит информацию о каждом полученном ответе, включая статусный код и URL. Такой подход полезен для мониторинга того, какие ответы приходят от сервера в процессе тестирования.

Анализ тела ответа

Для дальнейшего анализа можно извлечь тело ответа. В зависимости от типа ответа (например, JSON или HTML) его можно обработать соответствующим образом.

const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();

  // Обработчик события response
  page.on('response', async response => {
    if (response.url().includes('api')) {
      const data = await response.json();
      console.log('Ответ JSON:', data);
    }
  });

  await page.goto('https://example.com');
  await browser.close();
})();

В данном примере, если ответ от сервера содержит данные в формате JSON, мы выводим их в консоль. Это может быть полезно для тестирования API или других сервисов, возвращающих данные в формате JSON.

Комбинированное использование событий request и response

Для более сложных тестов можно использовать оба события — request и response — совместно. Например, можно перехватывать запросы, проверять их параметры и затем анализировать ответы, чтобы убедиться, что сервер возвращает ожидаемые данные.

const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();

  // Перехват запроса и анализ ответа
  page.on('request', request => {
    if (request.url().includes('api')) {
      console.log('Отправлен запрос на API:', request.url());
    }
  });

  page.on('response', async response => {
    if (response.url().includes('api')) {
      const data = await response.json();
      console.log('Получен ответ от API:', data);
    }
  });

  await page.goto('https://example.com');
  await browser.close();
})();

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

Блокировка запросов

В Playwright можно не только перехватывать и модифицировать запросы, но и блокировать их. Это полезно, например, для тестирования работы страницы без загрузки определённых ресурсов или для эмуляции сбоев в сети.

const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();

  // Блокировка определённых запросов
  await page.route('**/image/**', route => {
    route.abort();
  });

  await page.goto('https://example.com');
  await browser.close();
})();

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

Заключение

События request и response в Playwright предоставляют мощные возможности для мониторинга и модификации сетевого трафика. С их помощью можно отслеживать и изменять запросы, анализировать ответы от сервера, а также проводить более глубокое тестирование взаимодействия клиента с сервером. Использование этих событий позволяет создавать более сложные и гибкие тесты, а также эмулировать различные условия работы сети, что является важным аспектом при тестировании веб-приложений.