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

Cypress测试Outlook登录页出现未处理Promise拒绝、跨域问题如何解决

Cypress测试Outlook登录跨域重定向与Promise报错修复

问题现象

编写Outlook登录页自动化测试用例时出现两类异常:

  • 登录流程触发跨源重定向
  • 控制台抛出unhandled promise rejection(未处理Promise拒绝)报错

原始问题代码

it('Outlook', ()=> {
        cy.visit('https://outlook.office.com/mail/')
            cy.get('#i0116').clear().type('hello@gmail.com')
            cy.get('#idSIButton9').click()
            cy.get('#3i0118').clear().type('Password@123')
            cy.get('#idSIButton9').click()   
    })

已尝试的无效方案

已添加全局uncaught:exception事件监听拦截Promise相关异常,未生效,代码如下:

Cypress.on('uncaught:exception',(err,runnable,Promise)=>{
    if(Promise){
        return false
    }
})

报错详情参考截图:
unhandled promise rejection报错截图

根因分析

  1. 跨域安全限制拦截:Cypress默认启用同源策略限制,Outlook登录流程会从outlook.office.com跳转到微软账号认证域名login.microsoftonline.com,跨域跳转默认会被Cypress拦截,触发导航类异常。
  2. 异常监听逻辑错误:原监听代码中参数名与全局Promise构造函数重名,判断if(Promise)恒为真,且没有针对性拦截登录跳转产生的特定异常,无法覆盖跨域场景下Cypress层面抛出的未处理Promise拒绝。
  3. 操作时序与选择器错误:点击下一步按钮后未等待密码输入页加载完成就执行DOM操作,且密码框选择器#3i0118存在笔误(正确选择器为#i0118),元素查找失败会连带触发Promise拒绝。

修复步骤

  1. 调整Cypress配置
    在cypress.config.js中添加以下配置,关闭跨域安全限制、开启跨域会话支持:
const { defineConfig } = require("cypress");

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 节点事件监听逻辑可在此处扩展
    },
    chromeWebSecurity: false, // 关闭跨域安全限制
    experimentalSessionAndOrigin: true, // 开启跨域会话支持(Cypress10+版本必填)
  },
});
  1. 修正全局异常拦截逻辑
    将异常监听代码放在cypress/support/e2e.js中全局生效,针对性拦截登录跳转产生的非业务异常:
Cypress.on('uncaught:exception', (err, runnable) => {
  // 拦截跨域跳转、导航过程中产生的非业务异常
  if (
    err.message.includes('unhandled promise rejection') ||
    err.message.includes('cross origin') ||
    err.message.includes('Navigation')
  ) {
    return false
  }
});
  1. 修正测试用例逻辑
    添加元素可见性等待、修正选择器笔误、给页面访问添加容错配置:
it('Outlook', ()=> {
  // 配置访问超时与状态码容错,适配跳转过程中的3xx重定向响应
  cy.visit('https://outlook.office.com/mail/', {
    failOnStatusCode: false,
    timeout: 30000
  })
  // 等待账号输入框可见后再操作,适配微软页面较慢的加载速度
  cy.get('#i0116', {timeout: 15000}).should('be.visible').clear().type('hello@gmail.com')
  cy.get('#idSIButton9').click()
  // 等待跳转到密码页、密码输入框可见后再输入
  cy.get('#i0118', {timeout: 15000}).should('be.visible').clear().type('Password@123')
  cy.get('#idSIButton9').click()   
})

补充说明:测试微软系产品登录流程时,不要使用真实个人/企业账号频繁触发自动化登录,容易触发微软的反爬风控,导致账号被限制登录。

内容的提问来源于stack exchange,提问作者Mr.Prasad J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:57:27