# Tester les e-mails avec Playwright · Facteur

> Un test Playwright qui attend l'e-mail de vérification au lieu de dormir : une requête reste ouverte jusqu'à l'arrivée du message, puis le test lit son code et ses liens.
> https://facteur.eu/fr/tester-les-emails-avec-playwright

/ Playwright

#  Votre test attend un e-mail, il ne dort pas 

 Un parcours d'inscription se termine dans une boîte aux lettres. Sans boîte que le test puisse lire, il ne reste que deux options : simuler l'envoi, ce qui ne prouve rien de la partie la plus fragile, ou boucler avec un délai fixe. Voici la troisième.

 [ Le guide complet sur le portail ](https://developers.facteur.eu/fr/guides/playwright/) [ Voir l'état des paquets ](/fr/integrations) 

 

 Le test en entier

## Rien n'est coupé

C'est le fichier complet, et il n'importe que Playwright.

 

       inscription.spec.ts TypeScript 

 

```
<span class="hl-keyword">import</span> { expect, test } <span class="hl-keyword">from</span> <span class="hl-value">'@playwright/test'</span>;

<span class="hl-keyword">const</span> INBOX = <span class="hl-value">'j3k9x2mq'</span>;

<span class="hl-comment">// Reste ouverte jusqu'à l'arrivée du message, trente secondes au plus.</span>
<span class="hl-keyword">async</span> <span class="hl-keyword">function</span> <span class="hl-property">attendre</span>(<span class="hl-property">sentTo</span>: <span class="hl-type">string</span>) {
  <span class="hl-keyword">const</span> search = <span class="hl-keyword">new</span> <span class="hl-type">URLSearchParams</span>({ <span class="hl-property">inbox</span>: <span class="hl-type">INBOX</span>, sentTo, <span class="hl-property">wait</span>: <span class="hl-value">'30000'</span> });
  <span class="hl-keyword">const</span> response = <span class="hl-keyword">await</span> <span class="hl-property">fetch</span>(<span class="hl-value">'https://api.facteur.eu/v1/messages?'</span> + search, {
    <span class="hl-property">headers</span>: { <span class="hl-property">authorization</span>: <span class="hl-value">'Bearer '</span> + process.<span class="hl-property">env</span>.<span class="hl-property">FACTEUR_API_KEY</span> },
  });
  <span class="hl-keyword">const</span> { messages } = <span class="hl-keyword">await</span> response.<span class="hl-property">json</span>();
  <span class="hl-keyword">if</span> (!messages[0]) <span class="hl-keyword">throw</span> <span class="hl-keyword">new</span> <span class="hl-type">Error</span>(<span class="hl-value">'Rien n\'est arrivé pour '</span> + sentTo);
  <span class="hl-keyword">return</span> messages[0];
}

<span class="hl-property">test</span>(<span class="hl-value">'le lien de vérification active le compte'</span>, <span class="hl-keyword">async</span> ({ page }) => {
  <span class="hl-keyword">const</span> tag = <span class="hl-value">'run-'</span> + <span class="hl-type">Date</span>.<span class="hl-property">now</span>();

  <span class="hl-comment">// Lancée avant le clic : elle répond dès que l'e-mail arrive.</span>
  <span class="hl-keyword">const</span> arrive = <span class="hl-property">attendre</span>(<span class="hl-value">'inscription+'</span> + tag);

  <span class="hl-keyword">await</span> page.<span class="hl-property">goto</span>(<span class="hl-value">'/inscription'</span>);
  <span class="hl-keyword">await</span> page.<span class="hl-property">getByLabel</span>(<span class="hl-value">'Email'</span>).<span class="hl-property">fill</span>(<span class="hl-value">'inscription+'</span> + tag + <span class="hl-value">'@'</span> + INBOX + <span class="hl-value">'.inbox.facteur.eu'</span>);
  <span class="hl-keyword">await</span> page.<span class="hl-property">getByRole</span>(<span class="hl-value">'button'</span>, { <span class="hl-property">name</span>: <span class="hl-value">'Créer mon compte'</span> }).<span class="hl-property">click</span>();

  <span class="hl-keyword">const</span> message = <span class="hl-keyword">await</span> arrive;

  <span class="hl-comment">// Le status avant tout champ tiré du corps du message.</span>
  <span class="hl-property">expect</span>(message.<span class="hl-property">status</span>).<span class="hl-property">toBe</span>(<span class="hl-value">'parsed'</span>);
  <span class="hl-keyword">await</span> page.<span class="hl-property">goto</span>(message.<span class="hl-property">links</span>[0]);

  <span class="hl-keyword">await</span> <span class="hl-property">expect</span>(page.<span class="hl-property">getByText</span>(<span class="hl-value">'Compte vérifié'</span>)).<span class="hl-property">toBeVisible</span>();
});
```

  

  La requête part avant le clic Elle reste ouverte et répond à l'instant où l'e-mail arrive, pas à l'échéance. Lancée après le clic, elle courrait après un message peut-être déjà traité. 

 Chaque test a son adresse Tout ce qui suit le « + » vous appartient et arrive quand même. Deux tests qui tournent en même temps ne se volent donc pas leurs e-mails, sans rien créer au préalable. 

 Le code est déjà extrait Le message arrive avec son code à usage unique dans le champ otp, et ses liens dans links. Vous ne réécrivez pas l'expression régulière qui traîne dans toutes les suites de tests. 

 On lit status avant tout le reste Un e-mail accepté existe un instant avant d'être lu : il n'a alors ni sujet, ni code. Ce champ sépare « pas de code dans ce message » de « le code n'est pas encore extrait ». 

  

 Pourquoi

## Pourquoi ce test tient en trente lignes

 

01

### L'attente se fait chez Facteur

Vous fixez un délai maximum, cinq minutes au plus, la requête reste ouverte, et elle répond dès l'arrivée. Votre test ne contient aucune boucle de relance, et rien à régler quand l'intégration continue ralentit.

 

02

### L'extraction se fait à la réception

Codes à usage unique et liens sont sortis du corps du message au moment où il arrive. Votre test lit un champ au lieu de découper du HTML.

 

03

### Les adresses sont illimitées

Toute adresse qui finit par le domaine de votre inbox arrive, sans appel d'API pour la créer. C'est ce qui rend une adresse par test gratuite.

 



 

 

 Le plugin Playwright

## Écrit, pas encore publié

playwright-facteur calcule une adresse par test, rejoue ses assertions comme Playwright et attache le message reçu au rapport. Il n'est pas encore publié sur npm. Le test ci-dessus ne l'utilise pas, et continuera de marcher le jour où il le sera : le plugin fera gagner du confort, pas des capacités.

 

 [ Voir l'état des paquets ](/fr/integrations) 

 

 

## Écrivez ce test aujourd'hui

L'offre gratuite ouvre une inbox, sans carte bancaire. Le temps de créer un compte, vous avez l'adresse à mettre dans le test ci-dessus.

 [ Créer un compte gratuit ](/fr/inscription) [ Comment migrer ](/fr/migrer)
