Playwright Python — справочник На главный сайт

Основные методы

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().