量角器端到端测试;验证帐户激活电子邮件

Protractor E2E testing; Verifying account activation email

我正在尝试创建用于电子邮件验证的脚本。我的意思是当我们在网站上创建一个帐户时,验证邮件将发送到给定的邮件地址,然后我们必须转到该邮件并验证它(单击 link/or 获取代码)。我试过了。但我一直卡在特定错误上。

这是我正在尝试的代码。

describe("Sample test case", function () {

    function getLastEmail() {
    let deferred = protractor.promise.defer();
    console.log("Waiting for an email...");

    mailListener.on("mail", function(mail){
        deferred.fulfill(mail);
    });
    return deferred.promise;
}


beforeAll(function () {
    browser.waitForAngularEnabled(false);
    browser.get("https://mail.google.com/mail/");
    isAngularSite(false);
    browser.sleep(3000);
});

it("should login with a registration code sent to an email", function () {
    element(by.id("username")).sendKeys("MyemailID");
    element(by.id("password")).sendKeys("mypassword");
    element(by.id("loginButton")).click();

    browser.controlFlow().await(getLastEmail()).then(function (email) {
        expect(email.subject).toEqual("BillPledge Email Verification");
        expect(email.headers.to).toEqual("support@billpledge.com");

        // extract registration code from the email message
        let pattern = /Registration code is: (\w+)/g;
        let regCode = pattern.exec(email.text)[1];

        console.log(regCode);

    });
});

});

这是我的配置文件。

// An example configuration file.

exports.config = {
// The address of a running selenium server.
// seleniumAddress: 'http://localhost:4444/wd/hub',

// if we are using protractor's webdriver-manager locally, you cannot use selenium Address
// If the webdriver-manager needs to start a local server, you can use
selenium: 'http://localhost:4445/wd/hub',
seleniumPort: 4445, // Port matches the port above

// Capabilities to be passed to the webdriver instance.
capabilities: {
    'browserName': 'chrome'
},

// Spec patterns are relative to the current working directly when
// protractor is called.
specs: ['./e2eTest/GmailTest.js'],

// Options to be passed to Jasmine-node.
jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 300000
},

allScriptsTimeout: 200000,


onPrepare: function () {
    global.isAngularSite = function (flag) {
        browser.ignoreSynchronization = !flag;
    };

    browser.driver.manage().window().maximize();

    //To generate the report.
    let HtmlReporter = require('protractor-beautiful-reporter');
    jasmine.getEnv().addReporter(new HtmlReporter({
        baseDirectory: 'Results/Report'
    }).getJasmine2Reporter());

    let reporter = new HtmlReporter({
        baseDirectory: 'Results/Report'
    });

    let path = require('path');
    new HtmlReporter({
        baseDirectory: 'Results/Report'
        , preserveDirectory: false
        , cssOverrideFile: 'css/style.css'
        , takeScreenShotsForSkippedSpecs: true
        , screenshotsSubfolder: 'images'
        , jsonsSubfolder: 'jsons'
        , takeScreenShotsOnlyForFailedSpecs: false
        , gatherBrowserLogs: true
        , pathBuilder: function pathBuilder(spec, descriptions, results, capabilities) {
            // Return '<browser>/<specname>' as path for screenshots:
            // Example: 'firefox/list-should work'.
            return path.join(capabilities.caps_.browser, descriptions.join('-'));
        }
        , metaDataBuilder: function metaDataBuilder(spec, descriptions, results, capabilities) {
            // Return the description of the spec and if it has passed or not:
            return {
                description: descriptions.join(' ')
                , passed: results.passed()
            };
        }
    });

    let MailListener = require("mail-listener2");

    // here goes your email connection configuration
    let mailListener = new MailListener({
        username: "myemailid",
        password: "mypassword",
        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();


},

};

但是在执行脚本时出现以下错误。错误是:

Error: Please log in via your web browser: 
https://support.google.com/mail/accounts/answer/78754 (Failure)

Failed: browser.controlFlow(...).await is not a function

我知道我做错了,但我想不通。因此,任何人都可以帮助我指出并解决它,而不是解决问题,但至少可以提供一些可以完美帮助 运行 这个脚本的建议。

谢谢

尝试使用 browser.wait(getLastEmail) 而不是 browser.controlFlow().await(getLastEmail()