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

ダイアログ

はじめに

Playwright は、alertconfirmprompt といったウェブページのダイアログ、および 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");

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