Почему Капибара не заполнит мое текстовое поле? - PullRequest
0 голосов
/ 12 декабря 2018

Когда я беру текстовое поле, fill_in не работает.Он говорит, что не может найти поле, хотя, кажется, знает, что это поле, и, кажется, знает его значение?Что я тут не так делаю?

f = page.all('input[type=text]').first
f
=> #<Capybara::Node::Element tag="input" path="/html/body/form/ol/li[1]/input">
f.value
=> "parsley"
fill_in f, with: 'paprika'
Capybara::ElementNotFound: Unable to find field #<Capybara::Node::Element tag="input" path="/html/body/form/ol/li[1]/input">
from /Users/test/.rvm/gems/ruby-2.3.3/gems/capybara-3.12.0/lib/capybara/node/finders.rb:301:in `block in synced_resolve'

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Как правильно отвечает ответ @bott, fill_in принимает локатор, который представляет собой имя, идентификатор или связанный текст метки ввода, который вы хотите заполнить, а не элемент или селектор CSS.Кроме того, начиная с Capybara 3.7.0, вы можете вызвать fill_in для заполняемого элемента и пропустить передачу локатора (как упомянуто в документации - «если локатор не предоставлен, будет работать на себя или на потомка») - в вашем случае это будет

f.fill_in with: 'paprika'

В примечании не нужно вызывать all(...).first, поскольку существует метод first, если все, что вам нужно, это первый соответствующий элемент, однако в общем случае вы действительно хотите отдать предпочтение методам.которые возвращают единичные уникальные элементы (поиск и т. д.), используя при необходимости область видимости для обеспечения уникальности, вместо all и first

0 голосов
/ 13 декабря 2018

Если вы больше не используете переменную f после fill_in Я не вижу смысла в присвоении переменной.

Посмотрите на fill_in: https://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#fill_in-instance_method

он ожидает строку, я не уверен, что вы можете использовать селектор CSS.

Вы также можете альтернативно использовать find и set:

find('#my_container_id #id_of_first_input').set 'capybara'
find('#my_container_id #id_of_datetime_input').set I18n.l(Time.now, format: '%d-%m-%Y, %H:%M')

find('input[type=text]').set 'foo' также должен работать, поскольку find принимает любой действительный CSS, см. https://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders#find-instance_method

Бонус, на случай, если он вам понадобится: если у вас есть выпадающий список, вы можете сделать: find('#my_container_id #my_dropdown_id').find("option[value='#{factory2.id}']").select_option

0 голосов
/ 12 декабря 2018

fill_in использует локатор, а не элемент, вы используете «f», который является элементом.Ссылка на документ https://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Actions#fill_in-instance_method

fill_in ([локатор], с:, ** параметрами)

...