Cypress&Cucumber:步骤定义中Cypress方法外的变量无法调用
解决Cypress+Cucumber步骤定义中异步变量无法访问的问题
问题的核心是Cypress命令是异步执行的:你定义的cy.get()、.its()等命令会被加入Cypress的命令队列,等待后续执行;而.then()回调是在对应命令执行完成后才触发的。但你写在外部的cy.log()和for循环是同步代码,会在命令队列中的命令执行前就运行,此时变量还未被赋值,自然拿不到结果。
解决方案1:链式调用确保执行顺序
把所有依赖异步变量的操作放到.then()回调中,保证代码在变量赋值后再执行:
Then('the total amount sent to {string} is {string}', (toCountry, amountSent) => { let amountSentTotal = 0; // 初始化变量避免NaN // 先获取符合条件的记录数量 cy.get('.TrackingTable tr td:nth-of-type(5):visible:contains("' + toCountry + '")') .its('length') .then((toCountryCount) => { cy.log(toCountryCount); // 再获取单条转账金额 return trackTransfersPageObj.sendingTo.contains(toCountry) .next('td') .then((amountElement) => { const eachTransferAmount = amountElement.text().replace('£', '').replace('N', ''); cy.log(eachTransferAmount); // 计算总金额 for (let i = 0; i < toCountryCount; i++) { amountSentTotal += parseInt(eachTransferAmount); } // 断言总金额是否符合预期 expect(amountSentTotal.toString()).to.equal(amountSent); }); }); });
解决方案2:并行获取异步值(提高效率)
如果两个异步操作没有依赖关系,可以用Promise.all并行获取结果,减少等待时间:
Then('the total amount sent to {string} is {string}', (toCountry, amountSent) => { // 将Cypress命令转换为Promise const getCount = () => new Promise(resolve => { cy.get('.TrackingTable tr td:nth-of-type(5):visible:contains("' + toCountry + '")') .its('length') .then(resolve); }); const getAmount = () => new Promise(resolve => { trackTransfersPageObj.sendingTo.contains(toCountry) .next('td') .then(amountElement => { const cleanedAmount = amountElement.text().replace('£', '').replace('N', ''); resolve(cleanedAmount); }); }); // 等待两个异步操作完成 cy.wrap(Promise.all([getCount(), getAmount()])).then(([toCountryCount, eachTransferAmount]) => { cy.log(toCountryCount); cy.log(eachTransferAmount); let amountSentTotal = 0; for (let i = 0; i < toCountryCount; i++) { amountSentTotal += parseInt(eachTransferAmount); } // 执行断言 expect(amountSentTotal.toString()).to.equal(amountSent); }); });
关键注意点
- 必须确保所有依赖异步变量的逻辑都在
.then()或其他异步回调中执行 - 初始化
amountSentTotal为0,避免第一次累加时出现NaN - Cypress的命令队列会维护测试上下文,不要随意用普通
async/await包裹Cypress命令,如需使用要结合cy.wrap
内容的提问来源于stack exchange,提问作者unlisted
相关产品推荐
相关产品推荐

