Playwright предоставляет широкий спектр возможностей для управления процессом тестирования, включая возможность блокировки отдельных ресурсов, таких как изображения, стили, скрипты и другие файлы. Это может быть полезно для оптимизации тестов, улучшения скорости их выполнения, а также для исключения внешних факторов, влияющих на стабильность тестируемых страниц.
Блокировка ресурсов помогает решить несколько проблем:
Для блокировки ресурсов в Playwright используется объект
route и метод route.continue() с параметром
abort(). Можно заблокировать отдельные типы ресурсов или
конкретные URL.
Пример простого кода для блокировки изображений:
const { webkit } = require('playwright');
(async () => {
const browser = await webkit.launch();
const page = await browser.newPage();
// Перехват всех запросов на изображения и их блокировка
await page.route('**/*.{png,jpg,jpeg,gif}', (route) => {
route.abort(); // Блокируем запросы
});
await page.goto('https://example.com');
await browser.close();
})();
В этом примере Playwright перехватывает все запросы на изображения
(форматы PNG, JPG, JPEG, GIF) и блокирует их, вызывая
route.abort().
Можно также фильтровать запросы по конкретному URL. Это позволяет блокировать только определенные ресурсы, например, скрипты или стили с внешних источников.
Пример блокировки скриптов с определенного домена:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
// Блокировка всех скриптов, которые загружаются с domain.com
await page.route('**/domain.com/**', (route) => {
route.abort(); // Блокируем запросы
});
await page.goto('https://example.com');
await browser.close();
})();
В данном случае все запросы на ресурсы с домена
domain.com будут заблокированы. Это может быть полезно,
если необходимо исключить влияние сторонних скриптов на тестируемую
страницу.
Кроме изображений и скриптов, можно блокировать и другие типы ресурсов: шрифты, стили, файлы данных и т. д. Например, блокировка шрифтов:
const { firefox } = require('playwright');
(async () => {
const browser = await firefox.launch();
const page = await browser.newPage();
// Блокировка всех запросов на шрифты
await page.route('**/*.woff2', (route) => {
route.abort();
});
await page.goto('https://example.com');
await browser.close();
})();
В этом примере блокируются все запросы на файлы шрифтов с расширением
.woff2.
Помимо блокировки, Playwright позволяет изменять запросы перед их отправкой. Это может быть полезно для имитации определенных условий или модификации данных, которые тестируемая страница получает от внешних ресурсов.
Пример перехвата и изменения ответа сервера:
const { webkit } = require('playwright');
(async () => {
const browser = await webkit.launch();
const page = await browser.newPage();
// Перехват запросов на API и изменение ответа
await page.route('**/api/data', async (route) => {
const mockData = { data: 'mocked' };
route.fulfill({
status: 200,
body: JSON.stringify(mockData),
contentType: 'application/json',
});
});
await page.goto('https://example.com');
await browser.close();
})();
Здесь запросы к API **/api/data перехватываются, и
вместо настоящего ответа сервера возвращается мока-данные. Это позволяет
тестировать страницу, не зависеть от внешних данных и избежать
неожиданных изменений в ответах сервера.
Блокировку ресурсов можно комбинировать с перехватом и модификацией запросов. Это дает возможность создавать более гибкие и изолированные тесты. Например, можно заблокировать все изображения на странице и одновременно перехватить запросы к API для тестирования:
const { firefox } = require('playwright');
(async () => {
const browser = await firefox.launch();
const page = await browser.newPage();
// Блокировка всех изображений
await page.route('**/*.{png,jpg,jpeg}', (route) => {
route.abort();
});
// Перехват и модификация запросов к API
await page.route('**/api/data', async (route) => {
const mockData = { data: 'mocked' };
route.fulfill({
status: 200,
body: JSON.stringify(mockData),
contentType: 'application/json',
});
});
await page.goto('https://example.com');
await browser.close();
})();
В данном примере ресурсы изображений блокируются, а данные API заменяются на мока-ответ.
Для упрощения отладки тестов можно добавить логирование запросов, которые были заблокированы или перехвачены. Это помогает отслеживать, какие ресурсы были заблокированы и как изменяются запросы.
Пример с логированием заблокированных запросов:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
// Логирование всех заблокированных изображений
await page.route('**/*.{png,jpg,jpeg}', (route) => {
console.log(`Блокировка изображения: ${route.request().url()}`);
route.abort();
});
await page.goto('https://example.com');
await browser.close();
})();
В этом примере при каждой блокировке изображения в консоль выводится URL заблокированного ресурса.
Блокировка ресурсов в Playwright — мощный инструмент для улучшения производительности тестов, а также для создания более контролируемой и изолированной среды тестирования. С помощью функционала перехвата запросов и блокировки ресурсов можно минимизировать внешние зависимости, ускорить тесты и гарантировать их стабильность, что делает Playwright еще более гибким инструментом для автоматизированного тестирования.