Hallo zusammen!
Das Lesen von E-Mails in automatisierten Tests ist ein Trick, den Sie in vielen Projekten beherrschen müssen. Hier erfahren Sie, warum und wie Sie damit umgehen können …
Wenn das System E-Mails sendet, möchten Sie möglicherweise überprüfen, ob diese gesendet werden und ob der Inhalt korrekt ist, einschließlich anklickbarer Links.
Dies sind also die üblichen Szenarios, wenn Sie Folgendes benötigen:
Melden Sie sich an.
Viele Plattformen senden eine Bestätigungs-E-Mail, sobald Sie ein Konto erstellt haben, und Sie müssen in der E-Mail auf einen Bestätigungslink klicken.
Rechnungen.
Wenn Ihre App Zahlungen ausführt, sendet sie normalerweise einen Scheck oder eine Rechnung per E-Mail. Daher möchten Sie möglicherweise auch prüfen, ob deren Inhalt korrekt ist.
Ergebnisse.
Wie medizinische Testergebnisse. Meiner Erfahrung nach senden einige Krankenhäuser eine E-Mail mit den Testergebnissen, sobald sie fertig sind (oder zumindest einen Link zu einer persönlichen Seite, auf der Sie den Bericht einsehen können).
…
Natürlich ist dies nicht die vollständige Liste – das sind nur die Anwendungsfälle, die mir in meiner Karriere am häufigsten begegnet sind.
Wenn diese Szenarien nicht überprüft werden, kann dies dazu führen, dass Benutzer keine E-Mails erhalten oder falsche Informationen in E-Mails erhalten. In einem der Projekte hat es uns geholfen, einen abgelaufenen SendGrind- Token frühzeitig zu finden.
Das Lesen von E-Mails ist eine schwierige, aber keine unmögliche Sache.
Frühe E-Mail-Clients verwendeten POP3, um E-Mails vom Server abzurufen, es gibt jedoch ein kleines Problem: Die E-Mails werden nach dem Herunterladen vom Server gelöscht.
Später kam das IMAP- Protokoll hinzu – es ermöglicht das einfache Lesen von E-Mails vom Server.
Das Problem ist -
Andererseits bieten einige Dienste wie Gmail eine REST-API zum Bearbeiten Ihrer E-Mails, aber es gibt noch ein weiteres Problem: Die Dokumentation und ihre Bibliotheken sind nicht wirklich benutzerfreundlich (insbesondere für diejenigen, die nicht viel mit E-Mail-Tests arbeiten).
Hier kommt gmail-getter ins Spiel – eine NPM- Bibliothek, die es Ihnen ermöglicht, E-Mails zu lesen und sie sogar in Ihrem Browser zu öffnen, wenn Sie Browser-Automatisierungstools wie Playwright verwenden.
Das Wichtigste zuerst: Sie müssen das Paket in Ihrem Projekt installieren:
npm install gmail-getter
Um sich bei der Gmail-API anzumelden, müssen Sie Anmeldeinformationen erhalten: eine Client-ID , ein Client-Geheimnis und ein Aktualisierungstoken . Mit diesen Anmeldeinformationen können Sie ein Zugriffstoken erhalten, das für weitere Anfragen erforderlich ist (z. B. das Abrufen einer Liste von E-Mails oder einer einzelnen E-Mail usw.).
Weitere Schritte:
Erstellen Sie ein Projekt in der Google Cloud Console .
Erstellen Sie OAuth-Anmeldeinformationen im Abschnitt „API & Dienste“ ( wählen Sie dort vorzugsweise die Desktop- App aus, wenn Sie sie für automatisierte Tests benötigen ) und laden Sie sie herunter.
Aktivieren Sie die Gmail-API .
Besorgen Sie sich ein Aktualisierungstoken.
Um ein Aktualisierungstoken zu erhalten, führen Sie einfach einen Befehl in einem Projektstammverzeichnis aus:
npx gmail-getter get-refresh-token
(oder irgendwo anders, wenn Sie das Paket global installiert haben)
get-refresh-token
Sie müssen die Datei credentials.json
an einem Ort ablegen, an dem Sie den Befehl ausführen.
⚠️ Beim Namen der Anmeldeinformationsdatei wird die Groß-/Kleinschreibung beachtet ⚠️
Sobald die Konfiguration abgeschlossen ist, müssen Sie in Ihren automatisierten Tests ein Zugriffstoken erhalten. Ich würde sagen, dass der beste Ort dafür ein globales Setup ist (eine Funktion, die ausgeführt wird, bevor der Testlauf beginnt).
Es wird also etwa so aussehen:
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! ) }
Das obige Beispiel verwendet Umgebungsvariablen, für die Sie unbedingt auch das Paket dotenv installieren müssen.
Wenn Sie es jedoch einfach halten möchten, können Sie dieses Snippet überall dort verwenden, wo Sie den Zugriff auf das Token benötigen:
const accessToken = await getToken( '<put-your-client-id-here>', '<put-your-client-secret-here>', '<put-your-refresh-token-here>' )
Derzeit verwendet die REST-API von Gmail eine eigene Abfragesprache , um die benötigte E-Mail zu finden:
const email = await checkInbox(accessToken!, 15000, 1500, 'from:squier7 subject:Test!')
Der obige Befehl gibt Ihnen ein E-Mail-Objekt zurück, Sie müssen jedoch entweder dessen Inhalt oder einen Link abrufen. Ersetzen from:squier7 subject:Test!
zu Ihrer eigenen Abfrage, indem Sie der Syntax aus dem obigen Link folgen ☝️
Sie können einen Link mit einem regulären Ausdruck analysieren:
const link = parseLinkFromHtml(email!, /(https:\/\/)(\S*)(gmail-getter)([\w\/\?\=\-]*)/im)
Ersetzen /(https:\/\/)(\S*)(gmail-getter)([\w\/\?\=\-]*)/im
durch Ihren eigenen regulären Ausdruck ☝️
ODER rufen Sie den gesamten HTML-Inhalt der E-Mail ab und rendern Sie ihn in Ihrem Browser:
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 })
Ich denke, es ist jetzt ziemlich offensichtlich, dass die Arbeit mit E-Mails in automatisierten Tests schwierig sein kann! Aber die Kenntnis dieser Tricks macht die Sache viel einfacher.
Möglicherweise nutzen Sie noch einige andere E-Mail-Dienste oder versuchen es mit IMAP , aber ich garantiere Ihnen, dass es nicht so einfach sein wird wie in dieser Anleitung, da Sie einen eigenen Helfer erstellen müssten, wie z. B. den von gmail-getter bereitgestellten Hier.
Das Playwright-Beispiel finden Sie auf GitHub . Zypressenbeispiel auch.