如何通过Cypress连接Gmail并提取邮件确认链接?
Cypress 从Gmail提取确认链接并完成验证的完整步骤
以下是两种可行的实现方案,覆盖从配置到测试用例编写的全流程:
方案1:通过IMAP协议直接读取Gmail邮件
这种方案无需依赖第三方服务,直接通过IMAP协议访问Gmail收件箱提取邮件内容。
前置配置
- 开启Gmail IMAP访问:
- 登录目标测试Gmail账号,进入「设置」→「转发和POP/IMAP」
- 勾选「启用IMAP」,点击「保存更改」
- 生成App密码(若开启2FA):
- 进入Google账号「安全」页面,找到「应用密码」入口
- 选择应用为「邮件」、设备为「其他(自定义名称)」,生成16位App密码并保存
代码实现
安装IMAP相关依赖:
npm install imap simple-parser --save-dev在
cypress/support/commands.js中添加自定义命令:const Imap = require('imap'); const simpleParser = require('simple-parser'); Cypress.Commands.add('getGmailConfirmationLink', (email, password, subject) => { return new Cypress.Promise((resolve, reject) => { const imap = new Imap({ user: email, password: password, // 2FA用户填生成的App密码,否则填邮箱密码 host: 'imap.gmail.com', port: 993, tls: true, tlsOptions: { rejectUnauthorized: false } }); const openInbox = (cb) => imap.openBox('INBOX', true, cb); imap.once('ready', () => { openInbox((err, box) => { if (err) return reject(err); // 搜索未读、指定主题的邮件 const searchCriteria = ['UNSEEN', ['SUBJECT', subject]]; const fetchOptions = { bodies: ['TEXT'], markSeen: true }; // 从最新邮件开始搜索 const fetch = imap.seq.fetch(box.messages.total + ':*', fetchOptions); fetch.on('message', (msg) => { msg.on('body', (stream) => { simpleParser(stream, (err, parsed) => { if (err) return reject(err); // 匹配确认链接(根据实际链接格式调整正则) const linkRegex = /https?:\/\/[^\s]+\/verify[^\s]+/; const match = parsed.text.match(linkRegex); if (match) { resolve(match[0]); imap.end(); } }); }); }); fetch.once('error', (err) => reject(err)); fetch.once('end', () => { imap.end(); reject(new Error('未找到符合条件的确认邮件')); }); }); }); imap.once('error', (err) => reject(err)); imap.connect(); }); });编写测试用例:
describe('用户注册与邮箱验证', () => { it('提交表单后完成邮箱验证', () => { // 1. 填写并提交注册表单 cy.visit('/register'); cy.get('#user-email').type('test-account@gmail.com'); cy.get('#user-password').type('TestPass123!'); cy.get('button[type="submit"]').click(); cy.contains('请查收邮箱完成验证').should('be.visible'); // 2. 提取确认链接并访问 cy.getGmailConfirmationLink( 'test-account@gmail.com', 'your-app-password-or-email-password', '请确认你的账户' // 替换为实际邮件主题 ).then((verifyLink) => { cy.visit(verifyLink); cy.contains('账户验证成功').should('be.visible'); }); }); });
方案2:使用Cypress邮箱插件简化流程
借助Cypress专用邮箱插件可以减少自定义代码量,提升开发效率。
前置配置
- 安装插件:
npm install cypress-email-commands --save-dev - 在
cypress/support/e2e.js中导入插件:import 'cypress-email-commands'; - 在
cypress.config.js中配置IMAP信息:const { defineConfig } = require('cypress'); module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { config.email = { imap: { user: 'test-account@gmail.com', password: 'your-app-password', host: 'imap.gmail.com', port: 993, tls: true } }; return config; }, }, });
测试用例编写
it('完成注册验证流程', () => { // 提交注册表单 cy.visit('/register'); cy.get('#user-email').type('test-account@gmail.com'); cy.get('#user-password').type('TestPass123!'); cy.get('button[type="submit"]').click(); // 提取并访问确认链接 cy.email('fetch', { subject: '账户确认' }).then((email) => { const verifyLink = email.html.match(/https?:\/\/[^\s]+\/confirm[^\s]+/)[0]; cy.visit(verifyLink); cy.contains('验证成功').should('be.visible'); }); });
注意事项
- 请根据实际邮件中的确认链接格式调整正则表达式,确保能精准匹配
- 测试建议使用专用的测试邮箱,避免干扰个人邮箱正常使用
- 若遇到IMAP连接失败,检查Gmail账号的安全设置:是否允许IMAP访问、是否启用了App密码(2FA用户)
- 可添加重试逻辑或适当等待时间,应对邮件延迟问题
内容的提问来源于stack exchange,提问作者Blerion Muco
相关产品推荐
相关产品推荐

