Диалоги
Перехват и управление браузерными диалогами: alert, confirm, prompt, beforeunload.
Основные методы
page.on("dialog", handler)
Событие dialog срабатывает при появлении любого браузерного диалога — alert(), confirm(), prompt() или beforeunload. Обработчик получает объект Dialog.
from playwright.sync_api import sync_playwright def handle_dialog(dialog): print(f"Тип: {dialog.type}, сообщение: {dialog.message}") dialog.accept() with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.on("dialog", handle_dialog) page.evaluate("alert('Привет!')") browser.close()
dialog.accept() — OK
Принимает диалог. Для prompt можно передать текст ввода.
dialog.accept() # просто OK dialog.accept("Введённый текст") # prompt с вводом
dialog.dismiss() — Отмена
Отклоняет диалог (аналог нажатия «Отмена» или Escape).
dialog.dismiss()
dialog.message, dialog.type, dialog.default_value
Свойства объекта Dialog:
- dialog.message — текст сообщения диалога
- dialog.type — тип: "alert", "confirm", "prompt", "beforeunload"
- dialog.default_value — значение по умолчанию в поле ввода (для prompt)
def show_dialog_info(dialog): print(f"Сообщение: {dialog.message}") print(f"Тип: {dialog.type}") print(f"Значение по умолчанию: {dialog.default_value}") dialog.accept() page.on("dialog", show_dialog_info)
page.once("dialog") — одноразовый обработчик
Срабатывает только для первого диалога, после чего автоматически удаляется.
page.once("dialog", lambda d: d.accept())
Примеры
Обработка confirm с проверкой отмены
from playwright.sync_api import sync_playwright results = [] def handle_confirm(dialog): if dialog.type == "confirm": results.append({"message": dialog.message, "accepted": True}) dialog.accept() else: dialog.dismiss() page.on("dialog", handle_confirm) page.evaluate("confirm('Удалить запись?')") print(results) # [{'message': 'Удалить запись?', 'accepted': True}]
Проверка отмены диалога
def test_cancel_confirm(page): result = {"dismissed": False} def on_dialog(dialog): dialog.dismiss() result["dismissed"] = True page.on("dialog", on_dialog) page.evaluate("confirm('Продолжить?')") assert result["dismissed"] == True
Примечание: Если не зарегистрировать обработчик dialog, Playwright автоматически отклоняет все диалоги. Это поведение можно изменить с помощью page.add_locator_handler().
Автозакрытие диалогов
Метод page.add_locator_handler() позволяет автоматически закрывать диалоги при появлении определённого элемента на странице.
page.add_locator_handler(
page.get_by_role("alertdialog"),
lambda: page.get_by_role("button", name="OK").click()
)
beforeunload
Диалог "beforeunload" требует особой обработки — его нужно явно принять.
def handle_beforeunload(dialog): print("Попытка закрытия страницы") dialog.accept() page.on("dialog", handle_beforeunload) page.evaluate("window.addEventListener('beforeunload', e => e.preventDefault())")
Важно: Диалог beforeunload нельзя отклонить — только принять. Событие срабатывает при закрытии вкладки, навигации или вызове page.close().