Diwall

Français
Télécharger 1.24.4

Le formulaire annonce un succès et n’est jamais envoyé

Le clic réussit, le scénario finit au vert, et le serveur n’a rien reçu. Deux causes différentes produisent exactement ce résultat — et le remède de l’une ne guérit pas l’autre.

Le symptôme. Vous remplissez un formulaire, cliquez sur l’envoi, obtenez succes: true — et la cible n’a pas changé. La capture prise ensuite montre la même page, ou l’accueil, jamais la page de résultat attendue.

Deux causes sans rapport produisent ce même résultat. Distinguez-les avant de chercher un remède, sans quoi vous appliquerez le mauvais.

Cause 1 — le navigateur l’a bloqué, et l’a dit tout bas

La validation HTML5. Un champ marqué required est vide, ou un type="email" contient autre chose qu’une adresse. Le navigateur refuse l’envoi et affiche une petite bulle native — Veuillez renseigner ce champ — accrochée au champ fautif.

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

Comment le reconnaître. L’attendre_navigation placé juste après le clic revient en ~0 ms. Rien n’a navigué, parce que rien n’est parti. Et la bulle est sur la capture, petite, facile à manquer — regardez la capture en taille réelle avant de conclure quoi que ce soit.

Le remède. Remplissez le champ manquant. Si le champ doit rester vide exprès, envoyez directement le formulaire en contournant la validation native :

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

Cause 2 — un clic JavaScript n’est pas un envoi

Celle-ci surprend davantage. Appeler .click() depuis JavaScript sur un bouton d’envoi déclenche l’événement DOM click mais ne garantit pas l’envoi HTTP du formulaire parent. Les navigateurs traitent un clic synthétique autrement qu’un clic d’utilisateur, surtout quand des gestionnaires de validation y sont attachés.

Constaté lors d’une vraie mise à jour de thème dans un système de gestion de contenu : le scénario s’est terminé succes: true, la capture montrait l’accueil du site, et aucun thème n’avait été mis à jour.

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

Le remède — toujours sous cette forme :

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

.closest('form').submit() appelle directement la méthode d’envoi native du navigateur. .click() sur un bouton d’envoi demande poliment ; .submit() fait la chose.

La règle à retenir

Pour envoyer un formulaire depuis evaluer, utilisez toujours .closest(‘form’).submit() — jamais .click() sur le bouton d’envoi.

Et si vous n’êtes pas du tout dans evaluer, préférez un vrai cliquer sur le bouton : le clic natif de Playwright se comporte comme celui d’une personne, ce que justement un clic synthétique ne fait pas.

Avant de conclure

Un envoi qui semble avoir échoué a peut-être réussi. Un POST lent — un clone, un import, tout ce qui prend des dizaines de secondes — peut dépasser le délai pendant que le serveur continue et termine le travail. Un TimeoutError sur un clic veut dire que Playwright a cessé d’attendre, pas qu’il ne s’est rien passé.

Vérifiez la cible avant de réessayer, sous peine d’exécuter l’opération deux fois. L’opération qui dure plusieurs minutes →

En bref

  • Deux causes, un symptôme : la validation native a bloqué l’envoi, ou un .click() JavaScript n’a jamais envoyé.
  • ~0 ms sur attendre_navigation après le clic = rien n’est parti.
  • Depuis evaluer : .closest('form').submit(), toujours.
  • Un délai dépassé n’est pas un échec — vérifiez avant de réessayer.