尝试使用 mail-listener2 获取电子邮件时出现以下错误和 Protractor :
[17:29:50] E/launcher - TypeError: deferred.fulfill is not a function
该步骤的目的是确保执行延迟 promise ,即收到邮件。
步骤:
await browser.wait(MailHelper.getLastEmail, 6000);
邮件助手:
import { protractor } from 'protractor';
export class MailHelper {
static getLastEmail() {
const deferred: any = protractor.promise.defer();
console.log('Waiting for an email...');
const globalAny: any = global;
globalAny.mailListener.on('mail', function (mail, seqno, attributes) {
console.log(`Received: ${mail.subject}`);
deferred.fulfill(mail);
});
return deferred.promise;
}
}
Protractor 配置:
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
exports.config = {
SELENIUM_PROMISE_MANAGER: false,
allScriptsTimeout: 50000,
getPageTimeout: 50000,
// specs: [
// './src/**/*.e2e-spec.ts'
// ],
specs: ['./src/features/**/*.feature'],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'custom',
frameworkPath: require.resolve('protractor-cucumber-framework'),
cucumberOpts: {
require: [
'./src/steps/**/*.steps.ts'
],
tags: "@debug"
},
onPrepare() {
require('ts-node').register({
project: require('path').join(__dirname, './tsconfig.e2e.json')
});
return new Promise((resolve, reject) => {
var MailListener = require("mail-listener2");
var mailListener = new MailListener({
username: "xxx@gmail.com",
password: "test",
host: "imap.gmail.com",
port: 993,
tls: true,
tlsOptions: { rejectUnauthorized: false },
mailbox: "INBOX"
});
mailListener.start();
mailListener.on("server:connected", function () {
console.log("Mail listener initialized");
resolve();
});
mailListener.on("server:disconnected", function () {
console.log("imapDisconnected");
});
mailListener.on("error", function (err) {
console.log('MailListener error: ' + err);
reject(err);
});
global.mailListener = mailListener;
});
},
onCleanUp: function () {
mailListener.stop();
}
};
最佳答案
问题似乎出在 Protractor promise API 上。不确定您使用的是哪个版本的 Protractor 。
无论如何,既然您正在使用 async/await,为什么不直接使用 Promise 而不是依赖 Protractor promises?
这是一个代码片段,它做同样的事情,但使用 Promise
export class MailHelper {
static getLastEmail() {
const globalAny: any = global;
return new Promise((resolve, reject) => {
globalAny.mailListener.on('mail', function (mail, seqno, attributes) {
resolve(mail);
});
});
}
}
希望对您有所帮助...
关于javascript - Protractor 使用邮件监听器获取电子邮件 : TypeError: deferred. fulfill 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57295490/