Es ist gut möglich, dass es viele Formulare auf den von Ihnen bearbeiteten Websites gibt. Anmelde- und Registrierungsformulare, Zahlungsformulare, Kontaktformulare, Kommentarformulare usw. Es ist eine gute Idee, diese Formulare zu testen. Automatisierte Tests sind sicherlich eine gute Idee. Backend-Tests, die die Formulardaten verarbeiten und die Ergebnisse testen. Frontend-Tests, die testen, ob die Funktionen das tun, was Sie erwarten.
Aber dann gibt es noch manuelles Testen. Zum Beispiel: Ich möchte das mit meinen Augen, meiner Tastatur und Maus und meinen Emotionen testen. Das ist wahrscheinlich die häufigste Art des Testens für Designer. Sicherlich ist das Ausfüllen der Formulare von Hand eine gute Idee, aber das immer und immer wieder zu tun, wird so mühsam, dass Sie (Schrecken!) es vielleicht gar nicht mehr so oft tun.
Vielleicht können wir einfach ein kleines bisschen Code auf unsere Websites werfen, um sie bei Bedarf vorab auszufüllen.
Vorausfüllen aus der Vorlage
Eine Möglichkeit besteht darin, die Vorlage selbst ständig vorab auszufüllen. Sie könnten zum Beispiel prüfen, ob Sie sich auf der Entwicklungsdomäne befinden, und dann den Wert vorbelegen. So:
<?php
if ($_SERVER['HTTP_HOST'] == "mysite.dev") {
$prefill = true;
}
?>
<input type="text"
name="name"
id="name"
<?php if ($prefill) { ?>
value="Chris Coyier"
<?php } else { ?>
value=""
<?php } ?>
>
Oder der Rails-Weg
<input type="text"
name="name"
id="name"
<% if Rails.env.development? %>
value="Chris Coyier"
<% else %>
value=""
<% end %>
>
Das Problem dabei ist, dass Sie das Formular in der Entwicklung immer ausgefüllt sehen, was nicht die Art und Weise ist, wie Ihre Benutzer es vorfinden. Ich ziehe es vor, das Formular so zu belassen, wie die Benutzer es sehen, und es dann optional bei Bedarf auszufüllen.
Vorausfüllen mit JavaScript
Mit denselben Test-ob-Entwicklungs-Sachen wie oben können wir ein neues Skript auf die Seite einfügen, um das Vorausfüllen durchzuführen.
<?php if ($_SERVER['HTTP_HOST'] == "mysite.dev") { ?>
<script src="/assets/development/form-prefiller.js"></script>
<?php } ?>
Es gibt ein paar Möglichkeiten, wie Sie vorgehen könnten
- Felder automatisch vorbelegen, die gefunden werden
- Schaltflächen zum Vorabfüllen einfügen
- Nur einige öffentliche Funktionen haben, die Sie manuell aus der Konsole aufrufen können
Es gibt nicht viele Vorteile bei der Verwendung von JavaScript, wenn Sie automatisch vorbelegen wollen. Für die Zwecke dieser Demo werde ich Schaltflächen erstellen. In Wirklichkeit überlasse ich es einfach der Konsole.
Eine sehr einfache Version des Skripts könnte so aussehen
var PrefillMachine = {
prefillCorrectly: function() {
$("#name").val("Chris Coyier");
}
}
Dann, wann immer Sie auf der Seite mit dem Formular sind, öffnen Sie einfach die Konsole und tippen Sie
PrefillMachine.prefillCorrectly();
Oder wenn Sie einige Schaltflächen auf der Seite hätten
var PrefillMachine = {
init: function() {
this.bindUIActions();
},
bindUIActions: function() {
// Probably even best to insert this button with JS
$("#prefill-correct").on("click", this.prefillCorrectly);
},
prefillCorrectly: function() {
$("#name").val("Chris Coyier");
}
}
PrefillMachine.init();
Vorausfüllen von Werten und Typen
Es ist eine Sache, einfach einige festgelegte Werte vorab einzufüllen, aber Sie möchten es vielleicht ein wenig randomisieren. Zum Beispiel hilft es nicht viel, bei einem Registrierungsformular immer wieder denselben Benutzernamen vorab einzufüllen, da Ihr System ihn wahrscheinlich als Duplikat ablehnen wird. Lassen Sie uns also ein wenig randomisieren!
In unserem PrefillMachine-Objekt können wir eine Funktion erstellen, die uns einen zufälligen String liefert
_makeId: function() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i=0; i < 5; i++) {
text += possible.charAt(Math.floor(Math.random() * possible.length));
}
return text;
},
Wenn wir das aufrufen, erhalten wir Dinge wie eQthY, Jv1ea oder Cmy4g. Ziemlich unwahrscheinlich, dass es sich wiederholt.
Wenn wir also zum Beispiel einen Namen und Benutzernamen vorbelegen, könnten wir unsere Vorausfüllfunktion so gestalten
prefillCorrectly: function() {
var id = this._makeId();
$("#name").val("name_" + id);
$("#username").val("username_" + id);
...
Wir stellen diesen randomisierten Werten einfach ein Präfix voran, damit sie leicht in einer Datenbank zu finden sind, falls wir sie löschen oder so etwas wollen.
Testen Sie eine E-Mail-Adresse? Verwenden Sie vielleicht diesen randomisierten Wert als Erweiterung für eine Gmail-Adresse. Auf diese Weise ist sie eindeutig, aber Sie erhalten trotzdem die E-Mail.
$("#email").val("chriscoyier+" + id + "@gmail.com");
Was ist mit Kontrollkästchen, Radiobuttons und Auswahllisten? Es könnte schön sein, die Optionen dort zu randomisieren. Wir können einen super schnellen Zufallszahlengenerator erstellen
_rand: function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Sagen wir, es gäbe eine Gruppe von Radiobuttons mit zwei Optionen, wir könnten beide deaktivieren, eine zufällig auswählen und sie wieder aktivieren
$("input[name='radio-choice']")
.prop("checked", false)
.eq(this._rand(0, 1))
.prop("checked", true);
Ähnlich einfach mit einer Auswahlliste
$("#select-choice")
.find("option")
.prop("selected", false)
.eq(this._rand(0, 2))
.prop("selected", true);
Eine Straßenadresse randomisieren?
$("#address").val(this._rand(1000, 9000) + " Super St.");
Sie haben die Idee verstanden.

Fehlerhaftes Vorausfüllen
Vielleicht ist es genauso nützlich, Formularfehlerzustände zu testen, indem man sie falsch vorbelegt, wie ein Formular korrekt vorab auszufüllen. Erstellen Sie einfach eine weitere Funktion dafür
prefillIncorrectly: function() {
// Empty should be invalid
$("#name").val("");
$("#username").val("");
// Space should make invalid
$("#email").val("jim @jim.com");
// Force them not to match AND one is blank.
$("#pw").val("123");
$("#pw-repeat").val("");
// Turn both off.
$("input[name='radio-choice']")
.prop("checked", false);
// Not enough numbers
$("#cc").val("424242424242");
// Values are wrong
$("#exp-1").val("50");
$("#exp-2").val("02");
$("#cvv").val("abc");
// Left unchecked
$("#agree-terms").prop("checked", false);
},
Rufen Sie sie dann nach Belieben auf. Dann können Sie absenden und sehen, ob Ihr Fehlerbehandlungssystem ordnungsgemäß funktioniert.

Sie könnten all dies wahrscheinlich sogar als Teil eines End-to-End-Test-Systems verwenden, aber das überlasse ich klügeren Leuten.
Demo
Hier ist ein Beispiel für alles
Sehen Sie den Pen pzKtx von Chris Coyier (@chriscoyier) auf CodePen.
Danke an Tim Sabat, der mich mit dieser Idee vertraut gemacht hat. Er hat sie sich ausgedacht und für uns auf CodePen implementiert, um das Testen für uns alle einfacher zu machen.
Interessante Idee Chris! Obwohl ich persönlich nicht gerne die Seite, an der ich arbeite, mit PHP-Tags und Dev-Script-Inklusionen verändere.
Wenn Sie unter Chrome arbeiten (vielleicht erlaubt Firefox es auch), können Sie Code-Snippets in DevTools (Sources > Snippets) speichern und sie dann ausführen (rechte Maustaste > Run). Das hält den Code sauber und nutzt die DevTools gut aus, indem Sie, wissen Sie… ein Entwicklerwerkzeug hinzufügen. :P
Außerdem gibt es im Zusammenhang mit dem Ausfüllen von Formularen einige Browser-Erweiterungen, die dies mit einem einzigen Klick ermöglichen, wie zum Beispiel diese hier.
Das mag für die Entwicklung nur am Desktop in Ordnung sein, aber auf einem typischen Mobilgerät ist das Plugin keine Option. Wenn Sie ein Formular entwickeln, werden Sie höchstwahrscheinlich genau wissen, welche Daten es akzeptiert, und wenn es Felder gibt, die nur unter bestimmten Umständen erscheinen oder sich in bestimmten Fällen anders verhalten,
wird das Einrichten einer Reihe von jQuery-Selektoren viel schneller sein, als die Struktur eines Plugins nur für den Desktop zu lernen, in der Hoffnung, dass es alle Bedürfnisse erfüllt.
Außerdem, wenn Sie an große Teams von Entwicklern denken, sobald Sie die JS-Datei und die Vorlage, die sie enthält, committet haben, werden alle Entwickler sie auf jeder Plattform verfügbar haben. Ein Plugin würde erfordern, dass jeder einzelne Computer (und Browser) besucht wird, um es zu installieren und zu konfigurieren.
Ich benutze dieses Lesezeichen schon seit Jahren https://github.com/dsheiko/autofill. Es dient mir gut
Das ist auch meine bevorzugte Methode.
Lesezeichen in Kombination mit ChanceJS zum Generieren von Zufallsdaten.
Dimitry, sehr nützliches Lesezeichen, danke
Branden, die Kombination mit ChanceJS klingt nach einer perfekten Lösung. Es wäre toll, wenn Sie sich die Zeit nehmen könnten, detailliert zu beschreiben, wie Sie die eigentliche „Kombination“ für uns weniger versierten Leute durchführen! Auf jeden Fall sehr nützlich, danke.
Das ist ausgezeichnet! Ich bin überrascht, dass ich das noch nie zuvor gehört habe.
Es ist einfach genug zu modifizieren, wenn man möchte, dass es mehr tut. Und man kann den Link an nur die beteiligten Entwickler weitergeben.
Danke für das Teilen.
Persönlich würde ich die Formulare immer noch lieber jedes Mal von Hand ausfüllen – ich bin ein ziemlich schneller Tipper!
Das ist großartig. Danke Chris!
Ich arbeite viel mit Gravity Forms, daher refaktorisiere ich, um dies etwas generischer zu gestalten. Z.B.
Schön, ich habe das gleiche für meine Unternehmenswebsite getan, um die Post-Booking-Seite schneller zu entwickeln, indem ich den jQuery-Ansatz verwendet habe.
Man kann ein sehr schneller Tipper sein, um 10 Eingabefelder, 4 Auswahllisten und ein paar Kontrollkästchen auszufüllen, aber nichts schlägt einen einzigen Klick in Bezug auf Geschwindigkeit. Und es ist umso bedeutender, wenn die Operation tonnenweise wiederholt werden muss, das ist die Art von Philosophie, die Projekte wie Grunt.js antreibt: „Wenn man etwas mehr als einmal tun muss, automatisieren“.
Es gibt auch Plugins für Chrome, die das tun, aber eine JS-Lösung ist effektiver, wenn wir auch an Mobilgeräte denken. Das Gleiche Formular auf dem Desktop mit Ihrer physischen Tastatur neu einzugeben, ist eine Sache, aber versuchen Sie es auf einem iPhone oder Android-Smartphone mit aktiviertem Autokorrektur, Sie werden ziemlich schnell verrückt.
Bookmarklets sind ideal (um die Quelle nicht zu verschmutzen), oder Sie können ein Userscript erstellen (native Unterstützung in Chrome, über GreaseMonkey in Firefox, über Add-ons wie CreamMonkey für Safari und Violet Monkey für Opera).
Persönlich würde ich niemals entwicklungsspezifische Zweige in Code aufnehmen, der in die Produktion gelangt – das Risiko, dass etwas übersehen oder missbraucht wird, ist für die Bereiche, in denen ich arbeite, einfach zu groß.
Ich arbeite an einer Chrome-Erweiterung Formbot, die perfekt zum Vorabfüllen von Formularen passt. Sie können sie zufällige Daten generieren lassen oder spezifische Daten für verschiedene Eingabetypen festlegen.
Ich benutze LastPass und es hat eine Formularfüll-Schaltfläche, von der eine ich zum Testen eingerichtet habe (komplett mit gefälschter/Test-Visa), also klicke ich einfach auf diese Schaltfläche. Sie kümmert sich jedoch nicht um Kontrollkästchen und Radiobuttons. Clevere Lösung.
Ich mache dasselbe
Zu viel Aufwand :-p
Aber sehr hilfreich :-)
Sie bringen mich manchmal dazu, mich zu fragen, warum ich nicht schon früher so gedacht habe. Ihre Ideen sind so sauber und bodenständig.
Vielen Dank.
Wenn Sie eine Vorlagensprache wie Laravel Blade/Mustache/Handlebars/Django verwenden, könnten Sie einen Wert in das Formular übergeben und diese Daten einfach aus dem Modell der Produktionsumgebung entfernen.
Wenn der Modellwert für
testleer ist, wird nichts gerendert und der Wertstring ist für den Browser leer.Ich bin ein großer Fan des Formlet Firefox Add-ons. Füllen Sie das Formular einmal manuell aus, und Formlet speichert dann die Formulardaten in einem Lesezeichen. Das Lesezeichen ist komplett portables Vanilla-JavaScript. D.h. das Add-on ist nicht erforderlich, um das Lesezeichen auszuführen, sodass Sie es an einen Kollegen senden können, usw.
Es beherrscht alle Formularelemente wie Kontrollkästchen, Radiobuttons, Textbereiche und dergleichen. Kein Herumfummeln im Code, und es ist ein riesiger Zeitsparer.
Ich benutze die Chrome-Erweiterung FormFiller (https://chrome.google.com/webstore/detail/form-filler/bnjjngeaknajbdcgpfkgnonkmififhfo). Ich ziehe es vor, diese zu verwenden, da ich keinen zusätzlichen Code schreiben muss, der in die Versionskontrolle übernommen wird.
Ich habe vor ein paar Projekten einen Gist dafür geschrieben, der die zehn häufigsten Jungen- und Mädchennamen und die 20 häufigsten Nachnamen verwendet, einen erfundenen Twitter-Handle und ein Profilfoto von http://www.fillmurray.com und etwas Lipsum von http://json-lipsum.appspot.com. Das hat mir viel Zeit gespart, aber eine besorgte Anfrage vom Kunden erhalten, der sich fragte, woher all diese Leute gekommen seien.
https://gist.github.com/chris5marsh/8455299
Sie bringen mich manchmal dazu, mich zu fragen, warum ich nicht schon früher so gedacht habe. Ihre Ideen sind so sauber und bodenständig.
Danke
Sehr cool. Wir verwenden oft einen Cookie, um entwicklungsspezifische Einstellungen wie diese zu aktivieren. Sie könnten also prefiller.js mit einer Überprüfung versehen, ob ein Cookie namens debug==tru vorhanden ist.
FormFiller sieht vielversprechend aus. Einfach und prägnant! Danke für den Artikel, Chris! Wie immer erstaunlich und interessant.