paint-brush
Как читать электронные письма Gmail с помощью драматургак@bormando
5,112 чтения
5,112 чтения

Как читать электронные письма Gmail с помощью драматурга

к Dmitrii Bormotov5m2023/12/10
Read on Terminal Reader

Слишком долго; Читать

Чтение электронных писем в автоматических тестах — это трюк, который вам может понадобиться во многих проектах. Это сложная задача, но не невозможная. Документация и библиотеки не очень удобны для пользователя (особенно для тех, кто мало занимается тестированием электронной почты). Пакет gmail-getter npm поможет вам сгенерировать токен доступа к Gmail REST API, получать электронные письма и отображать их в браузере.
featured image - Как читать электронные письма Gmail с помощью драматурга
Dmitrii Bormotov HackerNoon profile picture

Всем привет!


Чтение электронных писем в автоматических тестах — это трюк, который вам может понадобиться во многих проектах. Вот почему и как с этим бороться…

Почему это важно?

Что ж, если система отправляет электронные письма — вы можете проверить, что они отправляются и что их содержимое правильное, включая кликабельные ссылки.


Итак, это обычные сценарии, когда вам это нужно:

  1. Зарегистрироваться.

    Многие платформы отправляют электронное письмо с подтверждением после создания учетной записи, и вам нужно щелкнуть ссылку подтверждения в электронном письме.


  2. Счета-фактуры.

    Если ваше приложение осуществляет какие-либо платежи, они обычно отправляют чек или счет-фактуру по электронной почте, поэтому вам также может потребоваться проверить правильность их содержимого.


  3. Полученные результаты.

    Например, результаты медицинских анализов. По моему опыту, некоторые больницы отправляют электронное письмо с результатами анализов после их завершения (или, по крайней мере, ссылкой на личную страницу, где вы можете просмотреть отчет).



Конечно, это не полный список — это лишь те варианты использования, с которыми я встречался чаще всего за свою карьеру.


Если не проверить эти сценарии, пользователи могут не получать электронные письма или получать в них неверную информацию. В одном из проектов это помогло нам досрочно найти просроченный токен SendGrind .

Каковы сложности при чтении электронных писем в тестах?

Чтение электронных писем — дело непростое, но не невозможное.


Ранние почтовые клиенты использовали POP3 для получения электронной почты с сервера, но есть небольшая проблема: электронные письма удаляются с сервера после их загрузки.


Позже появился протокол IMAP — он позволяет просто читать электронную почту с сервера.


Проблема в - некоторые сервисы запрещают эти протоколы или заставить тебя подтвердить свою личность при первом подключении (например, при перезапуске автоматического теста).


С другой стороны, некоторые сервисы, такие как Gmail, предоставляют REST API для управления вашей электронной почтой, но есть еще одна проблема — документация и ее библиотеки не очень удобны для пользователя (особенно для тех, кто мало занимается тестированием электронной почты).


Здесь на помощь приходит gmail-getter — библиотека npm , которая позволяет вам читать электронные письма и даже открывать их в браузере, если вы используете инструменты автоматизации браузера, такие как Playwright .

Чтение писем Gmail с помощью Gmail-Getter

Первым делом — вам необходимо установить пакет в свой проект:

 npm install gmail-getter

Создайте проект Google Cloud Console и получите учетные данные.

Чтобы войти в Gmail API, вам необходимо получить учетные данные: идентификатор клиента , секрет клиента и токен обновления . Эти учетные данные позволяют вам получить токен доступа, который необходим для дальнейших запросов (например, для получения списка электронных писем или одного электронного письма и т. д.).


Шаги:

  1. Создайте проект в Google Cloud Console .


  2. Создайте учетные данные OAuth в разделе API и службы ( желательно выберите там настольное приложение, если оно вам нужно для автоматических тестов ) и загрузите его.


  3. Включите API Gmail .


  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>' )

Получать электронные письма

Прямо сейчас REST API Gmail использует собственный язык запросов для поиска нужного письма:


 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. здесь.


Пример Playwright вы можете найти на GitHub . Пример кипариса тоже.