大家好!
在自动化测试中阅读电子邮件是一个技巧,您可能需要知道如何在很多项目中做到这一点。这是原因以及如何处理它......
好吧,如果系统发送电子邮件 - 您可能需要验证它们是否正在发送并且内容是否正确,包括可点击的链接。
因此,当您需要此功能时,通常会出现以下情况:
报名。
许多平台在您创建帐户后都会发送一封确认电子邮件,您需要点击电子邮件中的确认链接。
发票。
如果您的应用进行任何付款 - 他们通常通过电子邮件发送支票或发票,因此您可能想查看其内容是否也正确。
结果。
就像医学检查结果一样。根据我的经验 - 一些医院在完成后会发送一封包含测试结果的电子邮件(或者至少是一个指向个人页面的链接,您可以在其中查看报告)。
……
当然,这不是完整的列表 - 这些只是我在职业生涯中遇到最多的用例。
如果无法验证这些情况,可能会导致用户收不到电子邮件或收到电子邮件中的错误信息。在其中一个项目中,它帮助我们尽早发现了过期的SendGrind代币。
阅读电子邮件是一件棘手的事情,但并非不可能。
早期的电子邮件客户端使用POP3从服务器获取电子邮件,但有一个小问题 - 一旦下载电子邮件,它就会从服务器中删除电子邮件。
后来, IMAP协议出现了 - 它允许您简单地从服务器读取电子邮件。
问题是 -
另一方面,像Gmail这样的一些服务提供了REST API来操作您的电子邮件,但还有另一个问题 - 文档及其库并不是真正的用户友好(特别是对于那些不经常进行电子邮件测试的人来说)。
这就是gmail-getter 的用武之地 - 一个npm库,它允许您阅读电子邮件,如果您使用Playwright等浏览器自动化工具,甚至可以在浏览器中打开它们。
首先,您需要在项目中安装该软件包:
npm install gmail-getter
要登录Gmail API,您需要获取凭据:客户端 ID 、客户端密钥和刷新令牌。这些凭据可让您获取访问令牌,这是进一步请求(例如获取电子邮件列表或单个电子邮件等)所必需的。
步骤:
在Google Cloud Console中创建一个项目。
在“API 和服务”部分中创建OAuth 凭据(如果需要进行自动化测试,最好选择此处的“桌面应用程序”)并下载它。
启用Gmail API 。
获取刷新令牌。
要获取刷新令牌 - 只需在项目根目录中执行命令:
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 示例。柏树也是一个例子。