You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:37:12