Skip to main content

對話框

簡介

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

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

根據預設,對話框會被 Playwright 自動關閉,所以你不需要處理它們。然而,你可以在觸發對話框的動作之前註冊一個對話框處理器,以便dialog.accept()dialog.dismiss()它。

page.on("dialog", lambda dialog: dialog.accept())
page.get_by_role("button").click()
note

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

由此可見,以下程式碼片段將永遠無法解析:

warning

錯誤!

page.on("dialog", lambda dialog: print(dialog.message))
page.get_by_role("button").click() # Will hang here
note

如果沒有 page.on("dialog") 的監聽器,所有對話框將自動關閉。

beforeunload 對話框

page.close() 被呼叫並且 run_before_unload 值為真時,頁面會執行其卸載處理程序。這是唯一一種 page.close() 不會等待頁面實際關閉的情況,因為在操作結束時頁面可能會保持打開狀態。

您可以註冊一個對話框處理器來自行處理 beforeunload 對話框:

def handle_dialog(dialog):
assert dialog.type == 'beforeunload'
dialog.dismiss()

page.on('dialog', lambda: handle_dialog)
page.close(run_before_unload=True)

列印對話框

為了確認透過 window.print 觸發的列印對話框,你可以使用以下程式碼片段:

page.goto("<url>")

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

page.wait_for_function("window.waitForPrintDialog")

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