ダイアログ
概要
Playwright は、alert
、confirm
、prompt
、および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")
これにより、ボタンがクリックされた後に印刷ダイアログが開くまで待機します。ボタンをクリックする前またはページがロードされた後に、スクリプトを評価してください。