You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:20:14