對話框
簡介
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() 或其他動作。這是因為 Web 中的對話框是模態的,因此會封鎖進一步的頁面執行,直到它們被處理為止。
因此,以下程式碼片段永遠不會解析
警告
錯誤!
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');
這將等待在點擊按鈕後開啟列印對話框。請確保在點擊按鈕之前/在頁面載入後評估腳本。