¡Hola a todos!
Leer correos electrónicos en pruebas automatizadas es un truco que quizás necesites saber hacer en muchos proyectos. He aquí por qué y cómo afrontarlo...
Bueno, si el sistema envía correos electrónicos, es posible que desee verificar que se estén enviando y que el contenido sea correcto, incluidos los enlaces en los que se puede hacer clic.
Estos son los escenarios habituales cuando necesitas esto:
Inscribirse.
Muchas plataformas envían un correo electrónico de confirmación una vez que crea una cuenta y debe hacer clic en un enlace de confirmación del correo electrónico.
Facturas.
Si su aplicación realiza algún pago, generalmente envía un cheque o una factura por correo electrónico, por lo que es posible que desee ver si su contenido también es correcto.
Resultados.
Como resultados de pruebas médicas. En mi experiencia, algunos hospitales envían un correo electrónico con los resultados de las pruebas una vez realizadas (o al menos un enlace a una página personal donde puede ver el informe).
…
Por supuesto, esta no es la lista completa; estos son solo los casos de uso que más he conocido en mi carrera.
Si no se verifican estos escenarios, los usuarios podrían no recibir correos electrónicos o recibir información incorrecta en los correos electrónicos. En uno de los proyectos, nos ayudó a encontrar temprano un token de SendGrind vencido.
Leer correos electrónicos es algo complicado, pero no imposible.
Los primeros clientes de correo electrónico usaban POP3 para recuperar correos electrónicos del servidor, pero hay un pequeño problema: elimina los correos electrónicos del servidor una vez que se descargan.
Más tarde, apareció el protocolo IMAP , que le permite simplemente leer los correos electrónicos del servidor.
El problema es -
Por otro lado, algunos servicios como Gmail proporcionan una API REST para manipular sus correos electrónicos, pero hay otro problema: la documentación y sus bibliotecas no son tan fáciles de usar (especialmente para aquellos que no trabajan mucho con pruebas de correo electrónico).
Aquí es donde entra en juego gmail-getter : una biblioteca npm que le permite leer correos electrónicos e incluso abrirlos en su navegador si usa herramientas de automatización del navegador como Playwright .
Lo primero es lo primero: debe instalar el paquete en su proyecto:
npm install gmail-getter
Para iniciar sesión en la API de Gmail, necesita obtener credenciales: un ID de cliente , un Secreto de cliente y un token de actualización . Estas credenciales le permiten obtener un token de acceso, que se requiere en solicitudes posteriores (como obtener una lista de correos electrónicos o un solo correo electrónico, etc.).
Pasos a seguir:
Crea un proyecto en Google Cloud Console .
Cree credenciales de OAuth en la sección API y servicios ( preferiblemente, seleccione la aplicación de escritorio allí si la necesita para pruebas automatizadas ) y descárguela.
Habilite la API de Gmail .
Obtenga un token de actualización.
Para obtener un token de actualización, simplemente ejecute un comando en la raíz del proyecto:
npx gmail-getter get-refresh-token
(o en cualquier otro lugar si tienes el paquete instalado globalmente)
get-refresh-token
Debes colocar el archivo credentials.json
en un lugar donde ejecutarás el comando.
⚠️ el nombre del archivo de credenciales distingue entre mayúsculas y minúsculas ⚠️
Una vez realizada la configuración, deberás obtener un token de acceso en tus pruebas automatizadas. Yo diría que el mejor lugar para ello es una configuración global (una función que se ejecuta antes de que comience la ejecución de prueba).
Entonces, será algo como esto:
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! ) }
El ejemplo anterior utiliza variables de entorno, para las cuales definitivamente necesitarás instalar también el paquete dotenv .
Pero, si desea mantener las cosas simples, puede usar este fragmento donde necesite que se pueda acceder al token desde:
const accessToken = await getToken( '<put-your-client-id-here>', '<put-your-client-secret-here>', '<put-your-refresh-token-here>' )
En este momento, la API REST de Gmail utiliza su propio lenguaje de consulta para encontrar el correo electrónico que necesita:
const email = await checkInbox(accessToken!, 15000, 1500, 'from:squier7 subject:Test!')
El comando anterior le devuelve un objeto de correo electrónico, pero aún necesita obtener su contenido o un enlace. Reemplazar from:squier7 subject:Test!
a su propia consulta siguiendo la sintaxis del enlace de arriba ☝️
Puedes analizar un enlace usando una expresión regular :
const link = parseLinkFromHtml(email!, /(https:\/\/)(\S*)(gmail-getter)([\w\/\?\=\-]*)/im)
Reemplace /(https:\/\/)(\S*)(gmail-getter)([\w\/\?\=\-]*)/im
con su propia expresión regular ☝️
O obtenga todo el contenido HTML del correo electrónico y preséntelo en su navegador:
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 })
¡Creo que ahora es bastante obvio que trabajar con correos electrónicos en pruebas automatizadas puede ser complicado! Pero conocer estos trucos hace las cosas mucho más fáciles.
Es posible que aún utilices otros servicios de correo electrónico o pruebes IMAP , pero te lo garantizo: no será tan fácil como en esta guía, ya que necesitarás crear tu propio asistente, como el que proporciona Gmail-getter. aquí.
Puedes encontrar el ejemplo de Playwright en GitHub . Ejemplo de ciprés también.