ダイアログ
はじめに
Playwright は、alert
、confirm
、prompt
といったウェブページのダイアログ、および 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() など、その後のアクションが停止します。これは、ウェブ上のダイアログがモーダルであり、処理されるまでそれ以上のページの実行をブロックするためです。
結果として、以下のスニペットは決して解決されません
間違っています!
page.on('dialog', dialog => console.log(dialog.message()));
await page.getByRole('button').click(); // Will hang here
page.on('dialog') のリスナーがない場合、すべてのダイアログは自動的に閉じられます。
beforeunload ダイアログ
真値の runBeforeUnload を指定して page.close() が呼び出されると、ページはそのアンロードハンドラーを実行します。これは、ページが操作の最後に開いたままになる可能性があるため、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');
これにより、ボタンがクリックされた後、印刷ダイアログが開かれるまで待機します。ボタンをクリックする前、またはページが読み込まれた後にスクリプトを評価するようにしてください。