對話框
簡介
Playwright 可以與網頁對話框互動,例如 alert
、 confirm
、 prompt
以及 beforeunload
確認。關於列印對話框,請參閱「列印」。
alert()、confirm()、prompt() 對話框
預設情況下,對話框會被 Playwright 自動關閉,因此您不必處理它們。但是,您可以在觸發對話框的動作之前註冊一個對話框處理程序,以 dialog.accept() 或 dialog.dismiss() 來接受或關閉它。
- 同步
- 非同步
page.on("dialog", lambda dialog: dialog.accept())
page.get_by_role("button").click()
page.on("dialog", lambda dialog: dialog.accept())
await page.get_by_role("button".click())
注意
page.on("dialog") 監聽器**必須處理**對話框。否則您的動作將會停滯,無論是 locator.click() 還是其他動作。這是因為網頁中的對話框是強制回應的,因此會阻止頁面進一步執行,直到它們被處理為止。
因此,以下程式碼片段將永遠不會解析
警告
錯誤!
- 同步
- 非同步
page.on("dialog", lambda dialog: print(dialog.message))
page.get_by_role("button").click() # Will hang here
page.on("dialog", lambda dialog: print(dialog.message))
await page.get_by_role("button").click() # Will hang here
注意
如果沒有 page.on("dialog") 的監聽器,則所有對話框都會自動關閉。
beforeunload 對話框
當使用真值 run_before_unload 值調用 page.close() 時,頁面會執行其卸載處理程序。這是 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)
async def handle_dialog(dialog):
assert dialog.type == 'beforeunload'
await dialog.dismiss()
page.on('dialog', lambda: handle_dialog)
await 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")
await page.goto("<url>")
await page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()")
await page.get_by_text("Print it!").click()
await page.wait_for_function("window.waitForPrintDialog")
這將等待在點擊按鈕後開啟列印對話框。請確保在點擊按鈕之前/在頁面載入後評估腳本。