用节点中的硒重置密码
#node #测试 #email #selenium

测试密码重置功能是确保任何Web应用程序的安全性和可靠性的重要组成部分。在本教程中,我们将学习如何使用node.js。

在硒中重置密码。

为了测试此功能,我们还需要一些支持密码重置的演示应用程序。为了易于使用,最终代码(包括此帖子的测试应用程序)可在GitHub上找到。

硒设置

我们将在节点中使用selenium-webdriver库。您可以使用以下命令将其添加到项目中

npm install selenium-webdriver

我们还没有设置使用硒,我们还需要安装相关的驱动程序。在此示例中,我们将使用Chrome并安装ChromeDriver。为了进行更轻松的设置,让我们使用使用最新的Chromedriver版本之一的chromedriver NPM软件包。它像这样安装了

npm install chromedriver

这将使其他开发人员更容易签约我们的存储库,因为他们不需要为驾驶员执行单独的安装步骤,因此进行npm install就足够了。

编写测试

我们将编写一个测试,该测试重点介绍重置密码的关键方面

  1. 创建一个新用户,这将使您在没有其他依赖逻辑的情况下自行运行测试变得更加容易。
  2. 作为此用户登录,在这里我们将仅确认所选密码有效。
  3. 重置此用户的密码,这将是两个步骤的过程。首先,我们将触发密码重置电子邮件,到达后,我们将输入我们的新密码并重置。
  4. 使用新密码登录,最后我们确认新密码已接受,并且密码重置如预期的。

如前所述,我们正在使用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,以便以后在测试中使用。

就是这样。我们已经进行了一个自动测试,可以重置密码并尝试再次使用新密码登录。