【问题标题】:Test Automation Using Java Selenium - Using JavaMail to check a confirmation email - Doesn't get mail if email arrives few seconds late使用 Java Selenium 进行测试自动化 - 使用 JavaMail 检查确认电子邮件 - 如果电子邮件迟到几秒钟,则不会收到邮件
【发布时间】:2021-06-22 03:46:41
【问题描述】:

所以,我刚刚将我的第一个测试写入现有自动化框架,用于用户注册之旅。

代码所做的是在前端注册一个用户,然后在后台使用 javaMail 来检查具有特定主题的电子邮件,而不是通过 UI。

7/10 次它工作正常,但我注意到,在一天的前几次运行中它失败了,因为电子邮件迟到了几秒钟。如果没有找到消息等,我对我的代码进行了各种修改以循环,似乎没有任何工作。

我在测试中得到的确切错误是“index 0 out of bounds for length 0”,这基本上意味着 arrayList 没有被填充,所以是的,问题是,为什么它没有填充..

这是我的 getMessageBySubject() 方法,有什么明显的地方表明我做错了吗? -

public Message[] getMessagesBySubject(String subject, boolean unreadOnly, boolean nonZero, int maxToSearch) throws MessagingException {
        Map<String, Integer> indices = getStartAndEndIndices(maxToSearch);

        Message messages[];
        long startTime = System.currentTimeMillis();

        do {
            messages = folder.search(
                    new SubjectTerm(subject),
                    folder.getMessages(indices.get("startIndex"), indices.get("endIndex")));

            if (unreadOnly) {
                List<Message> unreadMessages = new ArrayList<Message>();
                for (Message message : messages) {
                    if (isMessageUnread(message)) {
                        unreadMessages.add(message);
                    }
                }
                messages = unreadMessages.toArray(new Message[]{});
            }
        } while (messages.length == 0 && nonZero && System.currentTimeMillis() - startTime < 20000);

        return messages;
    }

这是实际测试类中的调用-

public void checkEmailConfirmation() throws MessagingException, IOException {
        Message email  = Arrays.asList(emailUtils.getMessagesBySubject("Account confirmation for " + registrationTitle + " " + registrationFirstname + " " + registrationLastname, true, true, 5)).get(0);
        String link = emailUtils.getUrlsFromMessage(email, "confirm").get(0);
        assertThat("Confirmation link not populated",link != null && !link.trim().isEmpty());
        basePage.goToURL(link);
        assertThat("Not logged in successfully!", myAccountPage.loginSuccessful());

我们的项目使用 gradle,这些是我们正在使用的 javaMail 包 -

   compile 'javax.mail:javax.mail-api:1.6.2'
    compile 'com.sun.mail:javax.mail:1.6.2'
    compile 'com.sun.mail:smtp:2.0.0'

任何帮助将不胜感激。我在这个测试中花了太长时间拉头发:'(

【问题讨论】:

    标签: java selenium jakarta-mail ui-automation


    【解决方案1】:

    解决了这个问题,现在每次都可以工作,结果我们需要打开和关闭文件夹,所以在这里创建了一个方法来做到这一点 -

        public void refreshFolder() throws MessagingException {
            folder.close();
            folder.open(Folder.READ_WRITE);
        }
    

    getMessagesBySubjectMethod 现在看起来像 -

        public Message[] getMessagesBySubject(String subject, boolean unreadOnly, boolean nonZero, int maxToSearch) throws MessagingException {
            Map<String, Integer> indices = getStartAndEndIndices(maxToSearch);
    
            Message messages[];
            long startTime = System.currentTimeMillis();
    
            do {
                refreshFolder();
                messages = folder.search(
                        new SubjectTerm(subject),
                        folder.getMessages(indices.get("startIndex"), indices.get("endIndex")));
    
                if (unreadOnly) {
                    List<Message> unreadMessages = new ArrayList<Message>();
                    for (Message message : messages) {
                        if (isMessageUnread(message)) {
                            unreadMessages.add(message);
                        }
                    }
                    messages = unreadMessages.toArray(new Message[]{});
                }
            } while (messages.length == 0 && nonZero && System.currentTimeMillis() - startTime < 20000);
    
            return messages;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      相关资源
      最近更新 更多