如何在Cypress中访问beforeEach内通过cy.wrap定义的别名变量?
报错原因
- 核心问题是
it测试用例的回调使用了箭头函数:Cypress 中通过.as()定义的别名会挂载到测试上下文对象上,而箭头函数不会绑定独立的this,会继承外层作用域的this,无法访问到 Cypress 挂载的上下文属性,因此this.auth读取为 undefined。 - 无其他异步顺序问题,Cypress 命令会自动排队执行,只要上下文正确就可以正常拿到别名对应的值。
修复方案
你可以选择以下任意一种方案解决:
方案1:将it的回调改为普通函数
修改回调函数声明方式,让this可以指向 Cypress 测试上下文:
beforeEach(() => { cy.login(email).then((token) => { let headers = { "x-access-token": token } cy.wrap(headers).as("auth") }) }) // 把箭头函数 () => {} 替换为普通函数 function() {} it("Buy " + par, function() { if (stables.indexOf(par) < 0) { cy.request({ method: "POST", url: url, headers: this.auth, body: payloadBUYToken, }) } })
方案2:通过cy.get('@别名')直接读取值,不依赖this上下文
这种方式不需要修改函数类型,避免上下文绑定的坑:
beforeEach(() => { cy.login(email).then((token) => { let headers = { "x-access-token": token } cy.wrap(headers).as("auth") }) }) it("Buy " + par, () => { if (stables.indexOf(par) < 0) { // 直接获取别名对应的变量值 cy.get('@auth').then(auth => { cy.request({ method: "POST", url: url, headers: auth, body: payloadBUYToken, }) }) } })
内容的提问来源于stack exchange,提问作者by3by3byt3
相关产品推荐
相关产品推荐

