Как поставить галочку у капибары?

126

Я использую Rspec и Capybara.

Как я могу написать шаг для проверки checkbox? Я пробовал checkпо стоимости, но не нашел свой checkbox. Я не уверен, что делать, так как у меня фактически одинаковый идентификатор с разными значениями

Вот код:

 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="61" name="cityID">
 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="62" name="cityID">
 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="63" name="cityID">
Джон Доу
источник
6
Ваши входы не должны иметь одинаковые идентификаторы - они должны иметь одинаковые имена, но разные идентификаторы.
SamStephens,

Ответы:

156

Я обнаружил, что у меня работает следующее:

# Check
find(:css, "#cityID[value='62']").set(true)

# Uncheck
find(:css, "#cityID[value='62']").set(false)
Джон М
источник
1
Рад это слышать! Возможно, вы бы отметили этот ответ как «принятый» и, возможно, проголосовали бы за него ... :)
Jon M
@Jon MI имеет нечетный идентификатор с пустыми скобками, поэтому для примера проверки ... find(:css, "#cityID[value='62']").set(true)будет работать, но find(:css, "#cityID[][value='62']").set(true)не будет найден и завершится ошибкой. Как запустить ту же функцию с идентификатором пустой скобки?
TangibleDream
1
@TangibleDream, чтобы прояснить - вы говорите, что у флажка есть идентификатор '[]'?
Jon M
1
Я вообще не мог найти способ заставить эту работу работать с селектором CSS! Должен быть способ избежать квадратной скобки, но я не смог его найти. Мне пришлось прибегнуть к поисковику XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Джон М.
3
Могу ли я отметить этот ответ ... Я знаю, что он работает, но его счетчик интуитивно понятен для разметки ответа, который не является частью простого доступного API: check ('name, id or text here') (см. Ответ ниже)
Code Novitiate
137

Лучше не создавать несколько элементов с одним и тем же идентификатором , чтобы (и не только для этого) вы могли легко установить / снять флажок с элегантным

check 'cityID'
uncheck 'cityID'

Если нельзя избежать нескольких элементов с одним и тем же идентификатором и все же нужно установить флажок с определенным значением , он может сделать это с помощью

find(:css, "#cityID[value='62']").set(true)
find(:css, "#cityID[value='62']").set(false)

Более подробная информации о Капибаре входных манипуляциях можно найти здесь

installero
источник
2
Также лучше не создавать несколько элементов с одним и тем же идентификатором, потому что это недопустимый HTML. Это не должно быть проблемой при правильном использовании помощников формы рельсов.
ihaztehcodez 06
1
Я хотел бы добавить, что флажок / снятие флажка принимает только следующие значения: идентификатор, имя или связанный элемент метки. Здесь вы можете прочитать об этом подробнее.
Неша Зорич
58

При запуске теста капибары вы получили pageобъект. Это вы можете использовать для установки / снятия флажков. Как уже упоминал @buruzaemon:

чтобы найти и установить флажок по имени, идентификатору или тексту метки.

Итак, предположим, что у вас есть флажок в вашем html, например:

<label>  
  <input type="checkbox" value="myvalue" name="myname" id="myid">
  MyLabel
</label>

Вы можете проверить это с помощью:

page.check('myid')
page.check('MyLabel')
page.check('myname')

Снимите флажок - это тот же page.uncheckметод использования .

p1100i
источник
1
твердый ответ, кажется более чистым, чем принятый ответ с использованием селекторов css (даже если это то, что делает метод проверки под обложками)
agmin
1
Ага, это лучший ответ. Он чище и точно имитирует действия пользователя. Он не загрязняет форму дополнительными идентификаторами и упрощает чтение тестов.
B Seven
Я согласен, это чище. Что интересно, принятый ответ не сильно отличается от того, как этот checkметод реализован в Capybara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan
Спасибо, и это тот же ответ в соответствии с документами: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Найдите флажок и отметьте его как установленный. Флажок можно найти по имени, идентификатор или текст метки ".
Майк Валлано
10

Если поле связано с текстом, например, "Вариант 3", то capybara 3.0.3вы можете просто сделать

check 'Option 3'
Obromios
источник
1
Этот ответ должен быть вверху, а не синтаксис 8-летней давности.
sloneorzeszki
собственно для сценария, описанного автором, ответ от @samuel правильный
VP.
6

Я знаю, что это более старый вопрос, но я сам работал над этим, и, попробовав все вышеперечисленное, это то, что наконец сработало для меня:

find("input[type='checkbox'][value='#{cityID.id}']").set(true)

Надеюсь, это кому-то поможет. Я использую Capybara 2.4.4.

Майкл Круз
источник
4

Старая тема, но другое решение:

check('Option 3', allow_label_click: true)

Самуил
источник
1

вы также можете использовать: xpath вместо: css, если у вас возникли проблемы с его поиском.

find (: xpath, '//*[@id="example" visible').set(true)

в Chrome (и, конечно, в других браузерах) вы можете «проверить элемент», а затем, щелкнув правой кнопкой мыши по интересующему вас элементу, есть «копировать xpath», если вы не знаете, что такое xpath, теперь вы это делаете.

kulssaka
источник
1

Вы также можете проверить, что все флажки не отмечены в этом примере.

все ('input [type = checkbox]'). each do | checkbox | checkbox.should_not be_checked end

user3853159
источник
1

.set (true) у меня не сработал, поэтому мне пришлось вызвать .click:

find(...).click

HectorPerez
источник
(1) Я не думаю, что clickсама по себе является действительной командой capybara (или, по крайней мере, если это так, ее, похоже, нет в документации), и (2) если бы это было так, она, вероятно, переключила бы флажок, не убедитесь, что он был
включен
1

Возникли проблемы с настраиваемым флажком, который скрыт за элементом метки. Нужен былallow_label_click: true .

Что касается этого сообщения в блоге ,

check 'checkbox[name]', allow_label_click: true
Vic
источник
Спасибо! Это отлично работало с настраиваемым полем флажка Boostrap 4. Кроме того, если вам нужно снять этот флажок, вы можете: снять флажок 'checkbox [name]', allow_label_click: true
pastullo
0
check find(".whenever input")[:id]

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

Виллиан Тенфен Вазилевски
источник
0

установить флажок

  check 'name_of_checkbox'
Видур Пендж
источник