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代码直接点击后就执行断言,可能前端还未处理完响应。
修复方案
针对上述问题调整代码:
- 在
page.route中添加method="PUT"参数,仅拦截目标PUT请求 - 使用
json参数传递标准JSON响应体,替代手动拼接的字符串 - 添加
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
相关产品推荐
相关产品推荐

