Cypress向后端发送两次请求但GUI仅显示单次的问题咨询
问题相关测试代码
let rxId = ""; let basketAuthToken = ""; let basketId = ""; let replacedBody = ""; cy.fixture(`payload/${ordersPostPayload}`).then((Body) => { cy.readFile(`temp/resultIdFile.json`).then((resultIdFile) => { Id = resultIdFile.lastSucceededRxId; basketAuthToken = resultIdFile.baskets[0].authToken; basketId = resultIdFile.baskets[0].basketId; cy.log(`the value of the read value is ${Id}`); replacedBody = JSON.stringify(Body).split(`$Id`).join(Id); cy.writeFile(`temp/ordersPostPayload.json`, replacedBody); cy.request({ method: "POST", url: `https://***/ops/orders`, headers: { "Content-Type": "application/json", Channel: "**", "EsbApi-Subscription-Key": `****`, "Accept-Language": `en-US`, "basket-token": basketAuthToken, "basket-id": basketId, redirectUrl: "****/evaluate-payment", cancelUrl: "****/evaluate-payment" }, body: replacedBody, failOnStatusCode: false }).then((response) => { cy.writeFile("temp/result.json", response); }); }); });
常见原因
- Cypress
cy.request默认开启重定向跟随:如果POST请求得到后端返回的307/308状态码,Cypress会自动携带相同请求体、用相同请求方法向重定向地址再发一次请求,GUI默认仅展示最终的请求记录,不会显示第一次的重定向请求。 - 重试配置触发重复请求:如果Cypress全局配置了测试重试,或自定义了
cy.request的重试逻辑,非2xx响应会触发重试,导致重复发送请求。 - 代码块被重复执行:这段请求代码如果写在
beforeEach、afterEach等会重复触发的钩子中,或测试用例被重复加载,会导致代码执行两次。 - 后端日志重复打印:后端日志中间件可能存在重复打印逻辑,同一个请求被记录了两次。
排查步骤
- 确认Cypress实际请求发送情况:启动Cypress时添加环境变量
DEBUG=cypress:server:request,运行测试后查看控制台输出,可看到所有实际发出的请求记录,确认是否真的发送了两次。 - 禁用重定向跟随验证:修改
cy.request配置,添加followRedirect: false,再次运行测试查看返回状态码,如果返回3xx类型状态码,说明是重定向导致的重复请求。 - 验证代码执行次数:在
cy.request代码前添加cy.log("发起请求"),查看GUI的日志打印次数,如果打印了两次说明代码被重复执行。 - 抓包验证:本地测试时通过Fiddler、Wireshark等工具抓对应端口的请求包,直接确认实际发出的请求数量。
- 核对后端请求ID:查看两条后端日志的请求ID、时间戳,如果完全一致说明是后端日志重复打印,并非两次请求。
解决方法
- 重定向导致的问题:如果不需要跟随重定向,保留
followRedirect: false配置即可;如果需要重定向,可调整后端逻辑对POST请求返回302/303状态码,Cypress会自动转为GET请求重定向,不会重复发送POST。 - 重试导致的问题:给当前
cy.request单独添加retry: false配置,或调整全局重试规则,排除非幂等的POST请求的重试逻辑。 - 代码重复执行的问题:将请求代码迁移到仅执行一次的
before钩子,或者单独的it测试块中,避免重复触发。 - 日志重复的问题:调整后端日志打印逻辑,避免同一个请求被多次记录。
内容的提问来源于stack exchange,提问作者FarFarAway
相关产品推荐
相关产品推荐

