Dinoer

Le formulaire annonce un succès et ne part jamais

Le clic réussit, le scénario se termine sans erreur, et le serveur n'a rien reçu. Deux causes différentes donnent ce même résultat, et la solution de l'une ne règle pas l'autre.

Le symptôme. Vous remplissez un formulaire, cliquez sur le bouton d’envoi, obtenez succes: true, et la cible n’a pas changé. En relisant la page, vous retrouvez la même page, jamais le résultat attendu.

Deux causes sans rapport donnent ce même résultat. Distinguez-les avant de choisir une solution.

Cause 1 : le navigateur a bloqué l’envoi

La validation HTML5. Un champ marqué required est vide, ou un champ type="email" contient autre chose qu’une adresse. Le navigateur refuse d’envoyer le formulaire et affiche un petit message à côté du champ.

Dinoer annonce le clic comme réussi, parce qu’il l’est : le clic a eu lieu. C’est le navigateur qui a refusé d’y donner suite.

Comment le reconnaître. Rien n’a été envoyé, donc rien ne se charge : dans latences_actions, un attendre_navigation placé juste après le clic rend la main aussitôt. Pour savoir quels champs bloquent, interrogez la page :

{"type": "evaluer",
 "script": "Array.from(document.querySelectorAll(':invalid')).map(e => e.name || e.id)"}

La solution. Remplissez le champ manquant. S’il doit rester vide volontairement, envoyez le formulaire directement, ce qui contourne la validation native :

{"type": "evaluer",
 "script": "document.querySelector('#my-form').submit()"}

Cause 2 : un clic JavaScript n’est pas le clic d’un utilisateur

Appeler .click() sur un bouton d’envoi depuis JavaScript produit un événement marqué isTrusted: false. Les scripts de la page peuvent ignorer ou annuler un tel événement, et certains le font : le scénario se termine sur succes: true et le formulaire n’est jamais parti.

{"type": "evaluer",
 "script": "document.querySelector('input[name=upgrade]').click()"}

La solution. Préférez un vrai cliquer sur le bouton : le clic de Playwright est traité comme celui d’un utilisateur. Depuis evaluer, envoyez le formulaire lui-même :

{"type": "evaluer",
 "script": "document.querySelector('input[value=\"theme-slug\"]').closest('form').requestSubmit()"}

requestSubmit() exécute la validation et les gestionnaires submit du formulaire, comme un envoi par un utilisateur. submit() saute les deux : ne l’utilisez que si vous savez que le formulaire part directement vers le serveur.

La règle à retenir

Pour envoyer un formulaire, préférez cliquer sur le bouton. Depuis evaluer, appelez requestSubmit() sur le formulaire, jamais .click() sur le bouton.

Avant de conclure

Un envoi qui semble avoir échoué a peut-être réussi. Une requête lente (un import, une copie, tout ce qui prend quelques dizaines de secondes) peut dépasser le délai d’attente pendant que le serveur poursuit et termine le travail. Un TimeoutError sur un clic signifie que Playwright a cessé d’attendre, pas que rien ne s’est passé.

Vérifiez la cible avant de relancer, sans quoi vous exécuterez l’opération deux fois. L’opération qui prend du temps →

En bref

  • Deux causes, un seul symptôme : la validation native a bloqué le formulaire, ou un .click() JavaScript a été ignoré.
  • evaluer avec :invalid liste les champs qui bloquent.
  • Préférez cliquer ; depuis evaluer, requestSubmit() sur le formulaire.
  • Un délai dépassé n’est pas un échec : vérifiez avant de relancer.