Aлерты, подтверждения и промпты на веб-страницах — это встроенные диалоговые окна браузера, которые блокируют выполнение скрипта до момента взаимодействия пользователя. В тестировании важно уметь перехватывать и обрабатывать такие события, чтобы автоматизированные сценарии выполнялись корректно и предсказуемо.
Простейший алерт создаётся через alert(“Сообщение”). В
Puppeteer для его обработки используется событие dialog.
Пример:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
page.on('dialog', async dialog => {
console.log('Текст алерта:', dialog.message());
await dialog.accept(); // Подтверждение алерта
});
await page.goto('https://example.com');
await page.evaluate(() => alert('Тестовый алерт'));
await browser.close();
})();
Ключевой момент: метод accept() закрывает
алерт, а метод dismiss() может использоваться для
отклонения, применимого к confirm и prompt.
Диалоги типа confirm и prompt позволяют
пользователю подтверждать действие или вводить данные:
page.on('dialog', async dialog => {
if (dialog.type() === 'confirm') {
await dialog.accept(); // или dialog.dismiss()
}
if (dialog.type() === 'prompt') {
await dialog.accept('Введённый текст'); // Ввод текста перед подтверждением
}
});
dialog.type() возвращает строку “alert”,
“confirm”, “prompt” или
“beforeunload”, что позволяет различать тип диалога и
применять нужное поведение.
Использование prompt часто необходимо для тестирования форм
или модальных окон, где браузер ожидает текстовый ввод:
await page.evaluate(() => prompt('Введите имя', 'default'));
Обработка в Puppeteer:
page.on('dialog', async dialog => {
if (dialog.type() === 'prompt') {
console.log('Ввод:', dialog.message());
await dialog.accept('PuppeteerUser');
}
});
Метод dismiss() позволяет эмулировать отказ пользователя.
Для confirm это означает «Отмена», для prompt — закрытие без ввода:
page.on('dialog', async dialog => {
await dialog.dismiss();
});
Этот приём полезен для проверки поведения приложения при отказе пользователя от выполнения критических действий.
Диалог beforeunload появляется при попытке покинуть
страницу, если сайт реализует защиту от потери данных. Puppeteer
обрабатывает его так же, как обычные диалоги:
page.on('dialog', async dialog => {
if (dialog.type() === 'beforeunload') {
await dialog.dismiss(); // Отмена перехода
}
});
Перехват диалогов позволяет логировать события для проверки сценариев:
let dialogs = [];
page.on('dialog', async dialog => {
dialogs.push({ type: dialog.type(), message: dialog.message() });
await dialog.accept();
});
// После выполнения теста можно проверить содержимое dialogs
page.on(‘dialog’, …) до
вызова кода, который вызывает алерт, чтобы избежать пропуска событий.
dialog.type() для корректного
применения accept или dismiss.
Алерты и подтверждения блокируют выполнение страницы, но не
блокируют Node.js, если обработка задана через событие
dialog. Это позволяет параллельно выполнять другие
проверки, например, проверять изменения DOM после закрытия
алерта:
page.on('dialog', async dialog => await dialog.accept());
await page.evaluate(() => {
alert('Проверка DOM');
});
const text = await page.$eval('#result', el => el.textContent);
console.log(text);
Обработка алертов и уведомлений в Puppeteer — это не просто закрытие
окон, а важная часть надёжного тестирования интерактивных
элементов. Правильное использование dialog
событий, методов accept и dismiss, а также
контроль текста для prompt обеспечивает стабильность и
предсказуемость автоматизированных сценариев.