在Cypress/Javascript中如何访问函数内部更新的外部作用域变量
核心原因
所有Cypress的cy.*命令都是异步入队执行的,代码实际运行顺序和你写的顺序不一致:
- 首先同步执行初始化逻辑:
minPrice = 10000 - 把
cy.get('.btn.btn-primary').each(...)命令加入Cypress内部执行队列,不会立刻运行each的回调函数 - 同步执行
cy.log(minPrice),此时each的回调还没有运行,所以minPrice还是初始值10000 - 所有同步逻辑执行完成后,Cypress才会按顺序执行队列里的
cy.get().each()逻辑,这时候才会更新minPrice的值
修正方案
你需要把依赖minPrice的逻辑放到each()的.then()回调中,Cypress会保证等each()的所有遍历逻辑执行完成后,再运行.then()里的代码:
getMinPrice(){ // 初始化为一个很大的数值 var minPrice = 10000; cy.get('.btn.btn-primary').each(function ($el, index,$list) { // 解析每个元素获取对应商品价格 var textToParse = $el.attr('onclick'); var price = textToParse.slice(-4,-1); price = parseInt(price,10); // 对比更新最低价格 if (price < minPrice) { minPrice = price; } }).then(() => { // 所有遍历逻辑执行完成后,再打印/使用minPrice cy.log(minPrice); // 其他需要用到最低价格的逻辑也可以写在这里 }) }
补充说明:你尝试async/await无效是因为Cypress的cy.*命令不返回标准Promise,是基于内部命令队列调度执行的,所以async/await对Cypress命令不生效,和官方的说明一致。
内容的提问来源于stack exchange,提问作者Pavan Kulkarni
相关产品推荐
相关产品推荐

