Алерты и уведомления

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

Диалоги типа 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

Использование 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

Метод dismiss() позволяет эмулировать отказ пользователя. Для confirm это означает «Отмена», для prompt — закрытие без ввода:

page.on('dialog', async dialog => {
    await dialog.dismiss();
});

Этот приём полезен для проверки поведения приложения при отказе пользователя от выполнения критических действий.

beforeunload

Диалог 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’, …) до вызова кода, который вызывает алерт, чтобы избежать пропуска событий.
  • Для модальных окон, требующих ввода, заранее определить текст для prompt, чтобы тест не зависал.
  • Проверять тип диалога через 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 обеспечивает стабильность и предсказуемость автоматизированных сценариев.