Cypress会话设置函数内Promise未解析问题求助
解决Cypress cy.session中async/await获取Token超时问题
问题根源
你封装的getAppToken函数混用了Cypress命令和自定义Cypress.Promise,导致异步逻辑失效。cy.request是Cypress的异步命令,它属于Cypress的命令队列,不会在你自定义的Promise中按预期触发resolve,最终让await getAppToken()一直处于等待状态,触发超时。
解决方案
方案1:用async/await简化代码(推荐)
直接让getAppToken返回cy.request的结果,Cypress支持在async函数中await自身的命令,无需手动封装Promise:
// 优化后的getAppToken export const getAppToken = () => { // 根据实际接口返回结构调整,这里假设token在response.body中 return cy.request('some url').then(response => response.body.token); } // 调整后的sessionFunc export const sessionFunc = (userId: string) => { cy.session(userId, async () => { const token = await getAppToken(); cy.setCookie('name', token); }); }
方案2:使用Cypress命令链风格
如果不想用async/await,直接用Cypress的链式调用处理异步逻辑:
export const getAppToken = () => { return cy.request('some url').then(response => response.body.token); } export const sessionFunc = (userId: string) => { cy.session(userId, () => { getAppToken().then(token => { cy.setCookie('name', token); }); }); }
为什么原代码失效?
原代码中,你在自定义Cypress.Promise内部调用cy.request,但cy.request不会立即执行——它会被加入Cypress的命令队列,等到当前同步代码执行完后才会运行。这就导致你的自定义Promise永远不会触发resolve,因为cy.request的then回调是在命令队列执行时才会触发,此时Promise的上下文已经无法正确关联,最终await一直等待导致超时。
内容的提问来源于stack exchange,提问作者DI_SO
相关产品推荐
相关产品推荐

