邮件监听器偶尔无法进行身份验证

时间:2016-12-22 16:00:09

标签: javascript email selenium protractor email-client

问题:

我们有多个测试,我们需要实际检查测试用户的电子邮件作为测试用例步骤。这用于双因素身份验证和电子邮件通知测试。

目前,我们使用基于heremail-listener2 node package解决方案。以下是我们使用的配置:

email: {
    username: "user email here",
    password: "user password here",
    host: "smtp server address here",
    port: 993,
    tls: true,
    mailbox: "Inbox",
    markSeen: true
},

我们在onPrepare()函数中的Protractor配置中初始化邮件侦听器:

var MailListener = require("mail-listener2");
var mailListener = new MailListener(config.email);

mailListener.start();

mailListener.on("server:connected", function(){
    console.log("Mail listener initialized");
});

global.mailListener = mailListener;

问题是 - 在大约10%的时间内,邮件侦听器失败并显示以下错误消息:

  

使用服务器进行身份验证时超时

问题:

什么可能导致问题,我们可以做些什么来使邮件监听器工作?此外,是否可以重试失败时的身份验证?

2 个答案:

答案 0 :(得分:2)

这是一个异步问题。您的邮件侦听器正在尝试检查事件" server:connected"。由于这是异步的,这可能会或可能不会及时发生。您应该尝试做的是将它包装在一个承诺中,并在事件发生后解决,并且#34;服务器:已连接"。

onPrepare: {
  return new Promise((resolve, reject) => {
    var MailListener = require("mail-listener2");
    var mailListener = new MailListener(config.email);

    mailListener.start();

    mailListener.on("server:connected", function(){
      console.log("Mail listener initialized");
      resolve();
    });

    // if you run into an error on connecting to the server,
    // maybe reject the promise here.
    mailListener.on("error", (err) => {
      reject(err);
    });

    global.mailListener = mailListener;
  });
}

答案 1 :(得分:1)

@ cnishina的回答帮了很多忙。我们已经采取了更多的措施并添加了“重试”部分,以便在失败的情况下重试邮件监听器N次:

this.configureMailListener = function (mailListener, maxRetries, deferred) {
    var self = this;

    if (!deferred) {
        deferred = protractor.promise.defer();
    }

    mailListener.start();

    mailListener.on("server:connected", function() {
        console.log("Mail listener initialized.");
        deferred.fulfill();
    });

    mailListener.on("error", function (err) {
        if (maxRetries > 0) {
            console.log("Mail listener failed to initialize. Retrying...");

            setTimeout(function () {
                mailListener.removeAllListeners();
                mailListener.stop();

                self.configureMailListener(mailListener, maxRetries - 1, deferred);
            }, 1000);
        } else {
            console.log("Mail listener failed to initialize.");
            deferred.reject(err);
        }
    });
    return deferred.promise;
};

用法,将其添加到onPrepare()

onPrepare: function () {
    // configure email listener
    var MailListener = require("mail-listener2");
    var config = require("../config/config");
    var mailListener = new MailListener(config.email);

    global.mailListener = mailListener;

    return helpers.configureMailListener(mailListener, 5);  // attempt to initialize mail-listener 5 times
},