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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:53:17