Cypress登录后自动退出问题求助:脚本运行无法保持登录状态
基于Cypress + JavaScript的自动化测试登录状态保持问题
问题
运行测试脚本时,登录后无法保持登录状态,几秒后会被重定向至登录页面。
预期结果
希望在整个脚本运行期间保持登录状态。
代码示例
LoginPage.js
//Page objects and functions for login page class LoginPage{ navigate() { cy.visit('stageURL') } firstLogin(){ //cy.wait(10000) cy.get('.MuiButton-root', {timeout: 30000}) .should('be.visible') .and('be.enabled') .and('have.text', 'Sign In') .click() } enterEmail(username) { cy.get('#username') .clear() .type(username) return this } enterPassword(pswd) { cy.get('#password') .clear() .type(pswd) return this } submit() { cy.get('#kc-login').click() } } export default LoginPage
LoginSpec.js
/// <reference types="cypress" /> import LoginPage from "./PageObjects/LoginPage" describe("Cypress POM Test Suite", function () { before(function () { cy.fixture('credentials').then(function (testdata) { this.testdata = testdata }) }) it("Login with valid credentials", function () { const login = new LoginPage(); login.navigate(); login.firstLogin(); login.enterEmail(this.testdata.username) login.enterPassword(this.testdata.password) login.submit(); }); });
Suite.js
import './LoginSpec' import './SitesSpec' import './LogoutSpec'
运行的是Suite.js文件(其他相关文件可按需提供)。
已尝试方案
尝试过解决自动登出问题的两种常规方案,但均无效。
备注
该脚本在同事机器上运行正常,本人使用Windows 10系统。
可行解决方案
1. 调整Cypress测试隔离配置
Cypress默认会在每个测试用例后清除Cookies和本地存储,若需跨用例保持登录,可修改配置:
- 在
cypress.config.js中添加:
module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) {}, testIsolation: false, // 禁用测试隔离,保留跨用例的Cookies与存储 }, });
或在测试文件中手动指定保留关键Cookie:
beforeEach(() => { Cypress.Cookies.preserveOnce('session_id', 'remember_token'); // 替换为实际登录相关Cookie名称 });
2. 校验登录请求的Cookie属性
用Cypress网络拦截功能,检查登录接口返回的Cookie是否存在属性异常(如HttpOnly、SameSite设置错误导致浏览器拒绝存储):
it("Login with valid credentials", function () { cy.intercept('POST', '/login').as('loginRequest'); // 替换为实际登录接口路径 const login = new LoginPage(); login.navigate(); login.firstLogin(); login.enterEmail(this.testdata.username) login.enterPassword(this.testdata.password) login.submit(); cy.wait('@loginRequest').then((interception) => { const cookies = interception.response.headers['set-cookie']; console.log('返回的Cookie:', cookies); // 查看Cookie属性是否符合要求 }); });
3. 同步系统时间
部分场景下,本地系统时间与服务器时区/时间不同步会导致Session提前过期,确认Windows系统时间已开启自动同步,且与服务器时区一致。
4. 调整浏览器启动参数
Cypress默认浏览器的隐私设置可能阻止Cookie存储,可在cypress.config.js中配置:
module.exports = defineConfig({ e2e: { chromeWebSecurity: false, // 禁用Web安全策略,避免Cookie被拦截 setupNodeEvents(on, config) { on('before:browser:launch', (browser = {}, launchOptions) => { if (browser.family === 'chrome') { launchOptions.args.push('--disable-features=PrivacySandboxSettings4'); return launchOptions; } }); }, }, });
5. 确保登录后页面稳定
在登录提交后,等待页面跳转完成或关键元素加载,避免后续操作在Session未完全建立时执行:
// 修改LoginPage的submit方法 submit() { cy.get('#kc-login').click() cy.url().should('include', '/dashboard'); // 替换为登录后的目标页面路径 cy.get('.dashboard-header').should('be.visible'); // 等待页面核心元素加载完成 }
内容的提问来源于stack exchange,提问作者Rutvi Desai
相关产品推荐
相关产品推荐

