Cypress自定义命令嵌套调用时无法获取被修改属性值的问题
问题根因
- Cypress命令异步执行机制:所有
cy.开头的自定义命令都是异步逻辑,会进入Cypress的命令队列排队执行,不会同步立即运行。你在firstCommand中调用cy.modifiesOtherAttr后,该命令不会立刻修改aBody的属性,如果你后续同步读取aBody.b,会拿到还未修改的初始值(null/undefined)。 - 入参本身异常:调用
firstCommand时传入的第二个参数object的attrb属性本身就是null,修改后的aBody.b自然也为null。
解决方案
方案1:纯同步逻辑改为普通工具函数(最推荐)
你的逻辑仅涉及同步的对象属性修改,没有任何Cypress异步操作(页面交互、接口请求等),完全不需要封装为Cypress自定义命令,直接用普通JS函数即可,不存在执行顺序问题:
// 封装为普通工具函数 function modifiesOtherAttr(aBody, objectB) { aBody.b = objectB.attrb; } function firstCommand(varA, objectB) { const aBody = {}; aBody.a = varA; modifiesOtherAttr(aBody, objectB); return aBody; } // 测试侧调用 describe("a suite name", () => { it("my test name", () => { const modifiedBody = firstCommand(variable, object); // 后续直接使用modifiedBody即可,属性已完成修改 }) })
方案2:保留Cypress命令的情况下用链式调用获取结果
如果你确实需要保留为Cypress自定义命令(比如后续要扩展异步逻辑),需要通过then链式调用确保修改完成后再读取属性:
Cypress.Commands.add("firstCommand", (varA, objectB) => { const aBody = {}; aBody.a = varA; return cy.modifiesOtherAttr(aBody, objectB).then(() => aBody); }) Cypress.Commands.add("modifiesOtherAttr", (aBody, objectB) => { aBody.b = objectB.attrb; return cy.wrap(aBody); }) // 测试侧调用 describe("a suite name", () => { it("my test name", () => { cy.firstCommand(variable, object).then(modifiedBody => { // 此处的modifiedBody已完成所有属性修改,可正常使用 }) }) })
方案3:排查入参有效性
调用命令前先校验传入的object.attrb是否非空,排除入参本身的问题:
it("my test name", () => { // 先校验入参属性非空 expect(object.attrb).to.not.be.null.and.not.be.undefined; cy.firstCommand(variable, object); })
内容的提问来源于stack exchange,提问作者Vicko
相关产品推荐
相关产品推荐

