Skip to main content

對話框

簡介

Playwright 可以與網頁對話框互動,例如 alertconfirmprompt 以及 beforeunload 確認。對於列印對話框,請參閱 Print

alert()、confirm()、prompt() 對話框

預設情況下,對話框會被 Playwright 自動關閉,所以您不需要處理它們。但是,您可以在觸發對話框的操作之前註冊對話框處理程序,以 dialog.accept()dialog.dismiss() 它。

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

page.on('dialog') 監聽器 必須處理 對話框。否則您的操作將會停滯,無論是 locator.click() 還是其他操作。這是因為網頁中的對話框是模態的,因此會阻止進一步的頁面執行,直到它們被處理。

因此,以下程式碼片段永遠不會解析:

warning

錯誤!

page.on('dialog', dialog => console.log(dialog.message()));
await page.getByRole('button').click(); // 將會停滯在此
note

如果沒有 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');

這將在按鈕點擊後等待列印對話框打開。確保在點擊按鈕之前 / 頁面載入後評估腳本。