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

Cypress中each()作用域外数组丢失值问题求助

问题原因与解决方案

你遇到的核心问题是Cypress命令的异步执行特性——和Python的同步执行逻辑不同,Cypress的所有命令(包括cy.get()、.each())都是异步加入命令队列的,不会立即执行。你在.each()外面写的cy.log(allPrices[3])会在.each()遍历完成前就执行,这时候数组还没被填充,自然是空的。

下面是修正后的完整实现,同时完成「提取最高价对应名称」的需求:

it('Get table and find highest price', function(){
  // 访问目标页面
  cy.visit('https://www.computerbase.de/thema/grafikkarte/rangliste/')

  // 收集所有显卡的名称和价格(用对象数组存储,避免索引错位)
  const gpuData = [];

  // 遍历表格的每一行(排除表头,用tr:gt(0))
  cy.get('table tr:gt(0)').each(($row) => {
    // 获取第一列的显卡名称
    const name = $row.find('td:nth-child(1)').text().trim();
    
    // 获取最后一列的价格文本并处理
    let priceText = $row.find('td:nth-child(9)').text().split("€")[0].trim();
    // 去掉千分位的点,转成数字
    if(priceText.includes(".")){
      priceText = priceText.replace(".", "");
    }
    const price = parseInt(priceText, 10);

    // 跳过无效价格(比如无货的情况)
    if(!isNaN(price)){
      gpuData.push({ name, price });
    }
  }).then(() => {
    // 所有数据收集完成后,在这里处理(.then会等待前面的each执行完毕)
    if(gpuData.length === 0){
      cy.log('未找到有效价格数据');
      return;
    }

    // 找到价格最高的显卡
    const highestPriceGpu = gpuData.reduce((prev, current) => {
      return (prev.price > current.price) ? prev : current;
    });

    // 输出结果
    cy.log(`价格最高的显卡是:${highestPriceGpu.name},价格:${highestPriceGpu.price}€`);
  })
})

关键修正点说明

  • 用.then()包裹后续逻辑:.each()执行完成后,.then()里的代码才会运行,此时gpuData已经被完全填充。
  • 按行遍历而非单独列:避免单独取两列可能出现的索引错位问题(比如表格有隐藏行、合并单元格等情况)。
  • 价格转数字并校验:把处理后的价格转成整数,同时跳过无效值(比如无货的空价格),确保后续计算准确。
  • 用reduce找最大值:比遍历数组找最大值更简洁,符合JS的写法习惯。

内容的提问来源于stack exchange,提问作者sero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:09:09