使用Cypress测试网站时无法绕过企业双因素认证(2FA)问题咨询
Cypress 绕过企业双因素认证的可行方案
方案1:复用已认证的浏览器用户配置(新手最友好)
- 首先手动启动Chromium内核浏览器(Chrome/Edge都可),指定固定用户配置目录和远程调试端口,命令示例:
Windows:chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\cypress-test-profile"
Mac:/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --user-data-dir="~/cypress-test-profile" - 在弹出的浏览器中手动走完邮箱登录、RSA令牌验证全流程,确认刷新页面不需要二次验证后关闭浏览器
- 在
cypress.config.js中添加配置,让Cypress启动浏览器时直接调用该已完成认证的配置目录:
const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('before:browser:launch', (browser, launchOptions) => { if (browser.family === 'chromium') { // 替换为你自己设置的用户配置目录路径 launchOptions.args.push('--user-data-dir=C:\\cypress-test-profile') return launchOptions } }) }, }, })
后续Cypress启动浏览器时会直接携带已有的认证信息,不需要重复走2FA流程。
方案2:提前注入认证Cookie跳过登录流程
- 手动完成一次完整的登录+2FA验证流程,打开F12开发者工具-应用面板,复制所有和登录态、SSO、2FA相关的Cookie值、有效域、属性信息
- 在Cypress测试用例的前置钩子中直接注入上述Cookie,无需访问登录页即可直接进入业务页面:
beforeEach(() => { // 按实际复制的Cookie信息替换对应参数 cy.setCookie('SSO_SESSION', '实际的会话值', { domain: '.your-company-domain.com', secure: true, httpOnly: true }) cy.setCookie('2FA_VERIFIED', '1', { domain: '.your-company-domain.com' }) // 注入完成后直接访问业务测试页面 cy.visit('/your-test-page-path') })
Cookie过期后重新手动复制更新对应值即可。
方案3:自动生成RSA令牌完成全流程登录(适合CI/CD自动化场景)
如果你们的RSA令牌是基于TOTP标准生成,且可以拿到对应的密钥,可直接通过代码生成动态令牌,自动完成整个登录验证流程:
- 安装TOTP生成依赖:
npm install speakeasy --save-dev - 在测试用例中添加自动登录逻辑:
const speakeasy = require('speakeasy') // 从Cypress环境变量读取RSA密钥,不要硬编码到代码中 const getRsaToken = () => { return speakeasy.totp({ secret: Cypress.env('RSA_SECRET'), encoding: 'base32' }) } it('完成自动登录验证', () => { cy.visit('/login') // 输入工作邮箱提交 cy.get('input[name="work_email"]').type('your-work-email@company.com') cy.get('button[type="submit"]').click() // 输入自动生成的RSA令牌提交 cy.get('input[name="rsa_token"]').type(getRsaToken()) cy.get('button[type="submit"]').click() // 验证登录成功后继续执行后续测试逻辑 })
敏感的密钥信息可配置在Cypress环境变量文件或者CI的环境变量配置中,避免泄露。
内容的提问来源于stack exchange,提问作者Jesse Chen
相关产品推荐
相关产品推荐

