Playwright — инструмент для автоматизированного тестирования веб-приложений, обеспечивающий управление браузерами на уровне кода. При масштабировании тестовых сценариев важное значение приобретает эффективное использование памяти и предотвращение утечек ресурсов, особенно в длительных или параллельных прогонках.
Основные объекты Playwright, которые потребляют память:
Неправильное управление этими объектами приводит к накапливанию памяти. Рекомендуется использовать строгий порядок создания и закрытия:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
await page.close();
await context.close();
await browser.close();
})();
Ключевой момент: каждый созданный объект необходимо
явно закрывать. Использование browser.close() автоматически
закрывает все контексты и страницы, но при работе с множеством
параллельных страниц лучше закрывать их вручную, чтобы высвободить
память быстрее.
При тестировании масштабируемых сценариев часто создаются десятки страниц. Удерживание всех страниц одновременно может привести к резкому росту потребления памяти. Для оптимизации:
page.on('console', msg => console.log(msg.text()));
// ...
page.removeAllListeners();
Это предотвращает накопление объектов, связанных с коллбэками.
Playwright предоставляет возможность собирать данные о потреблении памяти браузером через CDP (Chrome DevTools Protocol) для Chromium:
const client = await context.newCDPSession(page);
const memory = await client.send('Memory.getAllTimeSamplingProfile');
console.log(memory);
Анализ подобных профилей позволяет выявлять объекты, которые остаются в памяти дольше необходимого времени, и корректировать тестовую стратегию.
Каждый контекст и страница создают временные данные: кэш, файлы cookie, локальное хранилище. Для тестов с повторным запуском:
browser.newContext() без storageState), если
нет необходимости сохранять состояние между тестами.context.clearCookies() или
context.close().При запуске нескольких тестов одновременно (например, через
test.parallel() в Playwright Test) важно учитывать:
test('example', async ({ browser }) => {
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
await page.close();
await context.close();
});
Для выявления утечек используются несколько подходов:
DEBUG=pw:api помогает выявить объекты, которые не были
закрыты.Регулярное профилирование помогает находить сценарии с утечками еще на этапе написания тестов, предотвращая замедление выполнения и падение системы при длительных прогонках.
beforeEach и afterEach для
автоматического создания и закрытия контекстов.setTimeout,
setInterval, обработчики событий.Эффективное управление памятью в Playwright требует дисциплины и внимательности к жизненному циклу объектов. Каждая страница, каждый контекст и каждый браузер создают свои ресурсы, которые нужно контролировать. Использование профилирования, закрытия объектов и очистки временных данных позволяет поддерживать стабильное выполнение тестов и предотвращает накопление утечек даже при сложных параллельных сценариях.