Cypress cy.origin()跨域错误排查(AAD认证场景)
问题分析与解决方案
错误信息翻译
cy.origin() 要求第一个参数必须是与当前顶级域名不同的域名。你向origin命令传入了
https://login.microsoftonline.com/,但当前顶级域名正是https://login.microsoftonline.com。要么是在运行cy.origin代码块前没有访问预期页面,要么是根本不需要使用cy.origin代码块。
问题原因
调用cy.visit(url)后,目标页面直接重定向到了AAD登录页,此时当前页面域名已经是login.microsoftonline.com,后续再调用cy.origin("https://login.microsoftonline.com/", ...)时,因目标域名与当前域名一致,触发了cy.origin的跨域检查错误。
解决方案
1. 修改loginViaAAD函数,增加域名判断
在函数中先检查当前页面域名,若已处于AAD登录页则直接操作,无需调用cy.origin;若未跳转则使用cy.origin处理跨域登录:
function loginViaAAD(url, username, password) { cy.visit(url); // 检查当前页面是否已跳转到AAD登录页 cy.location('hostname').then(hostname => { if (hostname === 'login.microsoftonline.com') { // 当前已在登录页,直接执行登录操作 cy.get('input[type="email"]').type(username, { log: false }); cy.get('input[type="submit"]').click(); cy.get('input[type="password"]').type(password, { log: false }); cy.get('input[type="submit"]').click(); } else { // 未跳转至登录页,使用cy.origin处理跨域登录 cy.origin( "https://login.microsoftonline.com/", { args: { username, password } }, ({ username, password }) => { cy.get('input[type="email"]').type(username, { log: false }); cy.get('input[type="submit"]').click(); cy.get('input[type="password"]').type(password, { log: false }); cy.get('input[type="submit"]').click(); } ); } }); // 适配hash路由,验证是否跳回目标页面(避免完全匹配hash的问题) cy.url().should("include", url.split('#')[0]); cy.get("#welcome-div").should("contain", `Welcome ${Cypress.env("aad_username")}!`); }
2. 移除测试用例中重复的cy.visit
cy.loginToAAD命令已包含页面访问与登录验证逻辑,无需重复调用:
describe('xxxxxxxxxxxxxxx', () => { beforeEach(() => { const username = Cypress.env("aad_username"); const password = Cypress.env("aad_password"); // 登录命令已处理页面访问与认证,无需额外cy.visit cy.loginToAAD(`${Cypress.env("baseUrl")}intranet/#/demande-inscription/rechercher`, username, password); }) it('passes', () => { cy.get('#someElement').should('be.visible') }) })
关键优化点
- 通过域名判断避免不必要的cy.origin调用,解决跨域检查错误
- 移除重复的页面访问操作,减少冗余步骤
- 调整url验证逻辑,适配hash路由场景,提升验证稳定性
内容的提问来源于stack exchange,提问作者Mahd
相关产品推荐
相关产品推荐

