Cypress创建对象并复用对象值的问题求助
Cypress 异步数据复用解决方案
问题原因
你遇到的Item is not defined错误,核心是Cypress的异步执行机制:
cy.wait().then()是异步命令,回调里定义的Item是局部变量,外部代码会先于回调执行,自然拿不到这个变量;- 即使同步定义变量,也会因为异步命令的执行顺序,导致后续代码访问时变量还未被赋值。
可行解决方案
方案1:用别名存储对象,通过this访问(推荐同用例内复用)
把整个Item对象用cy.wrap().as()存为别名,在同一个测试用例里用this.别名直接访问(注意要用普通函数,不能用箭头函数):
cy.wait('@pageLoaded').then(({ response }) => { expect(response.statusCode).to.equal(200); const i = randomItem(); const selectedItem = { Id: response.body.items[i].id, IpuCode: response.body.items[i].ipuCode, Description: response.body.items[i].description, PackSize: response.body.items[i].packSize, PackType: response.body.items[i].packType, }; cy.wrap(selectedItem).as('selectedItem'); // 存储整个对象为别名 }) // 后续测试代码(需放在同一个it/test块里,且用function定义回调) it('添加商品到购物车', function() { cy.addItemToShoppingCart( this.selectedItem.IpuCode, pharmacyId, this.selectedItem.Id, currentDateTime ); })
方案2:用Cypress环境变量存储(适合跨用例复用)
把对象存入Cypress全局环境变量,后续直接通过Cypress.env()取出:
cy.wait('@pageLoaded').then(({ response }) => { expect(response.statusCode).to.equal(200); const i = randomItem(); const selectedItem = { Id: response.body.items[i].id, IpuCode: response.body.items[i].ipuCode, Description: response.body.items[i].description, PackSize: response.body.items[i].packSize, PackType: response.body.items[i].packType, }; Cypress.env('selectedItem', selectedItem); // 存入全局环境变量 }) // 后续任意位置直接调用 cy.addItemToShoppingCart( Cypress.env('selectedItem').IpuCode, pharmacyId, Cypress.env('selectedItem').Id, currentDateTime );
注意:环境变量是全局的,多测试用例并行时要注意避免变量覆盖。
方案3:链式调用then(最贴合Cypress异步模型)
所有依赖Item的操作都放在then链里,避免额外嵌套:
cy.wait('@pageLoaded').then(({ response }) => { expect(response.statusCode).to.equal(200); const i = randomItem(); return { Id: response.body.items[i].id, IpuCode: response.body.items[i].ipuCode, Description: response.body.items[i].description, PackSize: response.body.items[i].packSize, PackType: response.body.items[i].packType, }; }).then((selectedItem) => { cy.addItemToShoppingCart(selectedItem.IpuCode, pharmacyId, selectedItem.Id, currentDateTime); // 还可以继续链式调用其他依赖该对象的命令 })
总结
你的需求完全可以实现,只是需要适配Cypress的异步特性。如果是同一个测试用例内复用,方案1最简洁;跨用例的话用方案2;如果不想多套一层结构,方案3的链式写法也能满足需求。
内容的提问来源于stack exchange,提问作者Martina Elle
相关产品推荐
相关产品推荐

