Cypress全局变量无法存储值?如何在then代码块外获取赋值变量
问题原因
你遇到的不是变量作用域的问题,而是Cypress的命令执行机制导致的:
Cypress所有cy.*开头的命令都是异步入队执行的,不会立刻运行。你写的代码实际执行顺序是:
- 同步执行初始化逻辑,给
tkname赋值为空字符串 - 将
cy.get()命令加入执行队列 - 同步执行result 2位置的
cy.log(tkname),此时cy.get()的回调还没触发,tkname还是初始的空值 - 所有同步代码执行完成后,Cypress才会按顺序执行队列里的命令:先跑
cy.get()获取元素,再触发then回调,给tkname赋值后打印result 1的日志,这时候才会修改tkname的值。
解决方法
方法1:将依赖取值的逻辑放入命令链的回调中
Cypress的命令会按入队顺序依次执行,你可以把需要用到tkname的后续逻辑放在then回调里,或者追加一个cy.then()承接前面的执行结果:
it('My function', function() { var tkname ='' cy.get('tr:nth-child(1) td:nth-child(3) div div div div p').then(coiname => { tkname = Cypress.$(coiname).text() //result 1 cy.log(tkname) }) // 用cy.then()等前面的命令执行完再运行内部逻辑 cy.then(() => { //result 2 cy.log(tkname) }) })
方法2:使用Cypress别名存储取值(官方推荐方式)
对于跨逻辑块的共享值,你可以用as()定义别名,后续通过cy.get('@别名')获取存储的值:
it('My function', function() { cy.get('tr:nth-child(1) td:nth-child(3) div div div div p') .invoke('text') .as('tkname') // 将获取到的文本存为别名tkname cy.get('@tkname').then(tkname => { //result 1 cy.log(tkname) }) //result 2 cy.get('@tkname').then(tkname => { cy.log(tkname) }) })
内容的提问来源于stack exchange,提问作者Năng Trương
相关产品推荐
相关产品推荐

