メインコンテンツへスキップ

ダイアログ

はじめに

Playwrightは、alertconfirmpromptといったWebページダイアログ、およびbeforeunload確認ダイアログと対話できます。印刷ダイアログについては、印刷を参照してください。

alert()、confirm()、prompt() ダイアログ

デフォルトでは、Playwrightによってダイアログは自動的に閉じられるため、手動で処理する必要はありません。ただし、ダイアログをトリガーするアクションの前にダイアログハンドラーを登録することで、dialog.accept()またはdialog.dismiss()のいずれかで処理できます。

page.on("dialog", lambda dialog: dialog.accept())
page.get_by_role("button").click()
注記

page.on("dialog")リスナーはダイアログを処理する必要があります。そうしないと、locator.click()などのアクションが停止してしまいます。これは、Web上のダイアログがモーダルであり、処理されるまでそれ以上のページ実行をブロックするためです。

その結果、以下のスニペットは決して解決しません

警告

誤り!

page.on("dialog", lambda dialog: print(dialog.message))
page.get_by_role("button").click() # Will hang here
注記

page.on("dialog")のリスナーがない場合、すべてのダイアログは自動的に閉じられます。

beforeunload ダイアログ

page.close()が真値のrun_before_unload引数とともに呼び出されると、ページはそのアンロードハンドラーを実行します。これは、操作の終わりにページが開いたままになる可能性があるため、page.close()がページが実際に閉じるのを待たない唯一のケースです。

beforeunloadダイアログを自分で処理するために、ダイアログハンドラーを登録できます

def handle_dialog(dialog):
assert dialog.type == 'beforeunload'
dialog.dismiss()

page.on('dialog', lambda: handle_dialog)
page.close(run_before_unload=True)

window.printを介して印刷ダイアログがトリガーされたことをアサートするには、次のスニペットを使用できます

page.goto("<url>")

page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()")
page.get_by_text("Print it!").click()

page.wait_for_function("window.waitForPrintDialog")

これは、ボタンがクリックされた後に印刷ダイアログが開かれるのを待ちます。ボタンをクリックする前、またはページが読み込まれた後にスクリプトを評価するようにしてください。