Das Formular meldet Erfolg und wird nie gesendet
Der Klick gelingt, das Szenario endet ohne Fehler, und der Server hat nichts erhalten. Zwei verschiedene Ursachen führen zu diesem Ergebnis, und die Lösung der einen behebt die andere nicht.
Das Symptom. Sie füllen ein Formular aus, klicken auf Absenden, erhalten
succes: true, und das Ziel ist unverändert. Liest man die Seite danach,
sieht man dieselbe Seite, nie das erwartete Ergebnis.
Zwei voneinander unabhängige Ursachen führen zu diesem Ergebnis. Unterscheiden Sie sie, bevor Sie eine Lösung wählen.
Ursache 1: Der Browser hat das Absenden blockiert
HTML5-Validierung. Ein als required markiertes Feld ist leer, oder ein Feld
type="email" enthält etwas, das keine Adresse ist. Der Browser weigert sich,
das Formular zu senden, und zeigt neben dem Feld eine kleine Meldung.
Dinoer meldet den Klick als erfolgreich, denn er war es: Der Klick hat stattgefunden. Der Browser hat nur nicht darauf reagiert.
Woran Sie es erkennen. Es wurde nichts gesendet, also lädt nichts: In
latences_actions kehrt ein attendre_navigation direkt nach dem Klick
sofort zurück. Welche Felder blockieren, verrät die Seite selbst:
{"type": "evaluer",
"script": "Array.from(document.querySelectorAll(':invalid')).map(e => e.name || e.id)"}
Die Lösung. Füllen Sie das fehlende Feld aus. Muss es absichtlich leer bleiben, senden Sie das Formular direkt, was die native Validierung umgeht:
{"type": "evaluer",
"script": "document.querySelector('#my-form').submit()"}
Ursache 2: Ein JavaScript-Klick ist kein Klick eines Nutzers
Ein .click() auf eine Absende-Schaltfläche aus JavaScript erzeugt ein
Ereignis mit isTrusted: false. Skripte der Seite können ein solches
Ereignis ignorieren oder abbrechen, und manche tun es: Das Szenario endet mit
succes: true, und das Formular wurde nie gesendet.
{"type": "evaluer",
"script": "document.querySelector('input[name=upgrade]').click()"}
Die Lösung. Nehmen Sie lieber ein echtes cliquer auf die Schaltfläche:
Der Klick von Playwright wird wie der eines Nutzers behandelt. Aus evaluer
heraus senden Sie das Formular selbst:
{"type": "evaluer",
"script": "document.querySelector('input[value=\"theme-slug\"]').closest('form').requestSubmit()"}
requestSubmit() führt die Validierung und die eigenen submit-Handler des
Formulars aus, wie beim Absenden durch einen Nutzer. submit() überspringt
beides: Verwenden Sie es nur, wenn Sie wissen, dass das Formular direkt an den
Server geht.
Die Regel, die man behalten sollte
Um ein Formular zu senden, nehmen Sie lieber
cliquerauf die Schaltfläche. Ausevaluerrufen SierequestSubmit()am Formular auf, nie.click()an der Schaltfläche.
Bevor Sie einen Schluss ziehen
Ein Absenden, das gescheitert scheint, kann gelungen sein. Eine langsame
Anfrage (ein Import, eine Kopie, alles, was einige Dutzend Sekunden dauert)
kann das Zeitlimit überschreiten, während der Server weiterarbeitet und fertig
wird. Ein TimeoutError bei einem Klick heißt, dass Playwright aufgehört hat
zu warten, nicht dass nichts geschehen ist.
Prüfen Sie das Ziel, bevor Sie es erneut versuchen, sonst läuft die Operation zweimal. Die Operation, die dauert →
Kurz gesagt
- Zwei Ursachen, ein Symptom: Die native Validierung hat das Formular
blockiert, oder ein JavaScript-
.click()wurde ignoriert. evaluermit:invalidlistet die blockierenden Felder auf.- Nehmen Sie lieber
cliquer; ausevaluerherausrequestSubmit()am Formular. - Ein Zeitlimit ist kein Fehlschlag: Prüfen Sie, bevor Sie es erneut versuchen.