Recupero dei valori dall’e-mail nel caso di test del protractor

Ho bisogno di testare un caso di prova con un protractor in cui un utente si iscrive, riceve una mail, va al link fornito nell’e-mail e compila i suoi dettagli nel modulo di registrazione all’triggerszione.

Il problema è come posso ottenere il token riscattare dall’e-mail. La mia e-mail ha un link alla pagina di triggerszione che ha il token auth come segue:

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

Ma come posso recuperare quel token in modo da poter creare l’url o come posso fare clic su quel pulsante nella mia e-mail in modo che possa completare il stream? Sto usando mailcatcher per simulare la posta elettronica.

Questo è qualcosa che ho risolto di recente. Spero che la soluzione si applichi anche al tuo caso d’uso.

Prerequisiti:

  • pacchetto mail-listener2
  • comprensione del concetto di promises

Istruzioni passo passo:

  1. Installa mail-listener2 :

     npm install mail-listener2 --save-dev 
  2. Nella configurazione del protractor, inizializza Mail Listener e rendilo disponibile globalmente:

     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(); }, 
  3. Creare una funzione getLastEmail() supporto che attenda il recupero di emailemail :

     function getLastEmail() { var deferred = protractor.promise.defer(); console.log("Waiting for an email..."); mailListener.on("mail", function(mail){ deferred.fulfill(mail); }); return deferred.promise; }; 
  4. Esempio di test case:

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

La soluzione che ho implementato era l’uso dell’API mailcatcher, se scorri un po ‘troverai le seguenti informazioni sull’API:

Uno schema URL abbastanza RESTful significa che puoi scaricare un elenco di messaggi in JSON da / messages, i metadati di ogni messaggio con /messages/:id.json, e quindi le parti pertinenti con /messages/:id.html e / messages /: id .plain per l’HTML e la versione di testo normale di default, / messages /: id /: cid per singoli allegati da CID, o l’intero messaggio con /messages/:id.source.

Quindi abbiamo prima recuperato l’intera risposta JSON, analizzandola e recuperando l’ultimo ID email:

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

possiamo usare l’e-mail id per ottenere il corpo dell’e-mail premendo /messages/:id.plain (ovviamente ci sono altre varianti come il recupero del codice sorgente dell’email o dell’email resa HTML, abbiamo solo bisogno del messaggio), quindi possiamo solo analizzare il corpo a prendere ciò che vogliamo, seguendo il codice:

 browser.driver.get(mailcatcherUrl+"/messages"); browser.driver.findElement(by.tagName('body')).getText().then(function(response) { var emails, lastEmailId, partialTokens ; emails = JSON.parse(response); lastEmailId = getLastEmailId(emails, user); browser.driver.get(mailcatcherUrl+"/messages/"+lastEmailId+".plain"); browser.driver.findElement(by.tagName('body')).getText().then(function(lastEmail) { // use latestEmail to get what you want. }); }); 

E grazie!