對話框
簡介
Playwright 可以與網頁對話框互動,例如 alert
、confirm
、prompt
以及 beforeunload
確認。關於列印對話框,請參見 Print。
alert(), confirm(), prompt() 對話框
預設情況下,對話框會由 Playwright 自動關閉,因此您不必處理它們。然而,您可以在觸發對話框的操作之前註冊一個對話框處理程序,以便Dialog.AcceptAsync()或Dialog.DismissAsync()它。
Page.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
await Page.GetByRole(AriaRole.Button).ClickAsync();
note
Page.Dialog listener 必須處理 該對話框。否則您的操作將會停滯,不論是 Locator.ClickAsync() 還是其他操作。這是因為網頁中的對話框通常為模態視窗 (modal dialog),會阻擋進一步的頁面執行,直到它們被處理為止。
由此可見,以下程式碼片段將永遠無法解析:
warning
錯誤 !
page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.GetByRole(AriaRole.Button).ClickAsync(); // Will hang here
note
如果沒有 Page.Dialog 的監聽器,所有對話框將自動關閉。
beforeunload 對話框
當 Page.CloseAsync() 被呼叫並且 runBeforeUnload
值為真時,頁面會執行其卸載處理程序。這是唯一的情況,當 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");
這將在按鈕被點擊後等待列印對話框被打開。確保在點擊按鈕之前/頁面載入後評估腳本。