使用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自动等待导航,这样就能继续执行后续操作:
- 在点击密码提交按钮时,添加
{ waitForNavigation: false }选项,阻止Cypress等待导航 - 等待"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
相关产品推荐
相关产品推荐

