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

ダイアログ

はじめに

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

結果として、次のスニペットは決して解決されません。

警告

間違い!

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

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

beforeunload ダイアログ

Page.CloseAsync() が真の RunBeforeUnload 値で呼び出されると、ページはその unload ハンドラーを実行します。これは、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");

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