正在量角器测试用例中从电子邮件中获取值
Fetching values from email in protractor test case
我需要测试一个量角器测试用例,其中用户注册,收到电子邮件,转到电子邮件中提供的链接,并在激活注册表中填写他/她的详细信息。
问题是我如何从电子邮件中获得兑换代币。我的电子邮件有一个到激活页面的链接,该页面有如下身份验证令牌:
http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMwYjAiLCJzdWIiOiJ0ZXN0QGNvZWYuY28iLCJpYXQiOjE0Mjc0OTM5MDMsImV4cCI6MTQyODA5ODcwM30.
但是,我如何获取该令牌以便构建url,或者我如何在电子邮件中单击该按钮以便完成流程?我正在使用mailcatcher来模拟电子邮件。
这是我最近解决的问题。希望该解决方案也适用于您的用例。
先决条件:
mail-listener2
包- 对
promises
概念的理解
分步说明:
-
安装
mail-listener2
: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(); },
-
创建一个助手
getLastEmail()
函数,等待检索email
: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,如果你向下滚动一点,你会发现以下关于API的信息:
一个相当RESTful的URL模式意味着您可以下载一个消息列表在来自/messages的JSON中,每个消息的元数据/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;
}
}
}
};
使用该电子邮件id,我们可以通过点击/messages/:id.plain
来获取电子邮件的正文(当然还有更多的变体,比如获取电子邮件源代码或电子邮件呈现的html,我们只需要消息),然后我们可以解析正文来获取我们想要的内容,下面是代码:
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.
});
});
干杯!
我不得不做同样的事情,但我们使用的邮件测试服务器没有imap支持。因此,如果有人遇到同样的问题,我使用mailpop3npm库实现了与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;
}
- 获取屏幕截图并在电子邮件中发送的按钮
- 正在量角器测试用例中从电子邮件中获取值
- 获取电子邮件附件的表单元素
- 根据选择选项元素将表单重定向到不同的URL,并在电子邮件中获取表单详细信息
- 获取登录用户的电子邮件(Firebase安全规则)
- 从代码点火器控制器发送电子邮件后,无法在 jquery 中获取响应
- 如何使用LinkedIn Javascript API获取电子邮件地址字段
- 使用 Javascript 中的 Google People API 获取联系人电子邮件地址
- 在尝试检索经过身份验证的Google+用户的电子邮件地址时获取“gapi.client未定义”
- 使用 LinkedIn API JavaScript SDK 获取电子邮件地址
- 需要在 PHP 脚本中使用用户的本地时间来发送电子邮件 - 我如何从 JS 中获取数据并在我的 php 中使用它
- 如何获取电子邮件页面并向其提交表单数据
- 从数据库中获取电子邮件值并发送(PHP电子邮件)/刷新页面,而无需更改网站链接
- 如何使用正则表达式从此字符串获取电子邮件
- 无法使用PHP和Angular.js在电子邮件收件箱中获取电子邮件
- 使用脸书登录获取用户名,电子邮件
- 如何解析 DOM 以获取电子邮件 Javascript
- 无法使用 Javascript 通过 Viadeo API 获取用户电子邮件
- Zimbra邮件服务器 - 获取有关新传入电子邮件的信息
- 为使用JS邮件处理程序的电子邮件获取Select中Option的值