如何在Python pytest框架中通过RemoteWebDriver采集Chrome DevTools性能指标?
基于已有RemoteWebDriver Bidi连接采集Chromium性能指标(同步适配pytest)
核心思路
既然已经拿到bidi_connection()的会话,我们可以绕开异步API,直接通过同步方式发送Bidi命令适配pytest的同步测试流程。Chromium内核的Bidi API支持Performance域的事件监听和数据查询,完全可以满足性能指标采集需求。
步骤1:封装同步Bidi命令发送方法
bidi_connection()返回的会话本质是WebSocket连接,我们可以封装一个同步方法来发送命令并等待响应,替代官方的异步接口:
def send_bidi_command(bidi_session, method, params=None): params = params or {} # 生成Bidi协议要求的唯一请求ID request_id = bidi_session._generate_id() # 发送命令 bidi_session.send({ "id": request_id, "method": method, "params": params }) # 同步等待响应,循环匹配请求ID while True: response = bidi_session.receive() if response.get("id") == request_id: return response.get("result")
步骤2:启用Performance域并监听性能事件
以采集**页面加载核心指标(FP/FCP/LCP)**为例,通过Bidi的Performance.enable开启监控,然后监听Performance.metrics事件:
def setup_performance_monitor(bidi_session): # 启用Performance域,指定监听metric事件 send_bidi_command(bidi_session, "Performance.enable", { "eventTypes": ["metric"] }) # 存储性能指标的容器 performance_metrics = [] # 定义事件回调,同步收集指标数据 def on_performance_metric(event): metric = event["params"]["metric"] performance_metrics.append({ "name": metric["name"], "value": metric["value"], "timestamp": metric["timestamp"] }) # 注册事件监听 bidi_session.add_event_listener("Performance.metrics", on_performance_metric) return performance_metrics
步骤3:在pytest测试中集成采集逻辑
结合现有测试用例,在页面加载前后调用上述方法完成指标采集与断言:
def test_page_performance(browser): # 获取已有的Bidi会话 bidi_session = browser.bidi_connection() # 初始化性能监控 performance_metrics = setup_performance_monitor(bidi_session) # 执行页面加载操作 browser.get("https://your-test-page.com") # 等待页面加载完成(根据业务调整等待条件,如等待目标元素出现) browser.find_element(By.ID, "page-ready-element") # 停止Performance域,清理资源 send_bidi_command(bidi_session, "Performance.disable") # 提取核心指标并断言 fp = next(m["value"] for m in performance_metrics if m["name"] == "firstPaint") fcp = next(m["value"] for m in performance_metrics if m["name"] == "firstContentfulPaint") lcp = next(m["value"] for m in performance_metrics if m["name"] == "largestContentfulPaint") assert fp < 1000, f"First Paint超过阈值: {fp}ms" assert fcp < 1500, f"First Contentful Paint超过阈值: {fcp}ms" assert lcp < 2500, f"Largest Contentful Paint超过阈值: {lcp}ms"
关键注意事项
- 版本兼容性:确保Chromium内核浏览器版本在Chrome 103+/Edge 103+以上,才能完整支持Bidi Performance域
- 会话管理:Bidi会话与RemoteWebDriver会话绑定,测试结束后需调用
bidi_session.close()关闭连接 - 超时处理:如果测试涉及异步操作,可给事件监听添加超时逻辑,避免无限阻塞
- 扩展采集:除加载指标外,还可通过
Performance.getMetrics主动查询所有指标,或监听Performance.longTask采集长任务数据
补充:主动查询性能指标示例
若不需要实时监听事件,可直接主动查询当前页面的性能数据:
def get_all_performance_metrics(bidi_session): return send_bidi_command(bidi_session, "Performance.getMetrics")
内容的提问来源于stack exchange,提问作者Muttonchop
相关产品推荐
相关产品推荐

