Dinoer

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 cliquer auf die Schaltfläche. Aus evaluer rufen Sie requestSubmit() 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.
  • evaluer mit :invalid listet die blockierenden Felder auf.
  • Nehmen Sie lieber cliquer; aus evaluer heraus requestSubmit() am Formular.
  • Ein Zeitlimit ist kein Fehlschlag: Prüfen Sie, bevor Sie es erneut versuchen.