Як встановити прапорець у капібарі?


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 MI має якийсь непарний ідентифікатор з порожніми дужками, тому для прикладу перевірки ... find(:css, "#cityID[value='62']").set(true)буде працювати, але find(:css, "#cityID[][value='62']").set(true)не буде знайдено і не вдасться. Як запустити ту саму функцію з порожнім ідентифікатором дужки?
TangibleDream

1
@TangibleDream просто для уточнення - ви хочете сказати, що прапорець має ідентифікатор '[]'?
Джон М

1
Я взагалі не міг знайти спосіб зробити цю роботу із селектором CSS! Має бути якийсь спосіб уникнути квадратної дужки, але я не зміг її знайти. Мені довелося вдатися до пошукача XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Джон М

3
Чи можу я зазначити цю відповідь вниз ... Я знаю, що вона працює, але її лічильник інтуїтивно зрозумів відповідь, яка не входить у простий доступний api: позначте ("ім'я, ідентифікатор або текст тут") (див. Відповідь нижче)
Code Novitiate

137

Краще не створювати кілька елементів з одним і тим же ідентифікатором , щоб (і не тільки для цього) можна було легко встановити / зняти прапорець з елегантним

check 'cityID'
uncheck 'cityID'

Якщо ви не можете уникнути декількох елементів з однаковим ідентифікатором і все-таки потрібно встановити прапорець із певним значенням , він може це зробити

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

Більше інформації про маніпуляції з введенням капібари можна знайти тут


2
Також краще не створювати кілька елементів з однаковим ідентифікатором, оскільки це недійсний HTML. Це не повинно бути проблемою при правильному використанні рейок.
ihaztehcodez

1
Хочу додати, що прапорець / зніміть прапорець приймає лише такі значення: id, ім'я або пов'язаний елемент мітки. Тут ви можете прочитати більше про це.
Неша Зорич

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метод використання .


1
тверда відповідь, здається, чистішою, ніж прийнята відповідь за допомогою селекторів css (навіть якщо це
тест

1
Так, це найкраща відповідь. Він чистіший і тісно імітує дії користувача. Це не забруднює форму зайвими ідентифікаторами, і це робить тести легкими для читання.
B Сім

Я згоден, це чистіше. Цікаво, що прийнята відповідь не сильно відрізняється від checkспособу, який реалізується в Капібарі. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan

Дякуємо, і це та сама відповідь згідно з документами: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Знайдіть прапорець і позначте його як позначене. Позначення можна знайти за ім'ям, текст id або етикетки. "
Майк Валлано

26

Я думаю, вам, можливо, доведеться , перш за все, надати унікальні idелементи елементів вашої форми .

Але що стосується Capybara та прапорців, метод Capybara :: Node :: Actions # check instance дозволить вам знайти та встановити прапорець за іменем, ідентифікатором чи текстом мітки.


10

Якщо вікно асоціюється з текстом, наприклад, "Варіант 3", capybara 3.0.3ви можете просто зробити це

check 'Option 3'

1
Ця відповідь має бути вгорі, а не 8-річному синтаксисі.
sloneorzeszki

насправді для сценарію, описаного автором, відповідь від @samuel правильна власна
ВП.

6

Я знаю, що це питання старіше, але я сам працював над цим і перепробував усе вищесказане, ось що, нарешті, спрацював для мене:

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

Сподіваюся, це комусь корисно. Я використовую Capybara 2.4.4.



1

Ви також можете використовувати: xpath замість: css, якщо у вас є проблеми з його пошуку.

знайти (: xpath, '//* evidence@id="example"Sense').set(true)

У Chrome (і, звичайно, в інших браузерах) ви можете "перевірити елемент", а потім клацнувши правою кнопкою миші на цікавить вас елемент, з'являється "копіювати xpath", якщо ви не знаєте, що таке xpath, тепер ви це робите.


1

Ви також можете перевірити, що всі прапорці не позначені цим прикладом.

all ('input [type = checkbox]'). Кожен do | checkbox | checkbox.should_not be_cked кінець


1

.set (true) не працював для мене, тому мені довелося зателефонувати .click:

find(...).click


(1) Я не думаю, що clickсама по собі є дійсною командою capybara (або принаймні, якщо вона є, це не здається в документах), і (2) якби вона була, вона, ймовірно, переключить прапорець, не переконайтесь, що він увімкнено чи вимкнено
NotAnAmbiTurner

1

Були деякі проблеми із користувацьким прапором, який прихований за елементом мітки Був потрібен allow_label_click: true.

З посиланням на цю публікацію в блозі ,

check 'checkbox[name]', allow_label_click: true

Дякую! Це чудово спрацювало з користувацьким полем Boostrap 4. Крім того, якщо вам потрібно зняти прапорець, ви можете: зняти прапорець "прапорець [ім'я]", дозволити_label_click: true
pastullo

0
check find(".whenever input")[:id]

Я думаю, що це змусить capybara чекати будь-якого слухача подій, приєднаного до цього входу, який іноді болить у дупі, якщо він не чекає .... Якщо цей вхід не має ідентифікатора, виберіть іншу властивість (має бути один) ...


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.