Як я можу перевірити, чи правильно заповнено поле форми за допомогою capybara?


145

У мене є поле з належною міткою, яке я можу без проблем заповнити capybara:

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'

EDIT: Сьогодні я, мабуть, використовую has_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"

Ах, я .valueтрохи не вистачала . Дякую!
Марк-Андре Лафортун

У мене були ті ж проблеми, але з дівом, а не полем форми. Для тих, хто має таку ж проблему, скористайтеся текстом find_by_id ()., А не значком find_field (). Знадобилося мені віки, щоб помітити, що це значення працювало лише на полях форм ...
Джон Y

8
Проблема останнього способу полягає в тому, що він не використовує цикл опитування Капібари і, отже, миттєво вийде з ладу, якщо поле буде встановлене довшим кодом JS. Перший спосіб має бути кращим, якщо ви не намагаєтеся це статично генерувати форму.
fqxp

1
Я думаю, що у @fqxp є краща відповідь, яка використовує відповідники RSpec та новий синтаксис очікування. З того, що я бачу в документації, 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.


23
Набагато краще, ніж обрана відповідь!
Agent47DarkSoul

3
Я все одно віддаю перевагу вибраній відповіді, оскільки повідомлення про помилку показує очікувані та фактичні рядки. Це дає помилкові помилки "очікуване поле" моє поле ", щоб повернути щось". Але цей, безумовно, читається краще і краще відповідає API відповідності сторінки. Оновлення всіх навколо !!!
mraaroncruz

1
Наскільки я можу сказати, це насправді не підтверджує значення поля, а лише наявність поля незалежно від значення. Я здогадуюсь, що це помилка, оскільки документи говорять, що вона повинна фільтрувати на основі значення.
Нік

1
Перехід withнапевно повертає істину лише у тому випадку, якщо значення відповідає для мене, що є очікуваним результатом.
Бен Сафлі

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

Мені було цікаво, як зробити щось дещо інше: я хотів перевірити, чи має поле якесь значення (використовуючи здатність Капібари повторно перевіряти матч, поки воно не збігається ). Виявляється, для цього можна використовувати "блок фільтру":

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.