Cypress设置req.followRedirect=false无法阻止页面重定向该如何解决?
问题根因
你在cy.intercept中设置的req.followRedirect = false仅作用于Cypress的代理层,控制Cypress自身是否跟随重定向获取后续响应内容,完全不会影响浏览器的默认跳转行为。官方示例中cy.request的followRedirect配置也是同理,它仅控制cy.request命令自身的请求逻辑,和页面内浏览器触发的跳转无关。
可行解决方案
方案1:篡改重定向响应,阻止浏览器触发跳转
浏览器只有收到3xx状态码才会执行跳转逻辑,我们可以直接在拦截逻辑中修改响应状态,切断跳转触发条件,同时保留原始跳转信息用于断言:
it('should redirect to some external website on click', () => { cy.intercept( 'GET', 'http://localhost.com:4100?*', (req: CyHttpMessages.IncomingHttpRequest) => { req.reply((res) => { // 篡改响应,将3xx重定向状态改为200,把原始跳转地址存入自定义头用于断言 res.send({ statusCode: 200, body: '', headers: { 'x-original-location': res.headers.location } }) }) } ).as('redirect'); cy.get('#some-button').click(); // 点击该按钮会触发重定向 cy.wait('@redirect') .its('response.headers.x-original-location') .should('include', 'value-A') .and('include', 'value-B'); });
该方案兼容所有重定向场景,包括服务端返回3xx跳转、前端JS主动触发window.location跳转。
方案2:修改跳转触发元素属性,阻止原生跳转
如果跳转是通过<a>标签的href属性触发的,可以直接修改元素属性阻断跳转:
cy.get('#some-button') .invoke('removeAttr', 'href') // 移除href属性,阻止原生跳转 .click(); // 后续正常断言请求参数即可
内容的提问来源于stack exchange,提问作者Richard77
相关产品推荐
相关产品推荐

