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

Cypress如何从API返回的JSON body中提取值存入变量

核心错误原因

  1. 你没有给对应请求设置别名,导致cy.wait('@newObject')无法匹配到目标请求
  2. cy.request返回的响应体字段为body而非responseBody
  3. Cypress所有命令均为异步执行,直接在回调外同步读取回调内赋值的变量,会因为回调还未执行拿到未定义的值

场景1:同一个测试用例(it块)内使用提取的_id

你可以直接在请求的then回调内处理后续逻辑,或者通过Cypress别名存储值供同用例后续命令调用:

it("Provider Catalog API POST Request", () => {
  const provider = {
    "type": "loadboard",
    "name": "123loadboard"
  };
  cy.request('POST', 'v1/providers', provider)
    .as('newProvider') // 给请求设置别名,方便后续定位
    .then((response) => {
      expect(response.status).to.eq(201)
      expect(response.body).to.have.property('_id')
      const providerId = response.body._id
      // 方法1:直接在回调内执行后续操作
      cy.request('PUT', `v1/providers/${providerId}`, provider)
      // 方法2:用wrap把值包装为Cypress命令,设置别名供后续调用
      cy.wrap(providerId).as('providerId')
    })
  // 后续需要使用_id时,通过别名获取
  cy.get('@providerId').then(providerId => {
    cy.get(someInput).type(providerId)
  })
  cy.screenshot()
})

场景2:跨测试用例使用提取的_id

如果需要在多个it块中共享这个_id,可以把值存在全局变量或者Cypress全局环境变量中:

/// <reference types="cypress" />
describe("Testing Provider Catalog API", () => {
  // 方案1:声明块级全局变量存储
  let sharedProviderId
  it("Provider Catalog API POST Request", () => {
    const provider = {
      "type": "loadboard",
      "name": "123loadboard"
    };
    cy.request('POST', 'v1/providers', provider)
      .then((response) => {
        expect(response.status).to.eq(201)
        sharedProviderId = response.body._id
        // 方案2:存入Cypress全局环境变量,跨用例/跨文件都可读取
        Cypress.env('PROVIDER_ID', response.body._id)
      })
  })
  it("Provider Catalog API PUT Request", () => {
    const provider = {
      "type": "loadboard",
      "name": "123loadboard"
    };
    // 读取全局变量使用
    cy.request('PUT', `v1/providers/${sharedProviderId}`, provider)
    // 也可以读取环境变量使用
    // cy.request('PUT', `v1/providers/${Cypress.env('PROVIDER_ID')}`, provider)
    cy.screenshot()
  })
  it("Provider Catalog API DELETE Request", () => {
    cy.request('DELETE', `v1/providers/${sharedProviderId}`)
    cy.screenshot()
  })
})

内容的提问来源于stack exchange,提问作者JustAG33K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:45:04