大家好,我是阿萨。Web 测试里很多时候都有弹出对话框。如何用Playwright 处理这些对话框呢?Playwright 可以和这些web 页面的对话框进行交互,如提醒、确认、提示以及unload确认。
alert(), confirm(), prompt()这些对话框如何写脚本呢?
默认情况下,对话框会被Playwright自动消失,所以你不需要处理它们。,你可以在触发对话框的动作之前注册一个对话框处理程序,方便处理对话框或忽略对话框。
同步
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()还是其他什么。这是因为Web中的对话框是模态的,因此会阻止进一步的页面执行,直到它们被处理。因此,下面的片段将永远无法解决。
同步
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() # 将在这里挂起
注意如果没有page.on("dialog")的监听器,所有的对话框都会被自动忽略。
beforeunload 对话框
当page.close()被调用时,加上truthy 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)
异步
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)