QA The Other WayОбеспечение качества в эпоху тестов, написанных искусственным интеллектом. QA The Other Way.
Практическое QA

Определите ответ диалогу до клика.

Осознанно обработайте нативное подтверждение и проверьте реальные последствия согласия и отмены.

6 мин. чтенияQA The Other Way
Авторская схема подтверждения с отдельными результатами отмены и согласия.
Авторская редакционная иллюстрация.
Иллюстративное видео к этой статье. английский экранный текст; выберите субтитры для этого языка.

Переведенное издание. Технические идентификаторы остаются в своей первоначальной форме.

Осознанно обработайте нативное подтверждение и проверьте реальные последствия согласия и отмены.
Локальный пример с вымышленными данными, не интерфейс клиента или поставщика.

Тест нажимает Удалить демонстрационный черновик. Открывается подтверждение браузера. Обработчик записывает текст и больше ничего не делает. Клик не завершается: приложение ждёт ответа, а не другого тайм-аута. Наблюдение без ответа может заблокировать простой сценарий.

Руководство следует документации диалогов Playwright на вымышленном локальном черновике. Реальные документы не удаляются, запросов к серверу нет. Проверяются оба ответа confirm и их видимые последствия. Политика ответа выбирается до открытия диалога.

Нативное подтверждение не является модальным окном страницы

JavaScript confirm относится к интерфейсу браузера, а не к HTML-элементам, которые может нажать getByRole. Модальное окно приложения устроено иначе: у него могут быть роль диалога и обычные кнопки. Сначала определите механизм.

Без обработчика Playwright автоматически отклоняет нативные диалоги. Если обработчик зарегистрирован, он должен принять или отклонить диалог. Одного логирования недостаточно: действие может зависнуть. Поэтому добавление отладочного вывода способно изменить поведение теста.

Зарегистрируйте ответ до действия

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

let observed;
page.once('dialog', async dialog => {
  observed = { type: dialog.type(), message: dialog.message() };
  await dialog.dismiss();
});
await page.getByRole('button', { name: 'Remove demo draft' }).click();
expect(observed).toEqual({ type: 'confirm', message: 'Remove demo draft?' });
await expect(page.getByRole('status')).toHaveText('Demo draft kept');

Пример требует контролируемой страницы и импортированного expect. Обработчик сначала отвечает, затем тест проверяет тип и сообщение после клика. Так ошибка проверки внутри обработчика не оставляет диалог без ответа.

Для разрешённого согласия добавьте свежий обработчик с accept(), повторите действие на свежем примере и проверьте локальное состояние. Не используйте правило принятия всех диалогов в разных сценариях. Будущее подтверждение может запросить другое разрушительное действие и незаметно получить согласие.

Для отмены нужно продуктовое ожидание

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

Согласие требует такой же точности. Исчезновение подтверждения не доказывает удаление. Установите контролируемую запись, разрешённую среду и конечный результат. Пример меняет только статус, поэтому его скриншот не подтверждает серверные эффекты.

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

Ограничьте время жизни обработчика

Обработчик on() остаётся активным до удаления или закрытия страницы. Это подходит для намеренной последовательности, но укажите типы, сообщения и ответы. once() яснее выражает один ожидаемый диалог.

Prompt добавляет ввод при принятии. beforeunload имеет отдельную документированную обработку и параметры закрытия. Пример confirm не покрывает их автоматически. Прочитайте подходящий API перед расширением набора.

Заметка может быть короткой: ожидаемое сообщение, отмена сохраняет, разрешённое согласие удаляет, серверное доказательство отдельно. Это полезнее лога только о появлении диалога.

AnyTest описывает проверяемые тесты после исследования приложения. Спросите, отвечает ли сценарий конкретному подтверждению или принимает всё. Функция обработки диалогов AnyTest здесь не заявляется. Осознанный ответ сохраняет смысл теста, последующие проверки защищают поведение продукта.

Общие вопросы

Почему обработчик, который только пишет в лог, блокирует клик?

Нативный диалог блокирует страницу. Зарегистрированный обработчик должен принять или отклонить его.

Доказывает ли закрытие подтверждения работающую отмену?

Нет. Проверьте сохранённое состояние и при необходимости доказательства сервера.

Источники