You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Cypress/Javascript中如何访问函数内部更新的外部作用域变量

核心原因

所有Cypress的cy.*命令都是异步入队执行的,代码实际运行顺序和你写的顺序不一致:

  1. 首先同步执行初始化逻辑:minPrice = 10000
  2. 把cy.get('.btn.btn-primary').each(...)命令加入Cypress内部执行队列,不会立刻运行each的回调函数
  3. 同步执行cy.log(minPrice),此时each的回调还没有运行,所以minPrice还是初始值10000
  4. 所有同步逻辑执行完成后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:11