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

ダイアログ

概要

Playwright は、alertconfirmprompt、および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")

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