如何在Cypress中发送HTML报告邮件?执行脚本遇任务未处理错误
问题根源
你将sendMail任务定义在了commands.js中,但未在cypress.config.js的setupNodeEvents方法里注册该任务,导致Cypress无法识别它。此外,邮件发送属于异步操作,原代码的回调函数未返回Promise,会导致任务无法正确处理异步结果。
解决方案
1. 修改cypress.config.js,注册sendMail任务并处理异步逻辑
将邮件发送逻辑整合到配置文件中,同时用Promise包裹异步操作,确保Cypress能等待任务完成:
const { defineConfig } = require('cypress') const nodemailer = require('nodemailer'); const sgTransport = require('nodemailer-sendgrid-transport'); // 封装邮件发送逻辑,返回Promise处理异步 const sendAnEmail = (message) => { return new Promise((resolve, reject) => { const options = { auth: { api_user: 'webinar-wc', api_key: 'Webinarwc20@', } } const client = nodemailer.createTransport(sgTransport(options)); const email = { from: 'shubham.jadhav@whitecode.co.in', to: 'shubhamjadhavsrj120@gmail.com', subject: 'Hello', text: message, html: '<b>Hello world</b>' }; client.sendMail(email, function(err, info) { if (err) { reject(err.message); } else { resolve('Message sent: ' + info.response); } }); }) } module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('task', { log(message) { console.log(message) return null }, // 注册sendMail任务 sendMail(message) { return sendAnEmail(message); } }) }, }, })
2. 清理冗余代码
删除commands.js中关于sendMail的所有代码,避免逻辑冗余。
3. 保持e2e.js代码不变
你的e2e.js钩子代码无需修改:
after(() => { cy.task('sendMail', 'This will be output to email address') .then(result => console.log(result)); })
关键说明
- Cypress自定义任务必须在
setupNodeEvents中注册,否则无法被识别调用。 - 异步操作(如邮件发送)必须用Promise包裹,确保Cypress等待异步逻辑完成后再返回结果,避免任务提前结束或丢失返回值。
内容的提问来源于stack exchange,提问作者Shubham Jadhav
相关产品推荐
相关产品推荐

