使用cy.session()结合cy.request()无法实现用户登录的问题排查
排查Cypress API登录失效的问题
先从你代码里的几个明确问题入手,逐个修复验证:
1. 修正TrackingId参数传递错误
调用loginByApi1时,第三个参数被错误包裹在单引号里,导致传递的是字符串字面量Cypress.env('trackingID'),而非实际环境变量值。正确写法:
cy.loginByApi1( Cypress.env('mainInvestorUserEmail'), Cypress.env('mainInvestorUserPassword'), Cypress.env('trackingID') // 移除外层单引号 )
这个错误会导致接口收到无效的TrackingId,大概率是返回空token的直接原因。
2. 修复localStorage的设置逻辑
cy.session的回调运行在Cypress后台上下文,直接使用window.localStorage操作的不是测试页面的存储。必须通过cy.window()获取页面的window对象后再设置:
Cypress.Commands.add("loginByApi1", (username1, password1, TrackingId1) => { cy.session([username1, password1, TrackingId1], () => { cy.request({ method: 'POST', url: 'https://someWebPage/api/challenge/credentials', body: { email: username1, password: password1, TrackingId: TrackingId1 } }).then((response) => { // 先打印完整返回结构,确认token字段是否正确 cy.log('接口返回内容:', JSON.stringify(response.body)) // 操作页面的localStorage cy.window().then(win => { win.localStorage.setItem('authToken', response.body.token) }) cy.log('设置的token值:', response.body.token) }) }) })
3. 确认接口返回的token字段名
你当前用body.token取值,但实际接口可能返回的是access_token、token_value等其他字段。可以:
- 打开浏览器控制台Network面板,走一次UI登录流程,查看登录接口的返回结构
- 在Cypress的
cy.request回调里打印完整response.body,对比和UI登录的返回差异
4. 检查应用的登录验证机制
有些应用会同时用localStorage和cookie存储凭证,只设置localStorage可能不够。UI登录后查看浏览器Application面板:
- 如果有相关登录cookie,在API登录后用
cy.setCookie()同步设置 - 如果用到sessionStorage,同样需要用
cy.window()操作设置
5. 验证session缓存与页面上下文
调用cy.visit('/')后,可添加验证步骤确认凭证是否存在:
cy.visit('/') cy.window().then(win => { cy.log('页面localStorage中的token:', win.localStorage.getItem('authToken')) })
如果此时token不存在,可能需要调整cy.session配置,比如添加cacheAcrossSpecs: true,或者检查session的缓存key是否正确。
优先解决前两个问题,这是最可能导致登录失效的原因。
内容的提问来源于stack exchange,提问作者GjoDim
相关产品推荐
相关产品推荐

