В процессе автоматизированного тестирования веб-приложений часто возникает необходимость проверки правильности перенаправлений (redirects). Playwright, как инструмент для тестирования, предоставляет мощные средства для работы с такими сценариями. Обработка редиректов в Playwright может быть необходима для того, чтобы тесты учитывали переходы по различным URL-адресам и проверяли их корректность.
Редирект (перенаправление) — это механизм веб-сервера, который перенаправляет пользователя или автоматический запрос с одного URL на другой. Редиректы могут происходить по разным причинам, например, при изменении структуры сайта или обновлении путей. Важно, чтобы тесты могли корректно следить за такими изменениями и фиксировать ответы на перенаправленные URL.
В Playwright процесс обработки редиректов осуществляется на уровне браузера, что позволяет контролировать их и проверять. Playwright автоматически отслеживает редиректы, но для более тонкой настройки и проверки можно использовать несколько методов.
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();
})();
Иногда необходимо перехватывать редиректы для более детальной обработки, например, чтобы проверить статус-код ответа или передать данные для дальнейших проверок. Для этого 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 будет перехвачен запрос, и можно будет выполнить необходимые действия, такие как проверка условий для редиректа.
Для тестирования редиректов важно проверять статус-код 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, на который происходит редирект.
В некоторых случаях полезно отслеживать не только конечный 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, на которые происходят редиректы, и вывод всей цепочки.
Иногда важно, чтобы тесты ждали завершения всех редиректов перед
продолжением выполнения. Для этого можно использовать
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();
})();
В данном случае тест будет ожидать завершения перехода, прежде чем продолжить выполнение, что позволяет проверить итоговый результат после редиректа.
Иногда редиректы могут происходить на страницы, требующие аутентификации. В таких случаях нужно позаботиться о том, чтобы обработать редиректы после успешного входа в систему. Это можно сделать с помощью работы с кукисами или сессиями.
Пример с аутентификацией:
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 представляет собой важную часть тестирования, позволяя моделировать и проверять поведение веб-приложений в условиях перенаправлений. Использование встроенных возможностей для перехвата запросов, отслеживания цепочки редиректов и ожидания их завершения делает тесты более гибкими и надежными.