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

ダイアログ

はじめに

Playwright は、alertconfirmprompt といったウェブページのダイアログ、および beforeunload 確認ダイアログと対話できます。印刷ダイアログについては、印刷を参照してください。

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

Playwright では、ダイアログはデフォルトで自動的に閉じられるため、ユーザーが処理する必要はありません。ただし、ダイアログをトリガーするアクションの前にダイアログハンドラーを登録して、dialog.accept() または dialog.dismiss() を実行することができます。

page.on('dialog', dialog => dialog.accept());
await page.getByRole('button').click();

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

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

警告

間違い!

page.on('dialog', dialog => console.log(dialog.message()));
await page.getByRole('button').click(); // Will hang here

page.on('dialog') のリスナーがない場合、すべてのダイアログは自動的に閉じられます。

beforeunload ダイアログ

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

ダイアログハンドラーを登録して、beforeunload ダイアログを自分で処理できます。

page.on('dialog', async dialog => {
assert(dialog.type() === 'beforeunload');
await dialog.dismiss();
});
await page.close({ runBeforeUnload: true });

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

await page.goto('<url>');

await page.evaluate('(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()');
await page.getByText('Print it!').click();

await page.waitForFunction('window.waitForPrintDialog');

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