Cypress测试中如何将if语句块内的变量值传递到外部使用
代码问题原因
原代码存在4个核心错误,导致逻辑无法按预期运行:
- Cypress命令全部为异步队列执行机制,
cy.get().then()外部的代码会先于回调内部逻辑执行,此时button还未完成赋值,读取到的永远是初始空值 cy.then()要求传入回调函数作为入参,直接写cy.then(button = true)属于同步执行代码,不会按命令队列顺序执行- JS语法中布尔假值为全小写
false,大写开头的False是未定义变量,运行时会直接抛出引用错误 should()是Cypress链式调用方法,仅能在Cypress命令返回的实例上调用,普通JS变量不存在该方法,且原有断言语法不符合chai断言规范
修复方案
推荐使用Cypress原生别名机制存值,彻底规避异步执行顺序问题,代码如下:
cy.get('@checkSkipButton').then(checkSkipButton => { if (checkSkipButton) { cy.log("NOT CLICKABLE") cy.wrap(true).as('button') } else { cy.log("CLICKABLE") cy.wrap(false).as('button') } }) // 所有依赖button值的逻辑,都要放在Cypress命令链中保证执行顺序 cy.get('@button').then(buttonValue => { cy.log(`value is ${buttonValue}`) expect(buttonValue).to.eq(true) })
如果要使用普通变量存储值,必须把所有依赖该变量的逻辑全部放到then回调内部,保证赋值完成后再执行:
// 提前声明变量 let button cy.get('@checkSkipButton').then(checkSkipButton => { if (checkSkipButton) { cy.log("NOT CLICKABLE") button = true } else { cy.log("CLICKABLE") button = false } // 依赖button的逻辑全部写在回调内部 cy.log(`value is ${button}`) expect(button).to.eq(true) })
内容的提问来源于stack exchange,提问作者akshith
相关产品推荐
相关产品推荐

