Cypress执行cy.visit()时跳转至非目标请求页面问题如何解决
问题原因
- 最常见原因 应用自身路由鉴权逻辑:当前
cy.login()登录的账号无/sites/2/users页面的访问权限,前端路由守卫或后端鉴权逻辑自动将请求重定向到/sites/2/global - 登录方法未完成全流程:
cy.login()自定义命令存在未处理的异步跳转逻辑,登录完成后残留的重定向操作覆盖了后续cy.visit的目标地址 - 服务端重定向配置:后端对
/sites/2/users路径配置了301/302重定向规则,直接返回了/sites/2/global作为目标地址 - Cypress全局配置干扰:
cypress/support目录下的全局钩子函数存在路由修改逻辑,强制跳转至/sites/2/global
解决步骤
- 优先排除应用本身逻辑问题:手动打开浏览器,使用和
cy.login()相同的账号登录系统,直接输入地址http://localhost:3002/sites/2/users,确认是否会自动跳转。如果跳转,优先处理应用逻辑:- 更换拥有用户管理权限的测试账号登录
- 临时关闭测试环境下的页面访问权限校验
- 优化测试用例逻辑:
- 给登录请求添加别名,等待登录全流程完成后再执行访问操作:
// 登录逻辑中给登录接口打别名 cy.intercept('POST', '/api/login').as('loginReq') cy.login() cy.wait('@loginReq')- 检查
cy.visit的响应状态,确认重定向来源:
cy.visit("/sites/2/users", { failOnStatusCode: false }) .then((res) => { // 打印状态码,如果是3xx说明是服务端返回的重定向 console.log('访问响应状态:', res.status) // 打印响应头的location字段,确认重定向地址是否由服务端返回 console.log('重定向地址:', res.headers?.location) }) - 排查全局配置:检查
cypress/support/e2e.js(旧版本对应index.js)中是否存在全局beforeEach、afterEach钩子修改路由路径,或者是否有全局拦截器重写了访问地址。
内容的提问来源于stack exchange,提问作者Andy Harmuth
相关产品推荐
相关产品推荐

