ダイアログ
はじめに
Playwrightは、alert
、confirm
、prompt
といったウェブページのダイアログ、およびbeforeunload
の確認と対話できます。印刷ダイアログについては、印刷を参照してください。
alert()、confirm()、prompt() ダイアログ
デフォルトでは、ダイアログはPlaywrightによって自動的に閉じられるため、処理する必要はありません。ただし、ダイアログをトリガーするアクションの前に、ダイアログハンドラーを登録して、Dialog.accept()またはDialog.dismiss()で処理することができます。
page.onDialog(dialog -> dialog.accept());
page.getByRole(AriaRole.BUTTON).click();
Page.onDialog(handler)リスナーはダイアログを処理する必要があります。そうしないと、Locator.click()などのアクションが停止します。これは、Webのダイアログはモーダルであり、処理されるまでそれ以降のページ実行をブロックするためです。
その結果、以下のスニペットは決して解決されません
誤り!
page.onDialog(dialog -> System.out.println(dialog.message()));
page.getByRole(AriaRole.BUTTON).click(); // Will hang here
Page.onDialog(handler)のリスナーがない場合、すべてのダイアログは自動的に閉じられます。
beforeunload ダイアログ
Page.close()が真値のsetRunBeforeUnloadとともに呼び出されると、ページはアンロードハンドラーを実行します。これは、Page.close()がページの実際の終了を待たない唯一のケースです。なぜなら、操作の最後にページが開いたままになる可能性があるためです。
beforeunload
ダイアログを自分で処理するために、ダイアログハンドラーを登録できます。
page.onDialog(dialog -> {
assertEquals("beforeunload", dialog.type());
dialog.dismiss();
});
page.close(new Page.CloseOptions().setRunBeforeUnload(true));
印刷ダイアログ
window.print
を介した印刷ダイアログがトリガーされたことを確認するには、以下のスニペットを使用できます。
page.navigate("<url>");
page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
page.getByText("Print it!").click();
page.waitForFunction("window.waitForPrintDialog");
これは、ボタンがクリックされた後に印刷ダイアログが開かれるのを待機します。ボタンをクリックする前、またはページが読み込まれた後にスクリプトを評価するようにしてください。