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

Cypress 13+Cucumber中跨测试用例存储读取数组测试数据方法

解决Cypress 13 + Cucumber跨用例存储/读取数组数据的方案

一、先修正存储数据的代码问题

你的代码存在变量名冲突、未处理Cypress异步特性两个核心问题,导致数组无法正确填充和存储。修正后的存储步骤代码如下:

Then(`I store items with price in global variable`, () => {
  cy.log(`Start storing items and prices`);
  
  // 初始化数组,避免和.each的参数重名
  const items = [];
  const prices = [];
  const teamBs = [];

  // 1. 收集商品名称
  cy.get('.itemsName').each((itemEl) => {
    const itemText = Cypress.$(itemEl).text().trim(); // 去除多余空格
    items.push(itemText);
    cy.log(`Added item: ${itemText}`);
  })
  // 2. 收集Team B名称
  .then(() => {
    return cy.get('.betslip-tip__team.teamB').each((teamEl) => {
      const teamText = Cypress.$(teamEl).text().trim();
      teamBs.push(teamText);
      cy.log(`Added Team B: ${teamText}`);
    });
  })
  // 3. 收集价格,所有元素处理完后统一存入全局环境
  .then(() => {
    return cy.get('.price').each((priceEl) => {
      const priceText = Cypress.$(priceEl).text().trim();
      prices.push(priceText);
      cy.log(`Added price: ${priceText}`);
    });
  })
  .then(() => {
    // 将数组存入Cypress.env,这是跨用例共享的全局存储
    Cypress.env('items', items);
    Cypress.env('prices', prices);
    Cypress.env('teamBs', teamBs);
    
    // 验证存储结果
    cy.log(`Stored items: ${JSON.stringify(items)}`);
    cy.log(`Stored prices: ${JSON.stringify(prices)}`);
  });
});

二、关键问题解释

  1. 变量名冲突:你之前在.each((items)=>{中使用了和数组同名的参数,导致items.push()实际是往DOM元素对象(而非你声明的数组)添加内容,数组始终为空。修正后将参数改为itemEl、priceEl等,避免覆盖。
  2. 异步处理:Cypress命令是异步执行的,必须用.then()串联操作,确保所有元素文本收集完成后,再将数组存入Cypress.env,否则会出现存储空数组的情况。
  3. 存储格式:直接存储数组本身,而非包裹成对象(比如不要写Cypress.env('items', {items})),否则读取时会得到[object Object]。

三、在第二个测试用例中读取数据

在后续的Cucumber步骤/测试用例中,直接通过Cypress.env()获取存储的数组即可:

Given(`I use the stored item data`, () => {
  const storedItems = Cypress.env('items');
  const storedPrices = Cypress.env('prices');
  
  // 验证数据是否存在
  expect(storedItems).to.be.an('array').and.not.be.empty;
  expect(storedPrices).to.be.an('array').and.not.be.empty;
  
  // 使用数据进行后续操作,比如遍历验证商品
  storedItems.forEach((item, index) => {
    cy.log(`Verifying item: ${item}, price: ${storedPrices[index]}`);
    // 这里可以添加具体的断言或操作逻辑
  });
});

四、其他注意事项

  • 如果测试用例在不同的.feature文件中,确保执行顺序正确(第一个用例先执行,再执行第二个),可通过Cypress的测试配置或插件控制执行顺序。
  • 若需要更复杂的全局存储,也可以使用Cypress.session(适合会话级共享)或自定义全局变量,但Cypress.env是最简单的跨用例方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:33:30