Обработка redirects

В процессе автоматизированного тестирования веб-приложений часто возникает необходимость проверки правильности перенаправлений (redirects). Playwright, как инструмент для тестирования, предоставляет мощные средства для работы с такими сценариями. Обработка редиректов в Playwright может быть необходима для того, чтобы тесты учитывали переходы по различным URL-адресам и проверяли их корректность.

Природа редиректов

Редирект (перенаправление) — это механизм веб-сервера, который перенаправляет пользователя или автоматический запрос с одного URL на другой. Редиректы могут происходить по разным причинам, например, при изменении структуры сайта или обновлении путей. Важно, чтобы тесты могли корректно следить за такими изменениями и фиксировать ответы на перенаправленные URL.

Обработка редиректов с помощью Playwright

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

1. Понимание автоматических редиректов

Playwright, по умолчанию, поддерживает автоматическое следование редиректам. Когда браузер выполняет HTTP-запрос, он автоматически перенаправляет на новый URL, если сервер ответил с кодом 3xx. Это позволяет тестировать конечный результат редиректа, а не только сам запрос.

Например:

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

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();
  const response = await page.goto('http://example.com/old-page');
  
  // Проверка финального URL после редиректа
  console.log(response.url()); // Ожидается новый URL после редиректа
  await browser.close();
})();

2. Перехват редиректов

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

Перехват редиректа выполняется с использованием page.on('route'), что позволяет взаимодействовать с каждым HTTP-запросом и ответом.

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

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

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

  // Установка обработчика для перехвата запросов
  page.on('route', route => {
    if (route.request().url() === 'http://example.com/old-page') {
      console.log('Перехвачен редирект:');
      console.log(route.request().url());
      route.continue(); // Продолжаем выполнение запроса
    } else {
      route.continue(); // Для всех остальных запросов также продолжаем выполнение
    }
  });

  // Переход на страницу, которая будет редиректировать
  await page.goto('http://example.com/old-page');
  
  await browser.close();
})();

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

3. Проверка статуса HTTP ответа

Для тестирования редиректов важно проверять статус-код HTTP-ответа. При редиректе сервер обычно отправляет ответ с кодом 3xx, что может быть полезно для диагностики и проверки правильности работы перенаправлений.

Пример кода для проверки статуса HTTP-ответа:

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

(async () => {
  const browser = await webkit.launch();
  const page = await browser.newPage();
  
  const response = await page.goto('http://example.com/old-page');
  
  // Проверка статус-кода редиректа
  if (response.status() === 301 || response.status() === 302) {
    console.log(`Редирект на: ${response.headers()['location']}`);
  }

  await browser.close();
})();

Здесь тестируется, что ответ сервера включает статус 301 (Moved Permanently) или 302 (Found), и выводится URL, на который происходит редирект.

4. Отслеживание цепочки редиректов

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

Пример отслеживания цепочки редиректов:

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

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

  // Переменная для хранения всех редиректов
  let redirects = [];

  page.on('response', response => {
    if (response.status() >= 300 && response.status() < 400) {
      redirects.push(response.headers()['location']);
    }
  });

  await page.goto('http://example.com/old-page');
  
  console.log('Цепочка редиректов:', redirects);

  await browser.close();
})();

В этом примере происходит сбор всех URL, на которые происходят редиректы, и вывод всей цепочки.

5. Ожидание редиректов

Иногда важно, чтобы тесты ждали завершения всех редиректов перед продолжением выполнения. Для этого можно использовать waitForNavigation в Playwright, который ожидает загрузки новой страницы после редиректа.

Пример:

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

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

  // Переход с ожиданием завершения редиректа
  await page.goto('http://example.com/old-page');
  await page.waitForNavigation();

  // После редиректа можно проверить новый URL
  console.log(page.url());

  await browser.close();
})();

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

6. Обработка редиректов с аутентификацией

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

Пример с аутентификацией:

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

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

  // Вход в систему
  await page.goto('http://example.com/login');
  await page.fill('input[name="username"]', 'user');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');

  // Ожидание редиректа после успешной аутентификации
  await page.waitForNavigation();
  
  // Проверка нового URL после редиректа
  console.log(page.url());

  await browser.close();
})();

Заключение

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