使用Cypress从拦截的响应体中取值并在后续测试步骤调用
问题原因
Cypress的所有命令都是异步入队执行的,你写的cy.intercept仅完成拦截器注册,后续的cy.log(test)会在拦截请求触发、响应返回前同步执行,此时赋值test = res.body.rxId的逻辑还未运行,自然拿到的是初始值。
正确实现方案
推荐使用Cypress内置的别名(Alias)机制存储异步获取的值,不要依赖外部全局变量传递异步结果:
// 1. 注册拦截器并设置别名 cy.intercept( { url: '**/consumers/rx?extension=.jpg', method:"POST" } ).as('postRxRequest') // 2. 这里补你触发该POST请求的业务操作,比如点击上传、提交按钮等 // 示例:cy.get('#submit-upload').click() // 3. 等待请求完成后获取响应值,存储为别名 cy.wait('@postRxRequest').then((interception) => { const rxId = interception.response.body.rxId expect(rxId).not.to.be.null // 存储为别名供后续步骤使用 cy.wrap(rxId).as('rxId') }) // 4. 后续需要使用rxId的场景,通过别名获取即可 cy.get('@rxId').then(rxId => { cy.log(rxId) // 此处可正常输出获取到的rxId // 其他依赖rxId的测试逻辑都放在该回调内执行 })
注意事项
如果一定要用外部变量存储值,必须保证所有用到该变量的逻辑都放在cy.wait('@postRxRequest')的回调链路后执行,不能直接同步调用变量。
内容的提问来源于stack exchange,提问作者FarFarAway
相关产品推荐
相关产品推荐

