解决Cypress在PayPal登录重定向后显示“测试加载中”的问题
解决Cypress cy.origin()登录PayPal沙箱后测试挂起的问题
针对你遇到的登录PayPal沙箱后测试停留在“Your tests are loading...”的问题,以下是几个经过验证的解决策略:
1. 正确传递外部数据到cy.origin()上下文
cy.origin()的回调运行在独立的跨域上下文里,直接在回调内调用cy.fixture()可能导致异步命令队列混乱。应该先在主上下文加载fixture数据,再通过args参数传递到跨域回调中:
Cypress.Commands.add('handlePayPalCredential', () => { // 先在主上下文加载fixture cy.fixture('checkout/session').then(({ paypalEmail, paypalPassword }) => { cy.origin('https://www.sandbox.paypal.com', { args: { paypalEmail, paypalPassword } }, // 传递参数到跨域上下文 ({ paypalEmail, paypalPassword }) => { cy.get('#email', { timeout: 10000 }) .should('be.visible') .clear() .type(paypalEmail) cy.get('button[id="btnNext"]', { timeout: 10000 }) .should('be.visible') .click() cy.get('#password', { timeout: 10000 }) .should('be.visible') .clear() .type(paypalPassword) cy.get('button[id="btnLogin"]', { timeout: 10000 }) .should('be.visible') .click() // 处理PayPal可能的额外授权步骤(如果有) cy.get('button[data-testid="approve-button"]', { timeout: 15000 }) .should('be.visible') .click() } ) }) })
2. 确保重定向后切换回主域名上下文
登录完成后,PayPal会重定向回你的应用域名,需要显式断言主域名的URL,让Cypress确认上下文切换完成:
// 在调用handlePayPalCredential之后添加 cy.handlePayPalCredential() // 等待重定向到你的应用域名 cy.url().should('include', 'your-app-domain.com', { timeout: 20000 }) // 继续后续测试步骤 cy.get('#checkout-complete').should('be.visible')
3. 检查Cypress配置的关键项
确保cypress.config.js中启用了experimentalSessionAndOrigin(cy.origin()的依赖特性),且使用Cypress 9.6.0及以上版本:
module.exports = defineConfig({ e2e: { experimentalSessionAndOrigin: true, // 必须启用 // 其他配置... }, })
注意:不要设置chromeWebSecurity: false,这会和experimentalSessionAndOrigin冲突,导致跨域上下文管理异常。
4. 排查页面加载阻塞问题
- 检查重定向后的应用页面是否有未加载完成的资源(比如API请求超时),可以通过Cypress的Network面板查看请求状态。
- 禁用应用中的广告拦截、隐私跟踪脚本,这类脚本可能干扰Cypress的测试执行。
5. 调整命令超时时间
PayPal的页面加载和重定向可能较慢,适当延长全局超时时间(在cypress.config.js中):
module.exports = defineConfig({ e2e: { defaultCommandTimeout: 15000, pageLoadTimeout: 30000, // 其他配置... }, })
内容的提问来源于stack exchange,提问作者hiko
相关产品推荐
相关产品推荐

