Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在量角器测试用例中从电子邮件获取值_Javascript_Email_Testing_Protractor_Mailcatcher - Fatal编程技术网

Javascript 在量角器测试用例中从电子邮件获取值

Javascript 在量角器测试用例中从电子邮件获取值,javascript,email,testing,protractor,mailcatcher,Javascript,Email,Testing,Protractor,Mailcatcher,我需要测试一个量角器测试用例,在该用例中,用户注册,接收电子邮件,转到电子邮件中提供的链接,并在激活注册表单中填写他/她的详细信息 问题是如何从电子邮件中获取兑换令牌。我的电子邮件中有一个指向激活页面的链接,该页面具有以下身份验证令牌: http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMw

我需要测试一个量角器测试用例,在该用例中,用户注册,接收电子邮件,转到电子邮件中提供的链接,并在激活注册表单中填写他/她的详细信息

问题是如何从电子邮件中获取兑换令牌。我的电子邮件中有一个指向激活页面的链接,该页面具有以下身份验证令牌:

http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMwYjAiLCJzdWIiOiJ0ZXN0QGNvZWYuY28iLCJpYXQiOjE0Mjc0OTM5MDMsImV4cCI6MTQyODA5ODcwM30.

但是我如何获取该令牌以便构建url,或者如何单击电子邮件中的该按钮以便完成流程?我正在使用mailcatcher模拟电子邮件。

这是我最近解决的问题。希望该解决方案也适用于您的用例

先决条件:

  • 理解
    承诺的概念
逐步说明:

  • 安装邮件监听器2:

    npm install mail-listener2 --save-dev
    
  • 在量角器配置中,初始化邮件侦听器并使其全局可用:

    onPrepare: function () {
        var MailListener = require("mail-listener2");
    
        // here goes your email connection configuration
        var mailListener = new MailListener({
            username: "imap-username",
            password: "imap-password",
            host: "imap-host",
            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();
    }, 
    
  • 创建一个helper
    getlastmail()
    函数,该函数将等待检索
    电子邮件

    function getLastEmail() {
        var deferred = protractor.promise.defer();
        console.log("Waiting for an email...");
    
        mailListener.on("mail", function(mail){
            deferred.fulfill(mail);
        });
        return deferred.promise;
    };
    
  • 示例测试用例:

    describe("Sample test case", function () {
    
        beforeEach(function () {
            browser.get("/#login");
            browser.waitForAngular();
        });
    
        it("should login with a registration code sent to an email", function () {
            element(by.id("username")).sendKeys("MyUserName");
            element(by.id("password")).sendKeys("MyPassword");
            element(by.id("loginButton")).click();
    
            browser.controlFlow().await(getLastEmail()).then(function (email) {
                expect(email.subject).toEqual("New Registration Code");
                expect(email.headers.to).toEqual("myemail@email.com");
    
                // extract registration code from the email message
                var pattern = /Registration code is: (\w+)/g;
                var regCode = pattern.exec(email.text)[1];
    
                console.log(regCode);
    
             });
        });
    });
    

  • 我实现的解决方案是使用mailcatcher,如果向下滚动一点,您会发现关于API的以下内容:

    相当RESTful的URL模式意味着您可以下载消息列表 在JSON from/messages中,每个消息的元数据 /messages/:id.json,然后使用 /messages/:id.html和/messages/:id.plain用于默认html和 纯文本版本,/messages/:id/:cid,用于个人附件 CID,或带有/messages/:id.source的整个消息

    因此,我们首先获取整个json响应,解析它并获取最新的电子邮件id:

    // Returns the last email id
    function(emails, user) {
        var email, recipient;
        for(var i = emails.length - 1; i >= 0; i--) {
            email = emails[i];
            for(var j = 0; j < email.recipients.length ; j++) {
                recipient = email.recipients[j];
                if(recipient == "<"+user+">") {
                    return email.id;
                }
            }
        }
    };
    

    干杯

    我不得不做同样的事情,但是我们使用的邮件测试服务器没有imap支持。 所以,如果有人遇到同样的问题,我使用npm库实现了与alecxe类似的解决方案

    然而,pop3客户端的问题是它不充当侦听器,因此我们必须定义一个助手函数,当我们需要测试最新的电子邮件时,该函数将连接、登录并获取最新的电子邮件

    大概是这样的:

    function getLastEmail() {
      var deferred = protractor.promise.defer();
      var POP3Client = require("mailpop3");
      var client = new POP3Client(port, host, {
              tlserrs: false,
              enabletls: true,
              debug: false
          });
    
      client.on("connect", function() {
      
              console.log("CONNECT success");
              client.login(username, password);
      
      });
    
      client.on("login", function(status, rawdata) {
      
          if (status) {
      
              console.log("LOGIN/PASS success");
              client.retr(1);
      
          } else {
      
              console.log("LOGIN/PASS failed");
              client.quit();
      
          }
      });
    
      client.on("retr", function(status, msgnumber, data, rawdata) {
      
          if (status === true) {
      
              console.log("RETR success for msgnumber " + msgnumber);
              deferred.fulfill(data);
      
          } else {
      
              console.log("RETR failed for msgnumber " + msgnumber);
        
          }
          client.quit();
      });
      return deferred.promise;
    }
    
    

    谢谢你的回答,我会看一看并接受你的回答。@ashish谢谢,我已经使用提供的方法一段时间了,它非常适合我。希望你也能这么说。嘿@alecxe,我的要求是直接接收邮件,而你的解决方案可以用于从邮件服务器读取。我们正在使用邮件捕获器获取邮件,但mail-listener2无法读取,因为它是SMTP服务器。作为一种解决方案,我直接使用mailcatcher api解析消息并获取令牌。@ashish您能在这里发布您的解决方案作为答案吗?我认为这可能对主题访问者有用。谢谢真的很抱歉这么晚了,我已经发布了我的解决方案,希望它能帮助您和社区。:)像Inbucket这样的一次性网络邮件系统也将有助于解决这个问题。您可以使用RESTAPI获取电子邮件-
    function getLastEmail() {
      var deferred = protractor.promise.defer();
      var POP3Client = require("mailpop3");
      var client = new POP3Client(port, host, {
              tlserrs: false,
              enabletls: true,
              debug: false
          });
    
      client.on("connect", function() {
      
              console.log("CONNECT success");
              client.login(username, password);
      
      });
    
      client.on("login", function(status, rawdata) {
      
          if (status) {
      
              console.log("LOGIN/PASS success");
              client.retr(1);
      
          } else {
      
              console.log("LOGIN/PASS failed");
              client.quit();
      
          }
      });
    
      client.on("retr", function(status, msgnumber, data, rawdata) {
      
          if (status === true) {
      
              console.log("RETR success for msgnumber " + msgnumber);
              deferred.fulfill(data);
      
          } else {
      
              console.log("RETR failed for msgnumber " + msgnumber);
        
          }
          client.quit();
      });
      return deferred.promise;
    }