paint-brush
如何使用 Playwright 阅读 Gmail 电子邮件经过@bormando
5,132 讀數
5,132 讀數

如何使用 Playwright 阅读 Gmail 电子邮件

经过 Dmitrii Bormotov5m2023/12/10
Read on Terminal Reader

太長; 讀書

在自动化测试中阅读电子邮件是一个技巧,您可能需要知道如何在很多项目中做到这一点。这是一件棘手的事情,但并非不可能。该文档及其库并不是那么用户友好(特别是对于那些不经常进行电子邮件测试的人来说)。 gmail-getter npm 包可帮助您生成 Gmail REST API 访问令牌、获取电子邮件并将其呈现在浏览器中。
featured image - 如何使用 Playwright 阅读 Gmail 电子邮件
Dmitrii Bormotov HackerNoon profile picture

大家好!


在自动化测试中阅读电子邮件是一个技巧,您可能需要知道如何在很多项目中做到这一点。这是原因以及如何处理它......

为什么这很重要?

好吧,如果系统发送电子邮件 - 您可能需要验证它们是否正在发送并且内容是否正确,包括可点击的链接。


因此,当您需要此功能时,通常会出现以下情况:

  1. 报名。

    许多平台在您创建帐户后都会发送一封确认电子邮件,您需要点击电子邮件中的确认链接。


  2. 发票。

    如果您的应用进行任何付款 - 他们通常通过电子邮件发送支票或发票,因此您可能想查看其内容是否也正确。


  3. 结果。

    就像医学检查结果一样。根据我的经验 - 一些医院在完成后会发送一封包含测试结果的电子邮件(或者至少是一个指向个人页面的链接,您可以在其中查看报告)。


  4. ……


当然,这不是完整的列表 - 这些只是我在职业生涯中遇到最多的用例。


如果无法验证这些情况,可能会导致用户收不到电子邮件或收到电子邮件中的错误信息。在其中一个项目中,它帮助我们尽早发现了过期的SendGrind代币。

在测试中阅读电子邮件有哪些并发症?

阅读电子邮件是一件棘手的事情,但并非不可能。


早期的电子邮件客户端使用POP3从服务器获取电子邮件,但有一个小问题 - 一旦下载电子邮件,它就会从服务器中删除电子邮件。


后来, IMAP协议出现了 - 它允许您简单地从服务器读取电子邮件。


问题是 -某些服务禁止这些协议或者让你确认你的身份当您第一次连接时(例如重新启动自动化测试时)。


另一方面,像Gmail这样的一些服务提供了REST API来操作您的电子邮件,但还有另一个问题 - 文档及其库并不是真正的用户友好(特别是对于那些不经常进行电子邮件测试的人来说)。


这就是gmail-getter 的用武之地 - 一个npm库,它允许您阅读电子邮件,如果您使用Playwright等浏览器自动化工具,甚至可以在浏览器中打开它们。

使用 Gmail-Getter 阅读 Gmail 电子邮件

首先,您需要在项目中安装该软件包:

 npm install gmail-getter

创建 Google Cloud Console 项目并获取凭证

要登录Gmail API,您需要获取凭据:客户端 ID客户端密钥刷新令牌。这些凭据可让您获取访问令牌,这是进一步请求(例如获取电子邮件列表或单个电子邮件等)所必需的。


步骤:

  1. Google Cloud Console中创建一个项目。


  2. “API 和服务”部分中创建OAuth 凭据如果需要进行自动化测试,最好选择此处的“桌面应用程序”)并下载它。


  3. 启用Gmail API


  4. 获取刷新令牌。


要获取刷新令牌 - 只需在项目根目录中执行命令:

 npx gmail-getter get-refresh-token


(或者其他任何地方,如果你已经全局安装了该软件包)

 get-refresh-token


您必须将credentials.json文件放在将执行命令的位置。


⚠️凭证文件名区分大小写⚠️

获取访问令牌

配置完成后,您必须在自动化测试中获取访问令牌。我想说它的最佳位置是全局设置(在测试运行开始之前执行的函数)。


所以,它会是这样的:


 import {getToken} from 'gmail-getter' export default async function globalSetup() { process.env['ACCESS_TOKEN'] = await getToken( process.env.CLIENT_ID!, process.env.CLIENT_SECRET!, process.env.REFRESH_TOKEN! ) }


上面的示例使用环境变量,为此您肯定还需要安装dotenv包。


但是,如果您想让事情变得简单 - 您可以在任何需要访问令牌的地方使用此代码片段:


 const accessToken = await getToken( '<put-your-client-id-here>', '<put-your-client-secret-here>', '<put-your-refresh-token-here>' )

获取电子邮件

目前, Gmail 的 REST API使用自己的查询语言来查找您需要的电子邮件:


 const email = await checkInbox(accessToken!, 15000, 1500, 'from:squier7 subject:Test!')


上面的命令返回一个电子邮件对象,但您仍然需要获取其内容或链接。替换from:squier7 subject:Test!按照上面链接中的语法进行您自己的查询☝️


您可以使用正则表达式解析链接:


 const link = parseLinkFromHtml(email!, /(https:\/\/)(\S*)(gmail-getter)([\w\/\?\=\-]*)/im)


/(https:\/\/)(\S*)(gmail-getter)([\w\/\?\=\-]*)/im为你自己的正则表达式 ☝️


或者获取电子邮件的完整 HTML 内容,并将其呈现在浏览器中:


 import {getToken, parseHtml} from 'gmail-getter' import {test} from '@playwright/test' test('Render an email', async ({page}) => { const accessToken = await getToken( '<put-your-client-id-here>', '<put-your-client-secret-here>', '<put-your-refresh-token-here>' ) const email = await checkInbox(accessToken!, 15000, 1500, 'from:squier7 subject:Test!') // get an email const html = parseHtml(email!) // parse HTML from the email await page.setContent(html) // render the email in the browser })

全面的

我认为现在很明显,在自动化测试中使用电子邮件可能很棘手!但了解这些技巧会让事情变得容易得多。


您可能仍然会使用其他一些电子邮件服务或尝试IMAP ,但我向您保证 - 它不会像本指南中那样容易,因为您需要创建自己的帮助程序,例如提供的gmail-getter这里。


您可以在GitHub上找到Playwright 示例柏树也是一个例子