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

如何让cy.origin等待更长时间以完成跨域重定向?

解决Cypress中cy.origin因重定向超时的问题

问题背景

测试代码访问页面后触发认证重定向,但重定向耗时过长,导致cy.origin在目标域名(authurl.com)加载完成前就超时。尝试过两种无效方案:

  • 在cy.origin调用前用cy.url().should('match', /^authurl.com/),但跨域后cy.url()返回空值,无法生效
  • 将断言放入cy.origin内部,但cy.origin代码仅在目标域名加载后执行,此操作多余

测试代码如下:

cy.visit(Cypress.config().baseUrl)

cy.origin('authurl.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()
  }
)

非硬编码的解决方案

1. 给cy.origin设置自定义超时(推荐)

Cypress 12+版本支持给cy.origin单独设置timeout参数,直接延长目标域名的等待时间,无需硬编码固定等待:

cy.visit(Cypress.config().baseUrl)

// 设置15秒超时(根据实际需求调整,单位毫秒)
cy.origin('authurl.com', { 
  args: { username, password },
  timeout: 15000
}, 
  ({ 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()
  }
)

此方法仅针对当前cy.origin命令延长等待,不影响全局其他命令的超时设置。

2. 全局调整跨域相关超时

如果多个测试用例都存在跨域重定向超时问题,可在cypress.config.js中全局配置超时参数:

const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    experimentalSessionAndOrigin: true,
    // 全局调整所有命令的默认超时(可选)
    defaultCommandTimeout: 10000,
    // Cypress 13+支持单独设置origin的超时(更精准)
    experimentalOriginTimeout: 15000
  }
})

3. 利用导航事件等待重定向完成

通过监听浏览器的导航事件,确认目标域名加载后再执行cy.origin,避免提前触发超时:

cy.visit(Cypress.config().baseUrl)

// 等待浏览器导航到目标域名(通过Cypress的内部导航监听)
cy.on('window:before:load', (win) => {
  win.addEventListener('load', () => {
    if (win.location.href.includes('authurl.com')) {
      // 目标域名加载完成后再执行cy.origin
      cy.origin('authurl.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()
        }
      )
    }
  })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:07:37