Cypress如何从API返回的JSON body中提取值存入变量
核心错误原因
- 你没有给对应请求设置别名,导致
cy.wait('@newObject')无法匹配到目标请求 cy.request返回的响应体字段为body而非responseBody- 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
相关产品推荐
相关产品推荐

