ダイアログ
はじめに
Playwrightは、alert
、confirm
、prompt
といった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", lambda dialog: dialog.accept())
await 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", lambda dialog: print(dialog.message))
await 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)
async def handle_dialog(dialog):
assert dialog.type == 'beforeunload'
await dialog.dismiss()
page.on('dialog', lambda: handle_dialog)
await 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")
await page.goto("<url>")
await page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()")
await page.get_by_text("Print it!").click()
await page.wait_for_function("window.waitForPrintDialog")
これは、ボタンがクリックされた後に印刷ダイアログが開かれるのを待ちます。ボタンをクリックする前、またはページが読み込まれた後にスクリプトを評価するようにしてください。