Windows11下Cypress Firefox测试默认使用系统SSO登录Azure问题求助
Windows 11下Cypress+Firefox测试Azure应用时强制使用系统SSO登录的问题
在Windows 11设备上用Cypress测试Azure应用时,测试本该使用指定的测试账号,但运行器始终默认走系统SSO登录。测试基于Firefox浏览器执行,已经手动清除Firefox缓存和存储、移除保存的登录凭据,也尝试了无头模式,但问题依旧。同一代码在Mac设备上运行正常。
相关配置及代码
cypress.config.js
const { defineConfig } = require('cypress') const setConfig = require('./cypress/plugins/index') module.exports = defineConfig({ env: { testEnv: 'stage1', user: 'testuser&gmail.com', secret: 'password' }, reporter: 'cypress-multi-reporters', reporterOptions: { configFile: 'reporter-config.json', }, "trashAssetsBeforeRuns": true, defaultCommandTimeout: 10000, pageLoadTimeout: 60000, e2e: { setupNodeEvents: setConfig, baseUrl: `https://applicationurl.com`, experimentalModifyObstructiveThirdPartyCode: true, chromeWebSecurity: false, firefoxWebDriverBiDi: true, }, });
Azure登录自定义命令
Cypress.Commands.add('loginViaADD', () => { cy.origin('https://login.microsoftonline.com', () => { cy.visit(`${Cypress.config('baseUrl')}/testendpoint`) //provide username cy.get('input[name="loginfmt"]').type(Cypress.env('user')) cy.get('input[type="submit"]').click() // provide password cy.get('input[type="password"]').type(Cypress.env('secret')) cy.get('input[type="submit"]').click() })}) Cypress.Commands.add('loginToADD', () => { cy.session('azure login', () => { cy.loginViaADD() }, { cacheAcrossSpecs: true }) })
调用登录命令的测试用例文件
describe('Azure Test', () => { before(() => { cy.loginToADD(); }) beforeEach(() => { cy.visit(`${Cypress.config('baseUrl')}/testendpoint`) }) it('Test', () => { cy.contains('button', 'Create').click() }); });
解决思路及建议
禁用Firefox的系统集成SSO
Windows上Firefox默认会集成Windows的SSO功能(如Windows Hello或Azure AD系统级认证),可在Cypress配置中添加启动参数强制禁用:e2e: { // 保留原有配置 browsers: [ { name: 'firefox', channel: 'stable', args: [ '--disable-features=WindowsAzureADWebAccountManager', '--disable-integration-with-default-browser', '--no-default-browser-check' ] } ] }这些参数会阻止Firefox调用系统级SSO,强制走账号密码登录流程。
优化
cy.origin使用逻辑
当前命令在cy.origin内部访问应用端点,易导致跳转逻辑混乱。正确流程应先访问应用登录入口,触发跳转至Azure登录页后再处理:Cypress.Commands.add('loginViaADD', () => { // 先访问应用入口,触发跳转至Azure登录页 cy.visit(`${Cypress.config('baseUrl')}/testendpoint`) // 跳转到Azure域名后,在cy.origin中处理登录 cy.origin('https://login.microsoftonline.com', () => { cy.get('input[name="loginfmt"]', { timeout: 15000 }).type(Cypress.env('user')) cy.get('input[type="submit"]').click() cy.get('input[type="password"]', { timeout: 15000 }).type(Cypress.env('secret')) cy.get('input[type="submit"]').click() // 处理"保持登录"弹窗(如果存在) cy.get('input[id="idBtn_Back"]', { timeout: 10000 }).click({ force: true }).catch(() => {}) }) })调整Cypress Session缓存策略
Windows上Session缓存可能与系统SSO冲突,可尝试禁用跨用例缓存或添加预清除逻辑:Cypress.Commands.add('loginToADD', () => { cy.session('azure login', () => { // 登录前强制清除所有存储 cy.clearAllCookies() cy.clearAllLocalStorage() cy.clearAllSessionStorage() cy.loginViaADD() }, { cacheAcrossSpecs: false, // 先禁用跨用例缓存测试 validate: () => { // 验证登录状态,避免缓存无效会话 cy.visit(`${Cypress.config('baseUrl')}/testendpoint`) cy.contains('Create').should('be.visible') } }) })检查Windows系统SSO设置
- 打开Windows设置 → 账户 → 访问工作或学校,移除与测试应用关联的账户
- 打开"凭据管理器",删除所有与Azure AD、测试应用相关的Windows凭据
内容的提问来源于stack exchange,提问作者Kavya
相关产品推荐
相关产品推荐

