跳到主要內容

對話框

簡介

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

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

預設情況下,對話框會被 Playwright 自動關閉,因此您不必處理它們。但是,您可以在觸發對話框的動作之前註冊對話框處理程序,以 Dialog.accept()Dialog.dismiss() 來接受或關閉它。

page.onDialog(dialog -> dialog.accept());
page.getByRole(AriaRole.BUTTON).click();
注意

Page.onDialog(handler) 監聽器必須處理對話框。否則您的動作將會停滯,無論是 Locator.click() 或其他動作。這是因為 Web 中的對話框是強制回應的,因此會阻止進一步的頁面執行,直到它們被處理為止。

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

警告

錯誤!

page.onDialog(dialog -> System.out.println(dialog.message()));
page.getByRole(AriaRole.BUTTON).click(); // Will hang here
注意

如果沒有 Page.onDialog(handler) 的監聽器,則所有對話框都會自動關閉。

beforeunload 對話框

當使用真值 setRunBeforeUnload 值調用 Page.close() 時,頁面會執行其卸載處理程序。這是 Page.close() 不等待頁面實際關閉的唯一情況,因為頁面最終可能會保持開啟狀態。

您可以註冊對話框處理程序來自行處理 beforeunload 對話框

page.onDialog(dialog -> {
assertEquals("beforeunload", dialog.type());
dialog.dismiss();
});
page.close(new Page.CloseOptions().setRunBeforeUnload(true));

為了斷言透過 window.print 觸發了列印對話框,您可以使用以下程式碼片段

page.navigate("<url>");

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

page.waitForFunction("window.waitForPrintDialog");

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