自动化测试工具playwright中文文档-------16.对话框
简介
Playwright 可以与网页对话框进行交互,例如警告(alert)、确认(confirm)、提示(prompt)以及卸载前确认(beforeunload confirmation)。对于打印对话框,请参阅打印( Print)部分。
alert()、confirm()、prompt() 对话框
默认情况下,Playwright 会自动关闭对话框,因此您无需手动处理它们。但是,您可以在触发对话框的操作之前注册一个对话框处理程序,以便使用 dialog.accept()
或 dialog.dismiss()
方法来接受或关闭对话框。这样,您就可以根据测试需要控制对话框的行为,模拟用户的点击操作。
page.on("dialog", lambda dialog: dialog.accept())
page.get_by_role("button").click()
注意
您必须为 page.on("dialog")
监听器处理对话框。否则,您的操作(无论是 locator.click()
还是其他任何操作)将会停滞不前。这是因为 Web 中的对话框是模态的,因此会阻塞页面的进一步执行,直到对话框被处理完毕。这意味着,如果您没有为可能出现的对话框注册处理程序,那么触发对话框的操作将会等待对话框被处理后才能继续执行,这可能会导致测试脚本挂起或超时。
因此,下面的代码片段将永远无法解析:
page.on("dialog", lambda dialog: print(dialog.message))
page.get_by_role("button").click() # Will hang here
请注意
如果page.on("dialog")没有监听器,则所有对话框都将自动取消。
beforeunload 对话框
当以 run_before_unload=True
的参数调用 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) # 尝试关闭页面,并运行beforeunload处理程序
handle_dialog
函数会检查对话框的类型是否为 'beforeunload'
,并调用 dialog.dismiss()
方法来拒绝离开页面。在注册事件监听器时,使用 lambda
表达式,传递函数名。然后,调用 page.close(run_before_unload=True)
会尝试关闭页面,并在尝试关闭之前运行 beforeunload
对话框的处理程序。
打印对话框
为了验证是否通过 window.print 触发了打印对话框,您可以使用以下代码片段:
page.goto("<url>") # 导航到目标网页 # 在页面上注入JavaScript代码,用于拦截print函数调用并等待
page.evaluate("""
(() => { // 重写window.print函数,使其返回一个Promise,以便我们可以等待它 window.originalPrint = window.print; // 保存原始的print函数 window.waitForPrintDialog = new Promise(resolve => { window.print = function() { // 当print被调用时,解决Promise,但不执行实际的打印操作 resolve(); // 可以选择调用原始的print函数,如果需要实际打印的话 // window.originalPrint(); }; });
})()
""") # 点击触发打印的按钮
page.get_by_text("Print it!").click() # 等待打印对话框的Promise被解决,即等待print函数被调用
page.wait_for_function("window.waitForPrintDialog")
这段代码将等待在点击按钮后打印对话框被打开。请确保在点击按钮之前/页面加载之后执行注入的脚本。