如何在Cypress的cy.exec块外部获取内部赋值的变量值?
问题原因
Cypress的所有命令都是异步执行的,cy.exec()会被加入Cypress的命令队列等待执行,而你写在cy.exec()外部的cy.log('Outside exec')和cy.log(version)属于同步代码,会先于cy.exec()的回调函数运行。此时变量还未被赋值,所以打印结果是undefined。
另外注意你代码里的小问题:回调内写的是ocpVersion = result.stdout,但变量定义的是version,变量名要保持一致,否则也会导致赋值失败。
解决方案
有几种常用的处理方式:
1. 将后续逻辑放在then回调内
所有需要使用version变量的代码,都要放在cy.exec()的then回调内部,确保变量赋值完成后再执行:
let cmd = `<a cmd>` var version: string cy.exec(cmd).then(result => { expect(result.stderr).to.be.empty version = result.stdout cy.log('Inside exec') cy.log(version); // 所有依赖version的代码都放在这里 cy.log('Outside exec (now inside then)') cy.log(version); })
2. 使用Cypress别名存储变量
用cy.wrap()将变量存为别名,后续通过cy.get('@别名')获取:
let cmd = `<a cmd>` cy.exec(cmd).then(result => { expect(result.stderr).to.be.empty cy.wrap(result.stdout).as('version') cy.log('Inside exec') cy.get('@version').then(version => cy.log(version)) }) // 后续需要使用变量的地方 cy.get('@version').then(version => { cy.log('Outside exec using alias') cy.log(version) })
3. 结合async/await使用(需包裹在命令回调内)
Cypress支持在命令回调中使用async/await,适合有额外异步逻辑的场景:
let cmd = `<a cmd>` cy.exec(cmd).then(async (result) => { expect(result.stderr).to.be.empty const version = result.stdout cy.log('Inside exec') cy.log(version); // 这里可以编写带await的异步逻辑 cy.log('Outside exec with async') cy.log(version); })
内容的提问来源于stack exchange,提问作者kabir Bharti
相关产品推荐
相关产品推荐

