为何无法从测试文件访问Cypress.env中存储的token?
Cypress中token存入环境变量后仍为undefined的原因及解决办法
核心问题出在Cypress命令的异步特性上:你在测试文件里调用get_token后立刻读取Cypress.env('token'),但get_token里的POST请求是异步操作,此时请求还没完成,token还没被写入环境变量,自然拿到的是undefined。
你对Cypress.env的全局特性理解没错,但它的全局可访问是建立在赋值操作已完成的基础上。而你的赋值动作Cypress.env('token', token)是在POST请求的回调里执行的,属于异步代码,测试文件里的同步逻辑会先跑完,这时候token还没存进去。
正确实现方式
1. 等待异步命令完成后再使用token
Cypress的命令队列会自动处理异步顺序,只要确保在get_token执行完后再发起需要token的请求即可:
// 测试文件代码 cy.get_token() // 等待这个异步命令执行完毕 .then(() => { cy.request({ method: 'GET', url: '/target-api', headers: { Authorization: `Bearer ${Cypress.env('token')}` } }) })
2. 让get_token命令返回token(更灵活)
修改command.js里的命令,让它直接返回获取到的token,这样测试代码可以直接拿到值,无需依赖环境变量的读取时机:
// command.js代码 Cypress.Commands.add('get_token', () => { return cy.request({ method: 'POST', url: '/token-api', body: { /* 你的请求参数 */ } }).then(res => { const token = res.body.token Cypress.env('token', token) // 仍可存入环境变量供其他地方使用 return token // 返回token给测试代码 }) })
测试文件中使用:
cy.get_token().then(token => { cy.request({ method: 'GET', url: '/target-api', headers: { Authorization: `Bearer ${token}` } }) })
3. 可选:改用Cypress.config存储
如果觉得Cypress.env的时机问题不好把控,也可以用Cypress.config来存储全局变量,用法和Cypress.env类似:
// command.js里赋值 Cypress.config('token', token) // 测试文件里读取 Cypress.config('token')
同样要注意等待异步操作完成后再读取。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

