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

使用cy.origin对接Azure AD时无法处理‘保持登录’弹窗问题

问题原因

点击密码提交按钮后,AAD不会直接跳转到业务系统,而是先加载"Stay Signed In"确认页面。Cypress的cy.click()默认会等待页面导航完成,但此时的导航属于同一个login.microsoftonline.com origin内的跳转,导致第一个cy.origin块内的后续代码被阻塞——Cypress一直在等跳转到业务系统,却没意识到还需要在当前origin下处理弹窗。第二个独立的cy.origin块也因为前面的命令未完成,永远无法执行。

解决方法

把处理"Stay Signed In"弹窗的逻辑放在同一个cy.origin块内,并且修改点击行为,不让Cypress自动等待导航,这样就能继续执行后续操作:

  1. 在点击密码提交按钮时,添加{ waitForNavigation: false }选项,阻止Cypress等待导航
  2. 等待"Stay Signed In"弹窗的确认按钮出现并点击

修改后的代码:

function loginViaAAD(username: string, password: string) {
  cy.visit('/PRODUCTURL')

  cy.origin(
    '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({ waitForNavigation: false })

      // 处理Stay Signed In弹窗,根据实际按钮文本调整
      cy.get('input[type="submit"]').contains('Yes').click()
    }
  )

  cy.url().should('equal', 'PRODUCTURL')
  cy.get('#welcome-div').should('contain', `Welcome ${Cypress.env('aad_username')}!`)
}
补充说明
  • 如果弹窗按钮文本不是"Yes",替换成实际显示的内容(比如中文环境的"保持登录")
  • 若出现元素找不到的情况,可以添加cy.get(...).should('be.visible')确保元素加载完成后再点击

内容的提问来源于stack exchange,提问作者L Sainsbury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:25:59