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

ダイアログ

はじめに

Playwright は、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() やその他のアクションが停止します。これは、ウェブのダイアログがモーダルであり、処理されるまでそれ以上のページ実行をブロックするためです。

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

警告

間違い!

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");

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