Selenium i pytest: odbieranie wiadomości w teście

« Blog · Autor:

Selenium klika, wypełnia i sprawdza — ale nie czyta poczty. Gdy aplikacja wysyła wiadomość potwierdzającą, test zatrzymuje się przed najważniejszą częścią scenariusza.

Rozwiązanie nie wymaga serwera pocztowego ani skrzynki firmowej. Wystarczą trzy wywołania HTTP.

Pomocnicze funkcje

Klucz dostępu trzymaj w zmiennej środowiskowej. W kodzie źródłowym nie ma czego szukać, a w repozytorium tym bardziej.

import os, re, time, requests

API  = "https://www.getsend.xyz/api/v1"
KOPF = {"Authorization": "Bearer " + os.environ["GETSEND_KEY"]}

def nowa_skrzynka():
    return requests.post(f"{API}/inboxes", headers=KOPF, timeout=10).json()

def czekaj_na_maila(box, proby=20, przerwa=3):
    lokal = box["address"].split("@")[0]
    for _ in range(proby):
        r = requests.get(f"{API}/inboxes/{lokal}/messages",
                         headers=KOPF, timeout=10).json()
        if r["count"]:
            mid = r["messages"][0]["id"]
            return requests.get(f"{API}/inboxes/{lokal}/messages/{mid}",
                                headers=KOPF, timeout=10).json()
        time.sleep(przerwa)
    raise AssertionError("Wiadomosc nie przyszla")

Test

def test_rejestracja_konczy_sie_potwierdzeniem(driver):
    box = nowa_skrzynka()

    driver.get("https://przyklad.pl/rejestracja")
    driver.find_element(By.ID, "email").send_keys(box["address"])
    driver.find_element(By.CSS_SELECTOR, "form").submit()

    mail = czekaj_na_maila(box)
    link = re.search(r"https?://\S+/confirm/\S+", mail["text"]).group(0)

    driver.get(link)
    assert "Konto potwierdzone" in driver.page_source

Jako utrwalacz pytest

Jeśli skrzynka przyda się w kilku testach, warto zrobić z niej utrwalacz. Zakres function daje każdemu testowi własny adres, co pozwala uruchamiać je równolegle.

import pytest

@pytest.fixture
def skrzynka():
    return nowa_skrzynka()

def test_reset_hasla(driver, skrzynka):
    ...

Pułapki, na które warto uważać

Nie używaj time.sleep(30) zamiast pętli. Sztywne czekanie jest albo za krótkie i test miga, albo za długie i zestaw testów rośnie o minuty przy każdym przebiegu.

Dopasuj wzorzec do konkretnej ścieżki. Powyższy szuka /confirm/. Zwykłe https?://\S+ złapie pierwszy odnośnik w treści, a tym bywa logo albo link do wypisania się ze stopki.

Czytaj pole text, nie html. W wersji HTML adres bywa poszatkowany znacznikami i wyrażenie regularne go nie znajdzie. Wersja tekstowa jest prostsza i stabilniejsza.

Ustaw limit czasu na zapytaniach. Bez timeout zawieszona sieć zatrzyma cały przebieg testów, a nie tylko jeden przypadek.

Ograniczenia

Wiadomości znikają po siedmiu dniach, limity to 60 nowych skrzynek i 3000 zapytań na godzinę na jeden klucz. Klucz odbierzesz na stronie API — bezpłatnie, bez konta.