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

Cypress请求拦截示例转Playwright Python后测试失败,求修复

Playwright Python拦截请求断言失败的排查与修复

问题背景

将Cypress中拦截并修改评论区PUT请求的测试用例改写为Playwright Python(pytest)版本后,最后一行断言expect(page.locator(".network-put-comment")).to_contain_text(message)执行失败。

问题排查

对比Cypress与Playwright代码,存在三个关键差异导致断言失败:

  • 路由拦截未限制请求方法:Cypress的cy.intercept明确指定拦截PUT方法的请求,但Playwright的page.route默认拦截所有HTTP方法的请求,可能误拦截非目标请求,导致PUT请求未被正确处理。
  • 响应格式不符合要求:Cypress返回标准JSON响应体,而Playwright代码用body传递了单引号包裹的字符串,前端无法正确解析为JSON对象,导致错误提示未渲染到页面。
  • 缺少请求完成的等待逻辑:Cypress通过cy.wait('@putComment')确保请求处理完成后再断言,Playwright代码直接点击后就执行断言,可能前端还未处理完响应。

修复方案

针对上述问题调整代码:

  1. 在page.route中添加method="PUT"参数,仅拦截目标PUT请求
  2. 使用json参数传递标准JSON响应体,替代手动拼接的字符串
  3. 添加page.wait_for_request等待目标请求完成,确保前端完成响应处理

修复后的完整代码

def test_network_intercept(page: Page):
    page.goto("https://example.cypress.io/commands/network-requests")
    message = "whoa, this comment does not exist"

    def handle_route(route: Route):
        route.fulfill(
            status=404,
            json={"error": message},  # 用json参数传递标准JSON对象
            headers={"access-control-allow-origin": "*"},
        )
    # 仅拦截PUT方法的comments请求
    page.route("**/comments/*", handle_route, method="PUT")
    page.locator(".network-put").click()
    # 等待PUT请求完成
    page.wait_for_request("**/comments/*", method="PUT")
    # 执行断言
    expect(page.locator(".network-put-comment")).to_contain_text(message)

内容的提问来源于stack exchange,提问作者hpr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:23:28