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

ダイアログ

はじめに

Playwrightは、Webページのダイアログ(alertconfirmprompt、そしてbeforeunload確認など)とインタラクトできます。印刷ダイアログについては、「印刷」を参照してください。

alert()、confirm()、prompt() ダイアログ

既定では、ダイアログはPlaywrightによって自動的に閉じられるため、それらを処理する必要はありません。ただし、ダイアログをトリガーするアクションの前にダイアログハンドラーを登録することで、Dialog.AcceptAsync()またはDialog.DismissAsync()でそれを処理できます。

Page.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
await Page.GetByRole(AriaRole.Button).ClickAsync();

Page.Dialogリスナーは、ダイアログを**処理する必要があります**。そうしないと、Locator.ClickAsync()であろうと何であろうと、アクションが停止します。これは、Webにおけるダイアログがモーダルであり、処理されるまでそれ以上のページ実行をブロックするためです。

その結果、以下のスニペットは決して解決しません

警告

間違い!

page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.GetByRole(AriaRole.Button).ClickAsync(); // Will hang here

Page.Dialogにリスナーがない場合、すべてのダイアログは自動的に閉じられます。

beforeunload ダイアログ

Page.CloseAsync()が真値のRunBeforeUnload値で呼び出された場合、ページはアンロードハンドラーを実行します。これは、操作の最後にページが開いたままになる可能性があるため、Page.CloseAsync()がページが実際に閉じるのを待たない唯一のケースです。

beforeunloadダイアログを自分で処理するためにダイアログハンドラーを登録できます

Page.Dialog += async (_, dialog) =>
{
Assert.AreEqual("beforeunload", dialog.Type);
await dialog.DismissAsync();
};
await Page.CloseAsync(new() { RunBeforeUnload = true });

window.printを介した印刷ダイアログがトリガーされたことを確認するには、以下のスニペットを使用できます

await Page.GotoAsync("<url>");

await Page.EvaluateAsync("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
await Page.GetByText("Print it!").ClickAsync();

await Page.WaitForFunctionAsync("window.waitForPrintDialog");

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