Playwright предоставляет возможности для тестирования и
взаимодействия с веб-приложениями, включая работу с диалогами, которые
могут возникать на страницах. Диалоги — это окна, которые могут
отображаться пользователю для подтверждения действия, ввода данных или
уведомлений (например, alert, confirm,
prompt). Важно уметь правильно управлять этими диалогами,
чтобы тесты не блокировались и могли корректно работать с
интерфейсом.
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'); // Инициация второго диалога
});
В этом примере сначала обрабатывается первый диалог, затем второй, с условием для каждого из них.
page.on('dialog'), чтобы автоматизировать их
обработку.waitForEvent для
синхронизации: Ожидание появления диалогов с помощью
waitForEvent('dialog') поможет избежать ошибок, связанных с
пропущенными или неотловленными диалогами.dialog.message().Таким образом, Playwright предоставляет гибкие механизмы для работы с диалогами, позволяя как автоматизировать, так и вручную управлять взаимодействиями с ними в ходе тестирования.