События диалогов (dialogs) играют ключевую роль в автоматизации взаимодействий с веб-приложениями, где пользователи могут сталкиваться с модальными окнами, подтверждениями, предупреждениями или вводами данных. Playwright предоставляет удобные инструменты для обработки таких событий, позволяя тестировщикам управлять диалогами и проверять их поведение в автоматическом режиме.
В веб-приложениях существуют несколько типов диалогов, с которыми тестировщики могут столкнуться:
Playwright предоставляет функциональность для работы с этими
диалогами с помощью события dialog, которое позволяет
перехватывать и реагировать на появления таких окон.
Чтобы начать работать с диалогами в Playwright, необходимо
подписаться на событие dialog объекта page.
Это событие срабатывает всякий раз, когда появляется диалоговое окно.
Для этого используется следующий синтаксис:
page.on('dialog', dialog => {
// Обработка диалога
});
Событие передаёт объект dialog, который содержит методы
для взаимодействия с диалогом, например, для его закрытия или получения
текста сообщения.
После перехвата события диалога, можно принять одно из следующих действий:
Пример принятия или отклонения диалога:
page.on('dialog', dialog => {
// Принятие диалога
dialog.accept();
// Отклонение диалога
dialog.dismiss();
});
Метод accept() может также принимать аргумент в случае,
если диалог является prompt, и вы хотите передать в него какой-либо
текст. Например:
page.on('dialog', dialog => {
dialog.accept('Test input');
});
Диалоговые окна могут содержать текстовое сообщение, которое может
быть полезным для проверки. Для получения текста из диалога используется
метод message() объекта dialog:
page.on('dialog', dialog => {
const message = dialog.message();
console.log(message); // Выводит текст сообщения из диалога
});
В тестах Playwright взаимодействие с диалогами может быть важно для проверки реакций системы на определенные пользовательские действия. Например, если приложение открывает диалог с подтверждением удаления, тестировщик может автоматически подтвердить действие и проверить, что элемент был удалён.
Пример теста, который проверяет поведение при удалении элемента с подтверждением:
test('Удаление элемента с подтверждением', async ({ page }) => {
await page.goto('https://example.com');
page.on('dialog', dialog => {
// Подтверждаем диалог
dialog.accept();
});
await page.click('button.delete'); // Предполагается, что этот элемент вызывает диалог подтверждения
// Дальнейшие проверки (например, элемент должен быть удалён)
});
Этот код перехватывает диалог подтверждения и автоматически нажимает “OK”, что позволяет продолжить выполнение теста.
При работе с диалогами типа prompt, где пользователю
нужно ввести текст, можно не только принять диалог, но и передать
значение, которое будет введено в поле ввода.
Пример с передачей текста в prompt:
test('Ввод текста в диалог prompt', async ({ page }) => {
await page.goto('https://example.com');
page.on('dialog', dialog => {
dialog.accept('Test input');
});
await page.click('button.showPrompt'); // Кнопка вызывает prompt
// Дальнейшие проверки, например, проверка, что введённый текст был использован
});
В этом примере, когда появляется диалог, автоматически передаётся строка “Test input”, что позволяет избежать необходимости вручную взаимодействовать с диалогом.
В некоторых случаях важно отклонить диалог, чтобы проверить, что приложение корректно реагирует на отказ от действия. Например, если диалог просит подтвердить удаление, можно отклонить его, чтобы убедиться, что элемент не был удалён.
test('Отклонение удаления элемента', async ({ page }) => {
await page.goto('https://example.com');
page.on('dialog', dialog => {
dialog.dismiss(); // Отклонение действия
});
await page.click('button.delete');
// Дальнейшие проверки, например, элемент не должен быть удалён
});
Иногда необходимо ожидать появления диалога до того, как выполнять
какие-либо действия. Это особенно актуально для асинхронных сценариев,
когда диалог появляется как результат какого-то действия, например,
нажатия кнопки. В таких случаях можно использовать
waitForEvent:
test('Ожидание появления диалога', async ({ page }) => {
await page.goto('https://example.com');
const dialogPromise = page.waitForEvent('dialog');
await page.click('button.showDialog');
const dialog = await dialogPromise;
dialog.accept(); // Принять диалог
});
Этот код ожидает появления диалога после клика по кнопке и сразу же его принимает.
Если в тесте предполагается несколько диалогов, можно обрабатывать каждый из них по очереди, подписавшись на событие несколько раз или с использованием других механизмов синхронизации. Важно корректно обработать каждый диалог, чтобы избежать неожиданных ошибок.
test('Обработка нескольких диалогов', async ({ page }) => {
await page.goto('https://example.com');
page.on('dialog', dialog => {
if (dialog.message() === 'Первый диалог') {
dialog.accept();
} else if (dialog.message() === 'Второй диалог') {
dialog.dismiss();
}
});
await page.click('button.firstDialog');
await page.click('button.secondDialog');
});
В этом примере два диалога обрабатываются по очереди, с различными действиями для каждого.
События dialogs в Playwright предоставляют мощный
инструмент для автоматизации тестирования с модальными окнами,
предупреждениями и запросами ввода данных. Возможность перехватывать,
отклонять или принимать диалоги делает тесты более гибкими и точными,
позволяя обрабатывать различные сценарии взаимодействия с
веб-приложением.