问题:
我们有多个测试,我们需要实际检查测试用户的电子邮件作为测试用例步骤。这用于双因素身份验证和电子邮件通知测试。
目前,我们使用基于here的mail-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%的时间内,邮件侦听器失败并显示以下错误消息:
使用服务器进行身份验证时超时
问题:
什么可能导致问题,我们可以做些什么来使邮件监听器工作?此外,是否可以重试失败时的身份验证?
答案 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
},