MoeMail
ブログに戻る

Selenium によるメールテスト

Selenium はブラウザを操作しますが、メールのステップでは、テストから読めるルーティング可能な受信トレイが必要です。この Selenium メールテストガイドでは、Python と使い捨ての受信トレイ API を使います。Playwright 版や Cypress 版もあり、いずれも開発者のためのメールテストの一部です。

受信トレイ用ヘルパー

import os, time, requests
from selenium import webdriver
from selenium.webdriver.common.by import By

API = "https://moemail.app/api"
H = {"X-API-Key": os.environ["MAIL_KEY"]}

def create_inbox():
    return requests.post(API + "/emails/generate", headers=H).json()

def wait_for_email(inbox_id, timeout=30):
    end = time.time() + timeout
    while time.time() < end:
        msgs = requests.get(API + "/emails/" + inbox_id + "/messages", headers=H).json()["messages"]
        if msgs:
            return msgs[0]
        time.sleep(1.5)
    raise TimeoutError("no email arrived")

テスト本体

import re

def test_signup_verification():
    inbox = create_inbox()
    driver = webdriver.Chrome()
    driver.get("https://example.test/signup")
    driver.find_element(By.ID, "email").send_keys(inbox["address"])
    driver.find_element(By.CSS_SELECTOR, "button[type=submit]").click()

    msg = wait_for_email(inbox["id"])
    code = re.search("[0-9]{6}", msg["text"]).group(0)
    driver.find_element(By.ID, "code").send_keys(code)
    assert "Welcome" in driver.page_source
    driver.quit()

ページ要素には明示的な待機を、メールにはポーリングヘルパーを使いましょう。正規表現 [0-9]{6} は 6 桁のコードを取り出します。リンクが対象なら、代わりに URL を検索して driver.get() に渡してください。

ヒント

テストごとに受信トレイをひとつにすれば実行が隔離されます。速度面ではポーリングより webhook が勝ります。メールボックスを作成し、OpenAPI ドキュメントを確認してみてください。