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



我正在尝试创建一个用于电子邮件验证的脚本。我的意思是,当我们在网站上创建一个帐户时,验证邮件将发送到给定的邮件地址,然后我们必须转到该邮件并进行验证(单击链接/或获取代码(。我尝试了这个解决方案。但是我卡在了特定的错误上。

这是我正在尝试的代码。

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);
    });
});

}(;

这是我的 conf 文件。

// 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()