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
cliquersur le bouton. Depuisevaluer, appelezrequestSubmit()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é. evalueravec:invalidliste les champs qui bloquent.- Préférez
cliquer; depuisevaluer,requestSubmit()sur le formulaire. - Un délai dépassé n’est pas un échec : vérifiez avant de relancer.