Одной из самых распространённых проблем при автоматизации тестов
является невозможность найти элемент на странице. В Playwright это часто
проявляется как
TimeoutError: waiting for selector "...".
Причины:
Решения:
await page.waitForSelector('#my-element', { state: 'visible', timeout: 5000 });
const frame = page.frame({ url: /example.com/ });
await frame.click('button#submit');
Тесты могут падать из-за того, что действия выполняются слишком быстро, до того как страница полностью загрузилась или элемент стал интерактивным.
Решения:
await page.locator('button#save').waitFor({ state: 'attached' });
page.waitForLoadState() для ожидания полной
загрузки страницы:await page.goto('https://example.com');
await page.waitForLoadState('networkidle');
Может возникнуть, если элемент исчезает или перекрыт другим элементом в момент клика.
Решения:
const button = page.locator('#submit');
await button.waitFor({ state: 'visible' });
await button.click();
force: true только в исключительных
случаях:await page.click('#submit', { force: true });
Это обходит проверку видимости, но может скрыть реальные ошибки взаимодействия.
Тесты, зависящие от авторизации, могут падать при истечении токена или несогласованности состояния страницы.
Решения:
await page.context().storageState({ path: 'state.json' });
const context = await browser.newContext({ storageState: 'state.json' });
const page = await context.newPage();
Селекторы на динамических страницах часто изменяются, что приводит к падению тестов.
Решения:
Locator API вместо прямых селекторов:const button = page.locator('button', { hasText: 'Отправить' });
await button.click();
await page.locator('text=/Отправ.*?/').click();
data-testid или уникальные
атрибуты для стабильности селекторов.Тесты могут завершаться раньше, чем завершатся все AJAX-запросы, что приводит к неполным проверкам.
Решения:
waitForResponse для конкретных сетевых
запросов:await page.waitForResponse(response => response.url().includes('/api/data') && response.status() === 200);
waitForSelector для элементов, которые
появляются после загрузки данных.Диалоги типа alert, confirm или prompt могут блокировать тесты.
Решения:
dialog:page.on('dialog', dialog => dialog.accept());
page.on('dialog', dialog => dialog.accept('Текст ответа'));
Тесты могут ломаться при смене языка интерфейса из-за изменения текста или формата дат.
Решения:
Одновременный запуск нескольких тестов может вызвать конфликты состояния, особенно если используется общий контекст браузера.
Решения:
const context = await browser.newContext();
const page = await context.newPage();
Для быстрого нахождения причин падений тестов важно правильно использовать отладку.
Инструменты:
page.pause() — приостанавливает выполнение теста и
открывает Playwright Inspector.console.log и page.on('console', ...) —
отслеживание событий и ошибок в браузере.await page.screenshot({ path: 'screenshot.png', fullPage: true });
await context.tracing.start({ screenshots: true, snapshots: true });
// после теста
await context.tracing.stop({ path: 'trace.zip' });
Locator API вместо прямых
селекторов.visible,
enabled, attached) с действиями.sleep или фиксированных
таймаутов.Эти подходы помогают предсказать и решать большинство проблем, с которыми сталкиваются при автоматизации тестирования с Playwright на JavaScript.