對話框
簡介
Playwright 可以與網頁對話框互動,例如 alert
、confirm
、prompt
以及 beforeunload
確認。對於列印對話框,請參閱列印。
alert()、confirm()、prompt() 對話框
預設情況下,對話框會被 Playwright 自動關閉,因此您不必處理它們。但是,您可以在觸發對話框的動作之前註冊一個對話框處理程序,以 Dialog.AcceptAsync() 接受或 Dialog.DismissAsync() 關閉它。
Page.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
await Page.GetByRole(AriaRole.Button).ClickAsync();
注意
Page.Dialog 監聽器**必須處理**對話框。否則您的動作將會停滯,無論是 Locator.ClickAsync() 或其他動作。這是因為 Web 中的對話框是強制回應的,因此會阻止頁面繼續執行,直到它們被處理。
因此,以下程式碼片段將永遠不會解析
警告
錯誤!
page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.GetByRole(AriaRole.Button).ClickAsync(); // Will hang here
注意
如果沒有 Page.Dialog 的監聽器,所有對話框都會自動關閉。
beforeunload 對話框
當使用真值 RunBeforeUnload 值調用 Page.CloseAsync() 時,頁面會執行其卸載處理程序。這是 Page.CloseAsync() 不等待頁面實際關閉的唯一情況,因為頁面最終可能會保持開啟狀態。
您可以註冊一個對話框處理程序來自行處理 beforeunload
對話框
Page.Dialog += async (_, dialog) =>
{
Assert.AreEqual("beforeunload", dialog.Type);
await dialog.DismissAsync();
};
await Page.CloseAsync(new() { RunBeforeUnload = true });
列印對話框
為了斷言通過 window.print
觸發了列印對話框,您可以使用以下程式碼片段
await Page.GotoAsync("<url>");
await Page.EvaluateAsync("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
await Page.GetByText("Print it!").ClickAsync();
await Page.WaitForFunctionAsync("window.waitForPrintDialog");
這將等待在按鈕點擊後開啟列印對話框。請確保在點擊按鈕之前/頁面載入後評估腳本。