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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:23