求助:Cypress执行登录脚本后为何重复加载登录页而非首页?
我之前也遇到过一模一样的情况——登录操作做完后又跳回登录页,这种问题通常是几个常见原因导致的,咱们一步步来排查:
1. 先确认登录请求是否成功完成
很多时候页面回跳是因为登录接口没返回成功,或者Cypress没等请求结束就继续执行了。可以用cy.intercept监听登录接口,确保请求成功后再断言页面跳转:
// 替换成你实际的登录接口路径和请求方法 cy.intercept('POST', '/api/auth/login').as('loginRequest'); cy.visit('https://digitalxq1.com/sis/basic?accountNumber=123456'); cy.get(txtUserID).type(userid); cy.get(txtPwd).type('121212'); cy.get(btnPwd).click(); // 等待登录请求结束,验证状态码是否正常 cy.wait('@loginRequest').its('response.statusCode').should('be.oneOf', [200, 201]); // 再断言首页的URL或标志性元素 cy.url().should('include', '/dashboard'); // 替换成你的首页URL特征 cy.get('.home-page-title').should('be.visible'); // 替换成首页独有的元素选择器
2. 检查凭证输入的准确性
你传的密码是数字121212,有些输入框可能需要字符串格式,试试改成'121212'。另外可以验证输入框的实际值是否和手动登录一致:
cy.get(txtPwd).type('121212').should('have.value', '121212');
同时确认用户ID是否输入正确,有没有大小写、空格这类容易忽略的问题。
3. 排查自定义命令的问题
你用了cy.enterText和cy.clickElement这些自定义命令,会不会是这些命令没有正确触发页面的交互事件?比如enterText可能只设置了输入框的value属性,但没触发input或change事件,导致页面没识别到输入内容。可以暂时换成原生Cypress命令测试:
// 替换自定义命令为原生命令 cy.get(txtUserID).type(userid); cy.get(txtPwd).type('121212'); cy.get(btnPwd).click();
如果这样能成功登录,那就是自定义命令的实现有问题,需要检查它们的代码逻辑(比如是否缺少trigger('input')这类事件触发)。
4. 检查认证Cookie/Session是否正确设置
登录成功后服务器通常会设置认证Cookie,如果Cookie没正确写入,页面会认为你未登录而跳回登录页。可以在登录前后打印Cookie对比:
// 登录前查看Cookie cy.getCookies().then(cookies => console.log('登录前Cookie:', cookies)); // 执行登录操作 cy.clickElement(btnPwd); // 登录后查看Cookie cy.getCookies().then(cookies => console.log('登录后Cookie:', cookies));
看看登录后是否新增了token、sessionId这类认证相关的Cookie。
5. 等待客户端路由完成(针对SPA应用)
如果你的应用是单页应用(比如React/Vue项目),页面跳转是通过客户端路由实现的,Cypress可能需要等待路由变化完成。可以直接断言URL的变化:
cy.clickElement(btnPwd); cy.url().should('not.include', '/login'); // 确保离开登录页 cy.url().should('include', '/home'); // 断言进入首页
先从这几个方向排查,尤其是替换成原生命令和监听登录请求这两步,是最常见的问题点。如果还是不行,可以打开Cypress的开发者工具,看看控制台有没有报错,或者网络请求里有没有失败的请求。
内容的提问来源于stack exchange,提问作者Dhinesh

