El formulario informa de éxito y nunca se envía
El clic se realiza correctamente, el escenario termina en verde, y el servidor no recibe nada. Dos causas diferentes producen este resultado exacto, y la solución para una no resuelve la otra.
El síntoma. Usted rellena un formulario, hace clic en enviar, obtiene succes: true — y el
destino no cambia. Al leer la página después se muestra la misma página, o la
página de inicio, nunca la página de resultados que esperaba.
Dos causas no relacionadas producen este resultado idéntico. Distíngalas antes de buscar una solución, o aplicarás la incorrecta.
Causa 1: El navegador lo bloqueó y así lo indicó, pero de forma discreta
Validación HTML5. Un campo marcado con required está vacío, o un type="email" contiene algo que no lo es. El navegador rechaza el envío y muestra una pequeña ventana nativa: «Por favor, complete este campo», anclada al campo problemático.
Dinoer reporta el clic como exitoso, porque lo fue: el clic ocurrió. El navegador simplemente se negó a procesarlo.
Cómo reconocerlo. El attendre_navigation justo después del clic
regresa en aproximadamente 0 ms. No se navegó a ninguna parte porque no se envió nada. Lea el resultado de a11y_tree — el texto de la burbuja está presente en él, es fácil pasarlo por alto si solo verifica succes.
La solución. Complete el campo que falta. Si el campo debe permanecer vacío intencionalmente, envíe el formulario directamente y omita la validación nativa:
{"type": "evaluer",
"script": "document.querySelector('#my-form').submit()"}
Causa 2: Un clic en JavaScript no es una presentación
Este es más sorprendente. Llamar a .click() en un botón de envío desde JavaScript dispara el evento DOM click, pero no garantiza la transmisión HTTP del formulario padre. Los navegadores tratan un clic sintético de manera diferente a un clic realizado por el usuario, especialmente cuando se adjuntan manejadores de validación.
Observado durante una actualización real de un tema de WordPress: el proceso finalizó con error succes: true,
la página resultante mostraba la página de inicio de WordPress, y ningún tema se había
actualizado.
{"type": "evaluer",
"script": "document.querySelector('input[name=upgrade]').click()"}
La solución: siempre esta forma:
{"type": "evaluer",
"script": "document.querySelector('input[value=\"theme-slug\"]').closest('form').submit()"}
.closest('form').submit() llama al método de envío nativo del navegador
directamente. .click() en un botón de envío, pregunta amablemente; .submit() hace lo que debe hacerse.
La regla que vale la pena mantener
Para enviar un formulario desde
<code>evaluer</code>, siempre utilice<code>.closest('form').submit()</code>; nunca<code>.click()</code>en el botón de envío.
Y si usted no está en evaluer en absoluto, prefiera un cliquer real en el
botón: el clic nativo de Playwright se comporta como el de un usuario, que es exactamente
lo que uno sintético no hace.
Antes de que llegues a una conclusión
Una solicitud que parece haber fallado podría haber tenido éxito. Una petición POST lenta, un clon, una importación, cualquier proceso que tarde decenas de segundos, puede alcanzar el tiempo de espera mientras el servidor continúa y finaliza la tarea. TimeoutError en un clic significa que Playwright dejó de esperar, no que nada haya ocurrido.
Compruebe el objetivo antes de reintentar, o ejecutará la operación dos veces. La operación que tarda un rato →
En resumen
- Dos causas, un síntoma: la validación nativa lo bloqueó, o un JS
.click()que nunca envió el formulario. - ~0 ms en
attendre_navigationdespués del clic = nada fue enviado. - Desde
evaluer:.closest('form').submit(), siempre. - Un tiempo de espera no es un fallo; verifica antes de reintentar.