测试密码重置功能是确保任何Web应用程序的安全性和可靠性的重要组成部分。在本教程中,我们将学习如何使用node.js。
在硒中重置密码。为了测试此功能,我们还需要一些支持密码重置的演示应用程序。为了易于使用,最终代码(包括此帖子的测试应用程序)可在GitHub上找到。
硒设置
我们将在节点中使用selenium-webdriver
库。您可以使用以下命令将其添加到项目中
npm install selenium-webdriver
我们还没有设置使用硒,我们还需要安装相关的驱动程序。在此示例中,我们将使用Chrome并安装ChromeDriver。为了进行更轻松的设置,让我们使用使用最新的Chromedriver版本之一的chromedriver
NPM软件包。它像这样安装了
npm install chromedriver
这将使其他开发人员更容易签约我们的存储库,因为他们不需要为驾驶员执行单独的安装步骤,因此进行npm install
就足够了。
编写测试
我们将编写一个测试,该测试重点介绍重置密码的关键方面
- 创建一个新用户,这将使您在没有其他依赖逻辑的情况下自行运行测试变得更加容易。
- 作为此用户登录,在这里我们将仅确认所选密码有效。
- 重置此用户的密码,这将是两个步骤的过程。首先,我们将触发密码重置电子邮件,到达后,我们将输入我们的新密码并重置。
- 使用新密码登录,最后我们确认新密码已接受,并且密码重置如预期的。
如前所述,我们正在使用repository中可用的应用程序,该应用程序既已准备好了前端和后端。
让我们首先获取与电子邮件无关的零件。这是我们的password-reset.test.js
的内容
const { Builder, By } = require("selenium-webdriver");
const { MailiskClient } = require("mailisk");
(async function passwordResetTest() {
let resetLink;
const namespace = "mynamespace";
const testEmailAddress = `test.${new Date().getTime()}@${namespace}.mailisk.net`;
const mailisk = new MailiskClient({ apiKey: "YOUR_API_KEY" });
// Create a new Chrome driver
let driver = await new Builder().forBrowser("chrome").build();
try {
// Let's visit the signup page and create a new user
await driver.get("http://localhost:3000/register");
await new Promise((r) => setTimeout(r, 500));
await driver.findElement(By.id("email")).sendKeys(testEmailAddress);
await driver.findElement(By.id("password")).sendKeys("password");
await driver.findElement(By.css("form")).submit();
await new Promise((r) => setTimeout(r, 500));
// We should have been redirected to the login page, so let's enter our credentials
await driver.findElement(By.id("email")).sendKeys(testEmailAddress);
await driver.findElement(By.id("password")).sendKeys("password");
await driver.findElement(By.css("form")).submit();
await new Promise((r) => setTimeout(r, 500));
// Let's send a password reset email
await driver.get("http://localhost:3000/forgot");
await new Promise((r) => setTimeout(r, 500));
await driver.findElement(By.id("email")).sendKeys(testEmailAddress);
await driver.findElement(By.css("form")).submit();
// the reset email is sent here!
// Now we wait for the email to arrive extract the link
// TODO: we'll need to implement this part
// We visit the reset link and set the new password
await driver.get(resetLink);
await new Promise((r) => setTimeout(r, 500));
await driver.findElement(By.id("new-password")).sendKeys("newpassword");
await driver.findElement(By.css("form")).submit();
await new Promise((r) => setTimeout(r, 500));
// Let's try logging in again, but this time with the new password
await driver.get("http://localhost:3000");
await new Promise((r) => setTimeout(r, 500));
await driver.findElement(By.id("email")).sendKeys(testEmailAddress);
await driver.findElement(By.id("password")).sendKeys("newpassword");
await driver.findElement(By.css("form")).submit();
await new Promise((r) => setTimeout(r, 500));
// If we successfully log in, the app will redirect us to the dashboard
let currentUrl = await driver.getCurrentUrl();
if (currentUrl !== "http://localhost:3000/dashboard") {
throw new Error(`Expected url to be 'http://localhost:3000/dashboard' got '${currentUrl}'`);
}
} catch (error) {
console.error(error);
} finally {
// Close the browser
await driver.quit();
}
})();
上面提供的代码实现了重置密码的大多数关键步骤。我们只需要某种方法来编程接收电子邮件并获得重置链接。
接收电子邮件
我们将使用mailisk库获取密码电子邮件。首先使用
安装
npm install mailisk
上面的测试示例已经包含一些相关的代码,例如导入库和创建客户端
const { MailiskClient } = require("mailisk");
...
const mailisk = new MailiskClient({ apiKey: "YOUR_API_KEY" });
为了使用客户端,您还需要一个API键,您可以在dashboard中找到您的API键。
Mailisk基于命名空间的作品,您可以将其视为一个接收地址,我们可以通过编程方式访问。例如,如果我们拥有命名空间mynamespace
,我们可以找到发送给john@mynamespace.mailisk.net
的所有电子邮件(您可以用任何有效的电子邮件地址替换john
)。
...
const namespace = "mynamespace";
const testEmailAddress = `test.${new Date().getTime()}@${namespace}.mailisk.net`;
我们使用此代码段来创建一个唯一的电子邮件地址每个测试。每次测试开始时,都会使用随机的电子邮件地址创建新用户,看起来像这样
test.123456789@mynamespace.mailisk.net
这意味着由于现有电子邮件,我们不必担心混乱(例如,它返回带有无效的重置链接的旧电子邮件)。
SearchInbox
为了阅读电子邮件,我们将使用Mailisk的searchInbox
函数填写缺少代码
// Now we wait for the email to arrive extract the link
const { data: emails } = await mailisk.searchInbox(namespace, {
to_addr_prefix: testEmailAddress,
});
const email = emails[0];
resetLink = email.text.match(/.*\[(http:\/\/localhost:3000\/.*)\].*/)[1];
searchInbox
函数采用命名空间和选项。我们使用to_addr_prefix
选项来过滤发送到其他地址的电子邮件(例如john@mynamespace.mailisk.net
)。结合电子邮件为随机,这可以确保我们保证只能找到密码重置电子邮件。
默认情况下,
searchInbox
函数过滤了旧的电子邮件,并等待至少一封电子邮件返回。这就是为什么我们不需要手动泳池/等待结果。
作为回复,我们将收到一系列电子邮件,但我们只关心一封电子邮件。我们将运行一些正则链条来过滤链接并将其分配给resetLink
,以便以后在测试中使用。
就是这样。我们已经进行了一个自动测试,可以重置密码并尝试再次使用新密码登录。