javascript - Protractor 使用邮件监听器获取电子邮件 : TypeError: deferred. fulfill 不是函数

标签 javascript angular protractor

尝试使用 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/

相关文章:

javascript - 如何在extjs中创建快捷键

javascript - 如何在 `protractor` 中定位动态元素

javascript - 如何通过 Angular 2中的事件对象获取输入字段名称

angular - 即使 OnPush 策略开启,什么事件也会触发变更检测?

来自共同来源的 Angular 条件分量

node.js - Protractor 不被识别为内部或外部命令、可操作程序或批处理文件

ionic-framework - 使用 Protractor 等待 ionic 加载对话框

javascript - 动态事件上的 onchange 事件

JavaScript 在特定计算机上运行速度非常慢

javascript - 添加内容,滚动到它,隐藏旧内容