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
相关产品推荐
相关产品推荐

