0
  1. I have already installed MailListener npm install mail-listener2 --save-dev

  2. In My Config.js file, I have

exports.config = {
  directConnect: true,
  capabilities: {
    browserName: 'chrome',
  },

  framework: 'jasmine2',
  onPrepare: function () {
    var AllureReporter = require('jasmine-allure-reporter');
    var AllureReporter = require('../index');
    jasmine.getEnv().addReporter(new AllureReporter({
      resultsDir: 'allure-results'
    }));

    // Mail Listener
    var MailListener = require("mail-listener2");

    // here goes your email connection configuration
    var mailListener = new MailListener({
      username: "myemail@gmail.com",
      password: "mygmailpassword!",
      host: "imap.gmail.com",
      port: 993, // imap port 
      tls: true,
      tlsOptions: { rejectUnauthorized: false },
      mailbox: "INBOX", // mailbox to monitor 
      searchFilter: ["UNSEEN", "FLAGGED"], // the search filter being used after an IDLE notification has been retrieved 
      markSeen: true, // all fetched email willbe marked as seen and not fetched next time 
      fetchUnreadOnStart: true, // use it only if you want to get all unread email on lib start. Default is `false`, 
      mailParserOptions: { streamAttachments: true }, // options to be passed to mailParser lib. 
      attachments: true, // download attachments as they are encountered to the project directory 
      attachmentOptions: { directory: "attachments/" } // specify a download directory for attachments 
    });

    mailListener.start();

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

    global.mailListener = mailListener;

  },
  onCleanUp: function () {
    mailListener.stop();
  },

  // Spec patterns are relative to the current working directory when
  // protractor is called.
  specs: [
    '../e2e/login_spec.js'
  ],

  // Options to be passed to Jasmine.
  jasmineNodeOpts: {
    defaultTimeoutInterval: 30000
  }
};

  1. in my login_spec.js file i have the function
function getLastEmail() {
  var deferred = protractor.promise.defer();
  console.log("Waiting for an email...");

  mailListener.on("mail", function(mail){
      deferred.fulfill(mail);
  });
  return deferred.promise;
}; 
  1. In the Same login_spec.js i am trying
var loginData = require('../data.json');
var Login_Objects = require('../page_objects/login_objects');

describe('2Factor Login:', function () {
dataProvider(loginData, function (data) {
Login_Objects.EnterUserName(data.username)
Login_Objects.EnterUserName(data.password)
Login_Objects.ClickLogin()
//Code is sent to email
browser.controlFlow().wait(getLastEmail()).then(function (email){
        var pattern = /Code for your transfer (\w+)/g;
        var regCode = pattern.exec(email.text)[1];
        console.log("Registration code : = "+regCode);
//Pass the code to my methods in the objects file.
//Login_Objects.Enter2FactorCode(regCode)
//Login_Objects.ClickVerify()
      })
})
})

here my Login_Objects.Enter2FactorCode(regCode) method will just send keys to the 2factor webelement [but i am not yet at that stage]

At this point i am expecting the email to be printed by the function console.log("Registration code : = "+regCode);

On the Console I am Getting the message : ... Mail listener initialized

NOTE: I have already allowed unsecure apps to access that gmail account

Findings: I am getting an error Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

My reference is this >> Fetching values from email in protractor test case

John Mburu
  • 11
  • 5

0 Answers0