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)}`); }); });
二、关键问题解释
- 变量名冲突:你之前在
.each((items)=>{中使用了和数组同名的参数,导致items.push()实际是往DOM元素对象(而非你声明的数组)添加内容,数组始终为空。修正后将参数改为itemEl、priceEl等,避免覆盖。 - 异步处理:Cypress命令是异步执行的,必须用
.then()串联操作,确保所有元素文本收集完成后,再将数组存入Cypress.env,否则会出现存储空数组的情况。 - 存储格式:直接存储数组本身,而非包裹成对象(比如不要写
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
相关产品推荐
相关产品推荐

