You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:24:03