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

Selenium自动化测试中如何实现等待目标邮件成功接收的代码逻辑

代码修改方案

你可以通过带超时限制的轮询检测替换固定时长休眠,解决邮件延迟导致的检测失败问题,修改后的代码如下:

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import org.testng.asserts.SoftAssert;
import org.testng.Reporter;
import java.util.Properties;

public void checkEmail(String imap, String username, String password, String message, 
                       int maxWaitSeconds, int pollIntervalSeconds) throws MessagingException, InterruptedException {
    SoftAssert softAssert = new SoftAssert();
    boolean mailReceived = false;
    long startTime = System.currentTimeMillis();
    long maxWaitMillis = maxWaitSeconds * 1000L;

    // 配置项仅需初始化一次
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imap");
    props.setProperty("mail.imaps.partialfetch", "false");
    props.put("mail.imap.ssl.enable", "true");
    props.put("mail.mime.base64.ignoreerrors", "true");
    Session session = Session.getDefaultInstance(props, null);

    // 轮询检测逻辑
    while (System.currentTimeMillis() - startTime < maxWaitMillis) {
        // 每次轮询重新建立连接拉取最新邮件,避免缓存导致看不到新邮件
        try (Store store = session.getStore("imap");
             Folder folder = store.getFolder("INBOX")) {

            store.connect(imap, 993, username, password);
            folder.open(Folder.READ_WRITE);

            // 调用单次检测逻辑
            mailReceived = checkTargetMailExist(folder, message, softAssert);
            if (mailReceived) {
                break;
            }

            // 未找到邮件则休眠指定间隔后再次检测
            Thread.sleep(pollIntervalSeconds * 1000L);
        }
    }

    // 超出最大等待时长仍未找到判定失败
    if (!mailReceived) {
        softAssert.fail("Email not received -> " + message);
        Reporter.log("Email not received -> " + message, true);
    }

    // 触发SoftAssert断言校验,原代码缺失该逻辑会导致断言不生效
    softAssert.assertAll();
}

/**
 * 单次检测目标邮件是否存在
 */
private boolean checkTargetMailExist(Folder folder, String message, SoftAssert softAssert) throws MessagingException {
    Message[] messages = folder.getMessages();
    for (Message mail : messages) {
        Address[] froms = mail.getFrom();
        String email = froms == null ? null : ((InternetAddress) froms[0]).getAddress();
        if (!mail.isSet(Flags.Flag.SEEN) && email.contains("abc@abc.com") && mail.getSubject().contains(message)) {
            mail.setFlag(Flags.Flag.SEEN, true);
            softAssert.assertTrue(true, "Email received ->");
            Reporter.log("Email received -> " + mail.getSubject(), true);
            return true;
        }
    }
    return false;
}

关键改动说明

  • 新增两个可配置参数:maxWaitSeconds为最长等待时间(单位秒,建议设置为60120秒),`pollIntervalSeconds`为每次检测的间隔时间(单位秒,建议设置为35秒),调用方法时不需要提前写固定休眠逻辑,方法内部会自动控制等待时长
  • 每次检测会重新拉取收件箱的最新数据,避免本地缓存导致看不到新到的邮件
  • 补充了资源自动关闭逻辑,避免连接泄漏导致的后续请求报错
  • 修复了原代码SoftAssert未调用assertAll()导致断言不生效的问题

内容的提问来源于stack exchange,提问作者Newtoselenium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:45:10