# Recevoir un email dans un test Playwright · Facteur

> Le test complet qui attend un email, lit le code qu'il contient et poursuit le parcours, sans sleep. Le plugin Playwright n'est pas encore publié.
> https://facteur.eu/fr/aide/tests-playwright

Rechercher dans l'aide Ctrl K   Rechercher dans l'aide  



Tapez au moins deux caractères.

  

 

 #  Recevoir un email dans un test Playwright 

 Le test complet qui attend un email, lit le code qu'il contient et poursuit le parcours, sans sleep. Le plugin Playwright n'est pas encore publié.

 Mis à jour le 17 octobre 2026 

Un parcours d'inscription se termine dans une boîte mail, et votre test doit lire ce qui y arrive. Voici le fichier entier. Il appelle l'API directement avec une clé : **le plugin Playwright de Facteur n'est pas encore publié**, donc il n'y a aucun paquet à installer, et celui-ci n'en a pas besoin.

## Avant de commencer

Deux choses, et rien d'autre :

1. **Une clé d'API en lecture seule.** Créez-la dans [**Paramètres → Clés d'API**](https://app.facteur.eu/settings/api-keys)et mettez-la dans les secrets de votre intégration continue, sous `FACTEUR_API_KEY`. Le test ci-dessous ne crée rien : il lit. Voir [Clés d'API](/fr/aide/cles-api).
2. **L'identifiant de votre inbox**, les huit caractères qui précèdent `.inbox` dans son adresse de réception.

```ts
<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> KEY = process.<span class="hl-property">env</span>.<span class="hl-property">FACTEUR_API_KEY</span>!;
<span class="hl-keyword">const</span> INBOX = <span class="hl-value">'j3k9x2mq'</span>;

<span class="hl-comment">/** Reste ouvert jusqu'à l'arrivée du message, vingt secondes au plus. */</span>
<span class="hl-keyword">const</span> attendre = <span class="hl-keyword">async</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">'20000'</span> });
  <span class="hl-keyword">const</span> response = <span class="hl-keyword">await</span> <span class="hl-property">fetch</span>(`<span class="hl-property">https</span>:<span class="hl-comment">//api.facteur.eu/v1/messages?${search}`, {</span>
    <span class="hl-property">headers</span>: { <span class="hl-property">authorization</span>: `Bearer ${KEY}` },
  });
  <span class="hl-keyword">if</span> (!response.<span class="hl-property">ok</span>) <span class="hl-keyword">throw</span> <span class="hl-keyword">new</span> <span class="hl-type">Error</span>(`Facteur a répondu ${response.<span class="hl-property">status</span>}`);

  <span class="hl-keyword">return</span> response.<span class="hl-property">json</span>();
};

<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 = `run-${<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'email arrive.</span>
  <span class="hl-keyword">const</span> arrive = <span class="hl-property">attendre</span>(`inscription+${tag}`);

  <span class="hl-comment">// Le parcours d'inscription de VOTRE application.</span>
  <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>(`inscription+${tag}@${INBOX}.<span class="hl-property">inbox</span>.<span class="hl-property">facteur</span>.<span class="hl-property">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> { messages } = <span class="hl-keyword">await</span> arrive;
  <span class="hl-property">expect</span>(messages[0].<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>(messages[0].<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>();
});

```

## Lancez l'attente avant l'action

C'est la seule ligne dont l'ordre compte. La requête part avant le clic, reste ouverte, et répond à l'instant où l'email arrive. Lancée après, elle courrait après un message peut-être déjà traité, et vous verriez ce défaut le jour où votre intégration continue devient lente.

## Une adresse par test, sans rien créer

Toute adresse qui finit par le domaine de votre inbox y arrive. Vous n'avez donc pas d'appel à faire pour créer `inscription+run-1734@j3k9x2mq.inbox.facteur.eu` : il suffit de l'écrire. C'est ce qui permet à seize tests parallèles de partager une inbox sans se voler leurs emails. Une organisation peut garder vingt attentes ouvertes à la fois : au-delà, la réponse est `429 TOO_MANY_WAITS`.

Mettez le nom du test et le numéro de tentative dans l'étiquette. Sans le numéro, un test rejoué relit l'email de sa première tentative et passe pour une mauvaise raison, précisément quand quelque chose est déjà instable.

## Lisez `status` avant tout le reste

Un email accepté existe avant d'être analysé. Pendant quelques millisecondes il n'a ni sujet, ni code, ni liens. Le champ `status` sépare « il n'y a pas de code dans ce message » de « le code n'est pas encore extrait ». La recherche ne rend que des messages analysés par défaut, donc le cas ne se présente que si vous demandez `status: any`.

## Le code est déjà sorti du message

`messages[0].otp` porte le code à usage unique, extrait à la réception. Vous n'écrivez aucune expression régulière, et vous n'avez rien à corriger le jour où le gabarit d'email change.

Les liens sont là aussi : `messages[0].links` en porte la liste, dans l'ordre où ils apparaissent, chacun sous forme de texte. Passez-en un directement à `page.goto()`.

## Le plugin Playwright

Un plugin est prévu : il écrirait à votre place l'adresse de chaque test et l'attente du message. Il n'est pas encore publié et nous n'annonçons pas de date. Le test ci-dessus continuera de fonctionner le jour où il sortira.

 

  Cet article ne répond pas à votre question ? Écrivez à l'équipe : elle saura de quel article vous venez.

 [ Écrire au support ](https://app.facteur.eu/support?article=tests-playwright)
