Автоматическое и ручное управление диалогами

Playwright предоставляет возможности для тестирования и взаимодействия с веб-приложениями, включая работу с диалогами, которые могут возникать на страницах. Диалоги — это окна, которые могут отображаться пользователю для подтверждения действия, ввода данных или уведомлений (например, alert, confirm, prompt). Важно уметь правильно управлять этими диалогами, чтобы тесты не блокировались и могли корректно работать с интерфейсом.

Обработка диалогов в Playwright

Playwright позволяет обрабатывать диалоги, возникающие в браузере, с помощью метода page.on('dialog'). Этот метод предоставляет доступ к объекту диалога, который позволяет выполнить необходимые действия, такие как принятие диалога, его отклонение или ввод текста.

Пример: Автоматическое принятие диалога

Для того чтобы автоматически принять диалог, нужно использовать метод dialog.accept(). В тестах, когда необходимо подтвердить диалог, например, при отображении confirm с вопросом «Вы уверены?», можно сразу принять его.

const { test, expect } = require('@playwright/test');

test('Автоматическое принятие диалога', async ({ page }) => {
  page.on('dialog', dialog => {
    dialog.accept(); // Автоматически нажимаем «OK»
  });

  await page.goto('https://example.com');
  await page.click('#confirmButton'); // Инициация диалога
});

В этом примере при нажатии на кнопку с id #confirmButton появляется диалог, который автоматически принимается.

Пример: Отклонение диалога

Если нужно отклонить диалог, например, на кнопке «Отмена», применяется метод dialog.dismiss(). Он имитирует нажатие кнопки «Cancel».

const { test, expect } = require('@playwright/test');

test('Отклонение диалога', async ({ page }) => {
  page.on('dialog', dialog => {
    dialog.dismiss(); // Нажимаем «Отмена»
  });

  await page.goto('https://example.com');
  await page.click('#confirmButton'); // Инициация диалога
});

Этот код имитирует нажатие кнопки «Cancel», отклоняя диалог, который появляется после нажатия на #confirmButton.

Пример: Ввод текста в диалог

Если на странице возникает диалог с полем для ввода текста (например, prompt), можно воспользоваться методом dialog.type() для ввода данных в это поле и нажать «OK» с помощью dialog.accept().

const { test, expect } = require('@playwright/test');

test('Ввод текста в диалог', async ({ page }) => {
  page.on('dialog', async dialog => {
    await dialog.type('Текст для ввода'); // Вводим текст
    dialog.accept(); // Нажимаем «OK»
  });

  await page.goto('https://example.com');
  await page.click('#promptButton'); // Инициация диалога с вводом
});

В этом примере диалог с полем для ввода автоматически заполняется и подтверждается.

Ручное управление диалогами

Иногда требуется вручную управлять диалогами, чтобы наглядно контролировать процесс тестирования. В таких случаях можно использовать те же методы, что и для автоматического управления, но с добавлением ожиданий (например, waitForSelector), что позволит точнее контролировать моменты появления диалога и его элементов.

Пример: Ожидание диалога и его принятие вручную

const { test, expect } = require('@playwright/test');

test('Ожидание и принятие диалога вручную', async ({ page }) => {
  await page.goto('https://example.com');
  await page.click('#confirmButton'); // Инициация диалога

  const dialogPromise = page.waitForEvent('dialog'); // Ожидаем появления диалога
  const dialog = await dialogPromise;

  // Можем проверить свойства диалога перед его принятием
  expect(dialog.message()).toBe('Вы уверены?');
  dialog.accept(); // Принятие диалога
});

Здесь используется метод waitForEvent('dialog'), который ожидает появления диалога, а затем происходит проверка его сообщения. После этого диалог принимается вручную.

Пример: Ожидание диалога с вводом текста

Если необходимо взаимодействовать с диалогом с полем ввода, можно также использовать ожидание.

const { test, expect } = require('@playwright/test');

test('Ожидание и ввод текста в диалог вручную', async ({ page }) => {
  await page.goto('https://example.com');
  await page.click('#promptButton'); // Инициация диалога

  const dialogPromise = page.waitForEvent('dialog'); // Ожидаем появления диалога
  const dialog = await dialogPromise;

  expect(dialog.message()).toBe('Введите данные:');
  await dialog.type('Текст для ввода'); // Вводим данные
  dialog.accept(); // Принятие диалога
});

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

Управление несколькими диалогами

Playwright позволяет работать с несколькими диалогами одновременно. Однако важно учитывать, что если один диалог блокирует выполнение теста (например, ожидает подтверждения), то последующие диалоги могут не быть обработаны.

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

const { test, expect } = require('@playwright/test');

test('Обработка нескольких диалогов', async ({ page }) => {
  page.on('dialog', async dialog => {
    if (dialog.message() === 'Диалог 1') {
      dialog.accept(); // Принять первый диалог
    } else if (dialog.message() === 'Диалог 2') {
      dialog.dismiss(); // Отклонить второй диалог
    }
  });

  await page.goto('https://example.com');
  await page.click('#firstDialogButton'); // Инициация первого диалога
  await page.click('#secondDialogButton'); // Инициация второго диалога
});

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

Советы по работе с диалогами в Playwright

  1. Слушайте события диалогов: Если приложение часто вызывает диалоги, лучше всего использовать событие page.on('dialog'), чтобы автоматизировать их обработку.
  2. Используйте waitForEvent для синхронизации: Ожидание появления диалогов с помощью waitForEvent('dialog') поможет избежать ошибок, связанных с пропущенными или неотловленными диалогами.
  3. Используйте условия для различных типов диалогов: Чтобы отличать различные типы диалогов, можно проверять их сообщения через dialog.message().
  4. Не забывайте про обработку ошибок: В случае возникновения ошибок (например, если диалог не появляется в ожиданный момент), добавьте проверку ошибок или тайм-ауты, чтобы тесты не зависали.

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