Можно ли заполнить числовое поле без меток с помощью Capybara?

У меня есть числовое поле, которое принимает :product_quantity с кнопкой после нее, говорящей "Add to Cart". Мой тест работает без настройки number_field, но когда я раскомментирую эту строку:

product_from_shop.fill_in 'quantity', with: 5

Вещи взрываются. Capybara::ElementNotFound

Речь идет об этой строке, на мой взгляд:

<%= f.number_field :product_quantity, value: booking.product_quantity, min: 1, max: 999, title: 'quantity' %>

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

title отлично работал в других случаях, без формы.

Также: я использую webkit capybara, потому что он использует JS.


person Code-MonKy    schedule 25.02.2017    source источник
comment
Что такое «product_from_shop», каков фактический HTML-код элемента и какое полное сообщение об ошибке вы получаете   -  person Thomas Walpole    schedule 25.02.2017


Ответы (2)


fill_in использует селектор :fillable_field, который найдет любой видимый элемент ввода или текстовой области, кроме типа отправки, изображения, радио, флажка или файла. Он найдет эти элементы по идентификатору, имени или атрибутам заполнителя или по тексту в связанном элементе метки. Поскольку у вас нет связанной метки, у вас есть атрибут id, name или placeholder. Предполагая, что product_from_shop является элементом-оболочкой на странице, которую вы используете для охвата этого fill_in, тогда

product_from_shop.fill_in '<something>_product_quantity', with: 5

должен найти и заполнить элемент по идентификатору - это будет зависеть от того, для какого типа модели предназначена форма (просто посмотрите на фактический HTML, чтобы увидеть, какой идентификатор был назначен).

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

product_from_shop.fill_in with: 5 # same as product_from_shop.fill_in nil, with: 5

Если ни один из них не сработает для вас, вы можете перейти к использованию чего-то вроде

product_from_shop.find(<more complicated query>).set '5'

Чтобы уточнить ваш комментарий о том, что title работал ранее: атрибут title сопоставляется только при поиске ссылок и кнопок.

person Thomas Walpole    schedule 25.02.2017
comment
Право на! Я пошел со средним. Я заметил, что на самом деле мог бы использовать идентификатор, но это было бы странно, учитывая, что на странице отображается несколько продуктов. Если бы мне нужно было различать на каком-то более позднем этапе, я всегда мог бы обернуть это в какой-нибудь div. Спасибо! - person Code-MonKy; 26.02.2017

Предполагая, что вы используете для этого form_for в Rails, тогда он должен генерировать идентификатор, который вы можете использовать. Я не знаком с формой product_from_shop.fill_in, обычно использую page, но попробуйте одну из них:

page.fill_in :product_from_shop_product_quantity, with: 5

or

page.fill_in "product_from_shop_product_quantity", with: 5
person Greg Tarsa    schedule 25.02.2017