Jak mogę sprawdzić, czy pole formularza zostało poprawnie wypełnione przy użyciu kapibary?

145

Mam pole z odpowiednią etykietą, które mogę bez problemu wypełnić kapibarą:

fill_in 'Your name', with: 'John'

Chciałbym sprawdzić jego wartość przed wypełnieniem i nie mogę tego rozgryźć.

Jeśli dodam po fill_innastępującym wierszu:

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

Ten test kończy się niepowodzeniem, chociaż wypełnienie tuż przed działało tak, jak zweryfikowałem, zapisując stronę.

czego mi brakuje?

Marc-André Lafortune
źródło

Odpowiedzi:

179

Możesz użyć zapytania xpath, aby sprawdzić, czy istnieje inputelement o określonej wartości (np. „Jan”):

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

Więcej informacji można znaleźć pod adresem http://www.w3schools.com/xpath/xpath_syntax.asp .

Może na ładniejszy sposób:

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

EDYCJA: Obecnie prawdopodobnie użyłbym have_selector

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

Jeśli używasz wzorca obiektu strony (powinieneś!)

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
źródło
Ach, brakowało mi tego .valuekawałka. Dzięki!
Marc-André Lafortune
Miałem ten sam problem, ale z elementem div zamiast pola formularza. Jeśli ktoś ma ten sam problem, użyj funkcji find_by_id (). Text zamiast find_field (). Value. Zajęło mi całe wieki , zanim dostrzegłem, że wartość działała tylko na polach formularza…
John Y,
8
Problem z tym drugim sposobem polega na tym, że nie wykorzystuje on cyklu odpytywania Kapibary i dlatego zawiedzie natychmiast, jeśli pole jest ustawione przez dłużej działający kod JS. Pierwszy sposób jest preferowany, chyba że próbujesz tego na statycznie wygenerowanym formularzu.
fqxp
1
Myślę, że @fqxp ma lepszą odpowiedź, która wykorzystuje RSpec Matchers i nową składnię oczekiwań. Z tego, co widzę w dokumentacji, find_fielda inne Node::Finderssłużą do znajdowania węzłów i wykonywania na nich działań, a nie oczekiwania. Oczywiście nie jest to reguła, ale w przypadku czegoś prostego, ponieważ takie rozwiązanie z wbudowanym rozwiązaniem jest lepszym pomysłem. Tylko mówię!
Agent47DarkSoul
To prawda, oczekiwanie byłoby teraz preferowanym sposobem, jednak składnia została wydana około miesiąca po tym pytaniu.
DVG
309

Innym ładnym rozwiązaniem byłoby:

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

lub

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

odpowiednio.

Zobacz także odniesienie .

Uwaga : w przypadku wyłączonych wejść musisz dodać opcję disabled: true.

fqxp
źródło
23
Znacznie lepiej niż wybrana odpowiedź!
Agent47DarkSoul
3
Nadal wolałbym wybraną odpowiedź, ponieważ komunikat o błędzie pokazuje oczekiwane i rzeczywiste ciągi. To powoduje, że niepomocne „oczekiwane pole” moje pole ”zwraca błąd. Ale ten zdecydowanie lepiej czyta i lepiej podąża za API dopasowywania stron. Głosy za całym sercem !!!
mraaroncruz
1
O ile wiem, w rzeczywistości nie potwierdza to wartości pola, a jedynie obecność pola niezależnie od wartości. Zgaduję, że to błąd, ponieważ dokumentacja mówi, że powinien filtrować na podstawie wartości.
Nick
1
Podanie na withpewno zwróciło prawdę tylko wtedy, gdy wartość pasuje, dla mnie, co jest oczekiwanym wynikiem.
Ben Saufley,
4
Być może komunikat o błędzie został poprawiony od czasu pierwszego napisania odpowiedzi, ale teraz widzę expected […] but there were no matches. Also found "", which matched the selector but not all filters..puste pole, które jest bardzo bliskie bardzo ładnemu komunikatowi o błędzie.
Patru,
2

Jeśli chcesz specjalnie przetestować dla symbolu zastępczego, użyj:

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

lub:

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

Jeśli chcesz przetestować wartość wprowadzoną przez użytkownika:

page.should have_field("some_field_name", with: "Some Entered Value")
Jim Stewart
źródło