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_navigationaprè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.