当前位置: 首页 > news >正文

自动化测试工具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")

这段代码将等待在点击按钮后打印对话框被打开。请确保在点击按钮之前/页面加载之后执行注入的脚本。

相关文章:

  • 【计算机组成原理 第5版】白、戴编著 第三章多层次的存储器 题型总结2 cache部分
  • 6.4 打卡
  • 每日一令:Linux 极简通关指南 - 汇总
  • [华为eNSP] 在eNSP上实现IPv4地址以及IPv4静态路由的配置
  • 操作系统入门:核心概念与设计逻辑
  • GO语言----基础类型取别名
  • 使用osqp求解简单二次规划问题
  • 路凯智行助力华润水泥长治矿区开启无人运输新场景
  • w377集团门户网站设计与实现
  • 实训日记 1
  • windows资源管理器无响应,预览时卡死
  • 【动手学MCP从0到1】2.1 SDK介绍和第一个MCP创建的步骤详解
  • CodeTop100 Day22
  • 第八部分:第五节 - 生命周期与副作用 (`useEffect` Hook):组件的幕后工作
  • Java对象创建过程
  • Python-多线程(一)
  • Qwen3与MCP协议:重塑大气科学的智能研究范式
  • JSON基础知识
  • Java框架面试题
  • 【HarmonyOS 5】游戏开发教程
  • 网页模板下载网站/如何投放网络广告
  • 网站服务器能更换吗/深圳网站搜索优化工具
  • 如何加强企业网站建设 论文/网页怎么做
  • 中小型企业网站优化推广/公司网站怎么弄
  • 手表商城网站建设/搜索排名广告营销
  • dede做购物网站/宁波网络营销推广公司