Обработка confirm

Puppeteer — это инструмент для автоматизации взаимодействия с браузером, основанный на Chromium. Одной из частых задач при автоматизации тестирования является обработка различных видов диалоговых окон, таких как alert, prompt и confirm. В данном разделе будет рассмотрено, как работать с диалогом confirm в Puppeteer.

Важность обработки confirm

Диалоговое окно типа confirm появляется, когда страница вызывает метод JavaScript window.confirm(). Этот диалог предлагает пользователю два варианта: «ОК» или «Отмена». Он блокирует выполнение дальнейшего кода до тех пор, пока пользователь не сделает выбор. В автоматизированных тестах важно корректно обрабатывать такие окна, чтобы продолжить выполнение сценариев без вмешательства пользователя.

Пример вызова confirm на веб-странице:

window.confirm("Вы уверены, что хотите удалить этот элемент?");

Обработка confirm в Puppeteer

В Puppeteer для работы с диалоговыми окнами предоставляется возможность перехватывать их и автоматически подтверждать или отменять действия. Для этого необходимо использовать обработчик событий для диалоговых окон.

Пример перехвата диалога confirm

Чтобы обработать диалог confirm, можно подписаться на событие dialog и использовать методы accept() или dismiss() в зависимости от того, что требуется: подтвердить или отклонить диалог.

const puppeteer = require(&

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Обработчик событий для диалоговых окон
  page.on('dialog', async dialog => {
    console.log(dialog.message());  // Выводим сообщение из диалога
    await dialog.accept();  // Подтверждаем действие
  });

  // Навигация по странице, которая вызывает confirm
  await page.goto('https://example.com');  
  await page.click('#button-that-triggers-confirm');  // Симуляция клика по кнопке, вызывающей confirm

  await browser.close();
})();

В этом примере:

  • Мы добавляем обработчик для события dialog, который активируется, когда страница вызывает диалоговое окно.
  • Метод dialog.message() позволяет получить сообщение, отображаемое в диалоговом окне.
  • Метод dialog.accept() отвечает на диалог кнопкой «ОК», что эквивалентно нажатию пользователем на «ОК».

Отклонение диалога confirm

Для того чтобы отклонить диалог, необходимо использовать метод dismiss(). Это будет эквивалентно нажатию пользователем на кнопку «Отмена».

Пример отклонения:

page.on('dialog', async dialog => {
  console.log(dialog.message());
  await dialog.dismiss();  // Отклоняем действие, эквивалентно нажатию "Отмена"
});

Этот код перехватывает диалог, выводит его сообщение в консоль и закрывает диалог кнопкой «Отмена».

Проверка, что диалог был перехвачен

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

page.on('dialog', async dialog => {
  console.log('Диалог был вызван: ' + dialog.message());
  await dialog.accept();  // или dismiss(), в зависимости от теста
});

await page.evaluate(() => {
  const result = window.confirm('Вы уверены?');
  return result;  // Вернёт true, если нажали "ОК", или false, если "Отмена"
});

const result = await page.evaluate(() => {
  return window.confirm('Удалить элемент?');
});

console.log(result); // true или false в зависимости от ответа на confirm

Обработка confirm с параметрами

В некоторых случаях необходимо проверять содержимое сообщения в диалоге перед тем, как принять решение, подтверждать или отклонять его. Это может быть полезно, если на странице могут появляться разные сообщения, и необходимо реагировать по-разному в зависимости от контекста.

Пример:

page.on('dialog', async dialog => {
  const message = dialog.message();
  if (message === 'Удалить элемент?') {
    await dialog.accept();  // Подтверждаем удаление
  } else {
    await dialog.dismiss();  // Отменяем другие действия
  }
});

В этом случае в зависимости от текста сообщения в диалоге решается, принимать ли его или отклонять.

Заключение

Работа с диалогами типа confirm в Puppeteer проста и интуитивно понятна. С помощью обработчика событий dialog можно перехватывать диалоговые окна и автоматически реагировать на них, что позволяет проводить тесты без участия пользователя.