Как я могу проверить правильность заполнения поля формы с помощью капибары?

145

У меня есть поле с правильной меткой, которую я могу заполнить капибарой без проблем:

fill_in 'Your name', with: 'John'

Я хотел бы проверить значение, которое он имеет, прежде чем заполнять его, и не могу понять это.

Если я добавлю после fill_inследующей строки:

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

Этот тест не пройден, хотя заполнение непосредственно перед этим сработало, как я подтвердил, сохранив страницу.

Чего мне не хватает?

Марк-Андре Лафортун
источник

Ответы:

179

Вы можете использовать запрос xpath, чтобы проверить, есть ли inputэлемент с определенным значением (например, 'John'):

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

См. Http://www.w3schools.com/xpath/xpath_syntax.asp для получения дополнительной информации.

Пожалуй, красивее:

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

РЕДАКТИРОВАТЬ: В настоящее время я бы, вероятно, использовал have_selector

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

Если вы используете шаблон объекта страницы (вы должны быть!)

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
источник
Ах, я пропустил .valueнемного. Спасибо!
Марк-Андре Лафортун
У меня была та же проблема, но с div, а не с полем формы. Для тех, у кого есть такая же проблема, используйте find_by_id (). Text вместо find_field (). Value. Мне потребовались целые годы, чтобы определить, что значение работает только в полях формы ...
Джон Y
8
Проблема с последним способом заключается в том, что он не использует цикл опроса Capybara и, следовательно, мгновенно потерпит неудачу, если поле будет установлено с помощью более продолжительного кода JS. Первый способ должен быть предпочтительным, если вы не пытаетесь сделать это в статически сгенерированной форме.
fqxp
1
Я думаю, что @fqxp имеет лучший ответ, который использует RSpec Matchers и новый синтаксис ожидания. Из того, что я вижу в документации, find_fieldи другие Node::Findersиспользуются для поиска узлов и выполнения над ними действий, а не ожидания. Конечно, это не правило, но для чего-то простого, так как лучше использовать встроенное решение. Просто говорю!
Agent47DarkSoul
Правда, сейчас ожидаемый вариант предпочтительнее, однако синтаксис был опубликован примерно через месяц после этого вопроса.
DVG
309

Другое красивое решение будет:

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

или

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

соответственно.

Также см. Ссылку .

Примечание : для отключенных входов вам нужно добавить опцию disabled: true.

fqxp
источник
23
Гораздо лучше, чем выбранный ответ!
Agent47DarkSoul
3
Я все еще предпочел бы выбранный ответ, потому что сообщение об ошибке показывает ожидаемые и фактические строки. Это дает бесполезное «ожидаемое поле» моего поля «вернуть что-то» ошибку. Но этот действительно лучше читается и лучше следует API соответствия страниц. Проголосуй вокруг !!!
mraaroncruz
1
Насколько я могу судить, это на самом деле не подтверждает значение поля, только наличие поля независимо от значения. Я предполагаю, что это ошибка, так как в документах сказано, что она должна фильтроваться по значению.
Ник
1
Передача withопределенно только вернула true, если значение для меня совпадает, что является ожидаемым результатом.
Бен Сауфли
4
Возможно, сообщение об ошибке улучшилось с тех пор, как ответ был написан впервые, но теперь я получаю expected […] but there were no matches. Also found "", which matched the selector but not all filters..пустое поле, которое очень близко подходит к очень приятному сообщению об ошибке.
Патру
2

Если вы специально хотите проверить заполнитель, используйте:

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

или:

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

Если вы хотите проверить введенное пользователем значение:

page.should have_field("some_field_name", with: "Some Entered Value")
Джим Стюарт
источник
0

Мне было интересно, как сделать что-то немного другое: я хотел проверить, имеет ли поле какое- то значение (используя при этом способность Capybara повторно проверять совпадение, пока оно не совпадет ). Оказывается, что для этого можно использовать «блок фильтра»:

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
jonleighton
источник