Wie kann ich mit capybara überprüfen, ob ein Formularfeld korrekt ausgefüllt ist?

145

Ich habe ein Feld mit einem richtigen Etikett, das ich problemlos mit Capybara ausfüllen kann:

fill_in 'Your name', with: 'John'

Ich möchte den Wert überprüfen, bevor ich ihn ausfülle, und kann ihn nicht herausfinden.

Wenn ich nach fill_inder folgenden Zeile hinzufüge :

find_field('Your name').should have_content('John')

Dieser Test schlägt fehl, obwohl die Füllung kurz zuvor funktioniert hat, wie ich durch Speichern der Seite überprüft habe.

Was vermisse ich?

Marc-André Lafortune
quelle

Antworten:

179

Mit einer xpath-Abfrage können Sie überprüfen, ob ein inputElement mit einem bestimmten Wert vorhanden ist (z. B. 'John'):

expect(page).to have_xpath("//input[@value='John']")

Weitere Informationen finden Sie unter http://www.w3schools.com/xpath/xpath_syntax.asp .

Für vielleicht einen schöneren Weg:

expect(find_field('Your name').value).to eq 'John'

EDIT: Heutzutage würde ich wahrscheinlich have_selector verwenden

expect(page).to have_selector("input[value='John']")

Wenn Sie das Seitenobjektmuster verwenden (sollten Sie sein!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"
DVG
quelle
Ah, mir hat das .valuebisschen gefehlt . Vielen Dank!
Marc-André Lafortune
Ich hatte das gleiche Problem, aber eher mit einem div als mit einem Formularfeld. Verwenden Sie für alle anderen, die das gleiche Problem haben, find_by_id (). Text anstelle von find_field (). Value. Ich habe ewig gebraucht, um zu erkennen, dass dieser Wert nur auf Formularfeldern funktioniert…
John Y
8
Das Problem bei letzterem Weg ist, dass der Abfragezyklus von Capybara nicht verwendet wird und daher sofort fehlschlägt, wenn das Feld durch länger laufenden JS-Code festgelegt wird. Der erste Weg ist vorzuziehen, es sei denn, Sie versuchen dies in einem statisch generierten Formular.
fqxp
1
Ich denke, @fqxp hat eine bessere Antwort, die RSpec Matchers und die neue Erwartungssyntax verwendet. Nach dem, was ich in der Dokumentation sehe, werden find_fieldandere Node::Findersverwendet, um Knoten zu finden und Aktionen für sie auszuführen, anstatt sie zu erwarten. Natürlich ist dies keine Regel, aber für etwas Einfaches ist es eine bessere Idee, mit der eingebauten Lösung zu arbeiten. Nur sagen!
Agent47DarkSoul
Es ist wahr, dass dies jetzt der bevorzugte Weg ist, jedoch wurde die Syntax etwa einen Monat nach dieser Frage veröffentlicht.
DVG
309

Eine andere hübsche Lösung wäre:

page.should have_field('Your name', with: 'John')

oder

expect(page).to have_field('Your name', with: 'John')

beziehungsweise.

Siehe auch die Referenz .

Hinweis : Für deaktivierte Eingaben müssen Sie die Option hinzufügen disabled: true.

fqxp
quelle
23
Viel besser als die ausgewählte Antwort!
Agent47DarkSoul
3
Ich würde die ausgewählte Antwort immer noch bevorzugen, da die Fehlermeldung die erwarteten und tatsächlichen Zeichenfolgen anzeigt. Dies gibt dem nicht hilfreichen "erwarteten Feld" mein Feld ", um etwas zurückzugeben" Fehler. Aber dieser liest sich definitiv besser und folgt der Page Matcher API besser. Überall Upvotes !!!
mraaroncruz
1
Soweit ich das beurteilen kann, bestätigt dies nicht den Wert des Feldes, sondern nur das Vorhandensein des Feldes, unabhängig vom Wert. Ich vermute, es ist ein Fehler, da die Dokumente sagen, dass es nach Wert filtern sollte.
Nick
1
Das Übergeben hat withdefinitiv nur dann true zurückgegeben, wenn der Wert für mich übereinstimmt, was das erwartete Ergebnis ist.
Ben Saufley
4
Vielleicht wurde die Fehlermeldung verbessert, seit die Antwort zum ersten Mal geschrieben wurde, aber ich komme jetzt expected […] but there were no matches. Also found "", which matched the selector but not all filters..auf ein leeres Feld, das einer sehr schönen Fehlermeldung sehr nahe kommt.
Patru
2

Wenn Sie speziell auf einen Platzhalter testen möchten, verwenden Sie:

page.should have_field("some_field_name", placeholder: "Some Placeholder")

oder:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

Wenn Sie den vom Benutzer eingegebenen Wert testen möchten:

page.should have_field("some_field_name", with: "Some Entered Value")
Jim Stewart
quelle
0

Ich habe mich gefragt , wie etwas etwas anderes tun: Ich wollte testen , ob das Feld hatte etwas Wert (bei Verwendung zur Herstellung von Capybara Fähigkeit zum erneuten Test der Matcher , bis sie paßt ). Es stellt sich heraus, dass es möglich ist, einen "Filterblock" zu verwenden, um dies zu tun:

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
Jonleighton
quelle