Diwall

Español
Descargar 1.24.4

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_navigation tras el clic = no se envió nada.
  • Desde evaluer: .closest('form').submit(), siempre.
  • Un tiempo agotado no es un fallo — compruebe antes de reintentar.