El formulario informa de éxito y nunca se envía
El clic funciona, el escenario termina en verde, y el servidor no ha recibido nada. Dos causas distintas producen exactamente este resultado — y la solución de una no arregla la otra.
El síntoma. Rellena un formulario, pulsa enviar, obtiene succes: true — y
el destino no ha cambiado. La captura tomada después muestra la misma página, o
la portada, nunca la página de resultado que esperaba.
Dos causas sin relación producen este mismo resultado. Distíngalas antes de buscar una solución, o aplicará la equivocada.
Causa 1 — el navegador lo bloqueó, y lo dijo en voz baja
La validación HTML5. Un campo marcado required está vacío, o un
type="email" contiene algo que no es una dirección. El navegador rechaza el
envío y muestra un pequeño globo nativo — Rellene este campo — sujeto al
campo culpable.
Diwall informa del clic como correcto, porque lo fue: el clic ocurrió. El navegador simplemente se negó a darle curso.
Cómo reconocerlo. El attendre_navigation justo después del clic vuelve en
~0 ms. No se navegó a ninguna parte porque no se envió nada. Y el globo está en
la captura, pequeño, fácil de pasar por alto — mire la captura a tamaño real
antes de sacar conclusiones.
La solución. Rellene el campo que falta. Si el campo debe quedar vacío a propósito, envíe el formulario directamente y sáltese la validación nativa:
{"type": "evaluer",
"script": "document.querySelector('#my-form').submit()"}
Causa 2 — un clic JavaScript no es un envío
Esta sorprende más. Llamar a .click() desde JavaScript sobre un botón de envío
dispara el evento DOM click, pero no garantiza el envío HTTP del formulario
que lo contiene. Los navegadores tratan un clic sintético de otra manera que un
clic de usuario, sobre todo cuando hay manejadores de validación.
Observado en una actualización real de tema en un gestor de contenidos: el
escenario terminó con succes: true, la captura mostraba la portada del sitio y
ningún tema se había actualizado.
{"type": "evaluer",
"script": "document.querySelector('input[name=upgrade]').click()"}
La solución — siempre de esta forma:
{"type": "evaluer",
"script": "document.querySelector('input[value=\"theme-slug\"]').closest('form').submit()"}
.closest('form').submit() llama directamente al método de envío nativo del
navegador. .click() sobre un botón de envío lo pide por favor; .submit() lo
hace.
La regla que conviene guardar
Para enviar un formulario desde
evaluer, use siempre.closest(‘form’).submit()— nunca.click()sobre el botón de envío.
Y si no está en evaluer, prefiera un cliquer real sobre el botón: el clic
nativo de Playwright se comporta como el de un usuario, que es justo lo que no
hace un clic sintético.
Antes de concluir
Un envío que parece haber fallado puede haber funcionado. Un POST lento — un
clon, una importación, cualquier cosa que tarde decenas de segundos — puede
agotar el tiempo de espera mientras el servidor sigue y termina el trabajo. Un
TimeoutError en un clic significa que Playwright dejó de esperar, no que no
pasara nada.
Compruebe el destino antes de reintentar, o ejecutará la operación dos veces. La operación que dura varios minutos →
En resumen
- Dos causas, un síntoma: la validación nativa lo bloqueó, o un
.click()JavaScript nunca envió nada. - ~0 ms en
attendre_navigationtras el clic = no se envió nada. - Desde
evaluer:.closest('form').submit(), siempre. - Un tiempo agotado no es un fallo — compruebe antes de reintentar.