Cypress嵌套使用自定义命令时cy.request报specWindow路径循环引用错误
问题根源
所有Cypress自定义命令调用后返回的都是Cypress链式调用对象(Chainer),不是你在命令里return的普通值,这个对象内部包含大量Cypress运行时的引用,存在循环结构,你直接把cy.objectGeneration(search, method, block)塞给cy.request的body参数,相当于把整个链式对象传进去了,自然会触发循环引用报错。
普通函数调用后直接返回你定义的body对象,没有额外的Cypress内部结构,所以运行正常。
解决方案
方案1:保留objectGeneration为自定义命令,调整sendReq的实现
在sendReq命令中通过.then()获取objectGeneration的实际返回值,再发起请求:
Cypress.Commands.add("sendReq", (search, method, block) => { // 先调用生成对象的命令,通过then拿到实际返回的body return cy.objectGeneration(search, method, block).then(body => { return cy.request({ method: 'POST', url: '你的实际请求地址', body: body }) }) })
这种方案适合objectGeneration内部包含其他Cypress命令调用(比如要读界面内容、读缓存等)的场景。
方案2:将objectGeneration改为普通工具函数(更推荐)
如果objectGeneration只有纯逻辑运算,没有调用任何Cypress命令,完全不需要封装为自定义命令,直接抽成公共函数即可:
// 单独抽成工具函数即可 const generateObject = (search, method, block) => { let body = {} if(search === 'something') { body.search = search, body.method = method, body.block = block } return body } // sendReq命令里直接调用普通函数 Cypress.Commands.add("sendReq", (search, method, block) => { return cy.request({ method: 'POST', url: '你的实际请求地址', body: generateObject(search, method, block) }) })
这种方案性能更好,也没有额外的链式调用开销,符合你的现有使用场景。
额外注意点
你给出的代码里有两个小语法问题需要修正:
- sendReq的定义语法错误,箭头函数应该写为
(search, method, block) => {,缺少了=> - cy.request的配置项是小写
url,大写URL不会被Cypress识别,会导致请求地址错误
内容的提问来源于stack exchange,提问作者Vicko
相关产品推荐
相关产品推荐

