Всем привет!
Чтение электронных писем в автоматических тестах — это трюк, который вам может понадобиться во многих проектах. Вот почему и как с этим бороться…
Что ж, если система отправляет электронные письма — вы можете проверить, что они отправляются и что их содержимое правильное, включая кликабельные ссылки.
Итак, это обычные сценарии, когда вам это нужно:
Зарегистрироваться.
Многие платформы отправляют электронное письмо с подтверждением после создания учетной записи, и вам нужно щелкнуть ссылку подтверждения в электронном письме.
Счета-фактуры.
Если ваше приложение осуществляет какие-либо платежи, они обычно отправляют чек или счет-фактуру по электронной почте, поэтому вам также может потребоваться проверить правильность их содержимого.
Полученные результаты.
Например, результаты медицинских анализов. По моему опыту, некоторые больницы отправляют электронное письмо с результатами анализов после их завершения (или, по крайней мере, ссылкой на личную страницу, где вы можете просмотреть отчет).
…
Конечно, это не полный список — это лишь те варианты использования, с которыми я встречался чаще всего за свою карьеру.
Если не проверить эти сценарии, пользователи могут не получать электронные письма или получать в них неверную информацию. В одном из проектов это помогло нам досрочно найти просроченный токен SendGrind .
Чтение электронных писем — дело непростое, но не невозможное.
Ранние почтовые клиенты использовали POP3 для получения электронной почты с сервера, но есть небольшая проблема: электронные письма удаляются с сервера после их загрузки.
Позже появился протокол IMAP — он позволяет просто читать электронную почту с сервера.
Проблема в -
С другой стороны, некоторые сервисы, такие как Gmail, предоставляют REST API для управления вашей электронной почтой, но есть еще одна проблема — документация и ее библиотеки не очень удобны для пользователя (особенно для тех, кто мало занимается тестированием электронной почты).
Здесь на помощь приходит gmail-getter — библиотека npm , которая позволяет вам читать электронные письма и даже открывать их в браузере, если вы используете инструменты автоматизации браузера, такие как Playwright .
Первым делом — вам необходимо установить пакет в свой проект:
npm install gmail-getter
Чтобы войти в Gmail API, вам необходимо получить учетные данные: идентификатор клиента , секрет клиента и токен обновления . Эти учетные данные позволяют вам получить токен доступа, который необходим для дальнейших запросов (например, для получения списка электронных писем или одного электронного письма и т. д.).
Шаги:
Создайте проект в Google Cloud Console .
Создайте учетные данные OAuth в разделе API и службы ( желательно выберите там настольное приложение, если оно вам нужно для автоматических тестов ) и загрузите его.
Включите API Gmail .
Получите токен обновления.
Чтобы получить токен обновления, просто выполните команду в корне проекта:
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 . Пример кипариса тоже.