Cypress中POST请求未被拦截问题求助
无法拦截登录请求的原因及解决方案
核心原因:cy.intercept不支持拦截cy.request发起的请求
Cypress的cy.intercept仅能捕获浏览器层面发出的XHR/fetch请求,而cy.request是直接从Node.js层发送的HTTP请求,完全绕过浏览器网络栈,所以你的拦截配置对cy.request完全无效,这是导致请求未被拦截的根本原因。
其他潜在问题
- URL不一致:你的
cy.request中URL拼接后带有空格:Cypress.env("authBaseUrlApi") + "sign-in "(注意sign-in末尾的空格),而拦截的目标URL是https://auth.website.dev/v2/sign-in,即使拦截能生效,这种URL不匹配也会导致拦截失败。 - 拦截注册时机:虽然不是核心问题,但
cy.intercept建议在请求发起前提前注册(比如beforeEach最开始),你在发起请求前的setHeaderQA中才注册拦截,虽然Cypress命令队列会保证顺序,但提前注册更稳妥。
修复方案
既然cy.intercept管不到cy.request,直接在cy.request中手动设置请求头即可,无需使用拦截:
修改getSessionCookie命令,把请求头直接加到cy.request的配置里:
Cypress.Commands.add('getSessionCookie', (emailAddress: string, password: string) => { const { headerKey, headerValue } = Cypress.env(); // 直接获取header配置 cy.task('createAndAccessSecret', Cypress.env('version')).then((cfToken) => { cy.request({ method: 'POST', url: Cypress.env("authBaseUrlApi") + "sign-in", // 去掉末尾的空格 body: { email: emailAddress, password: password, cf_token: cfToken }, headers: { [headerKey]: headerValue // 直接设置请求头 } }).then((response) => { return response.headers['set-cookie']; }) }) })
同时可以删除setHeaderQA命令,因为已经不需要它通过拦截设置header了。另外务必修正URL中的空格问题,确保请求URL和后端接口完全一致。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

