如何选中水豚中的复选框?


126

我正在使用Rspec和Capybara。

如何编写检查步骤checkbox?我已经尝试过check通过价值,但找不到我的checkbox。我不确定该怎么办,因为我实际上拥有相同的ID,但值不同

这是代码:

 <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
您的输入不应具有相同的ID-它们应该具有相同的名称,但具有不同的ID。
SamStephens

Answers:


156

我发现以下对我有用:

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

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

1
听到那个消息很开心!也许您会将此答案标记为“已接受”,并且可能会投票赞成... :)
Jon M

@Jon MI有一些带有空括号的奇数ID,因此对于检查示例... find(:css, "#cityID[value='62']").set(true)将起作用,但find(:css, "#cityID[][value='62']").set(true)将找不到并失败。如何使用空括号ID运行相同的功能?
TangibleDream

1
@TangibleDream只是要澄清-您是说复选框的ID为“ []”吗?
乔恩·M

1
我根本找不到一种使CSS选择器起作用的方法!必须有某种逃脱方括号的方法,但我找不到它。我不得不求助于XPath查找器:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
我可以将这个答案标记为下吗...我知道它可以工作,但是它的反直观标记了一个不属于可用的简单api的答案:check('name,id or text here')(参见下面的答案)
代码Novitiate

137

最好不要创建具有相同id的多个元素,这样(不仅如此),您可以轻松地选中/取消选中带有雅致的复选框

check 'cityID'
uncheck 'cityID'

如果不能避免多个具有相同id的元素,而仍然需要选中具有特定值的复选框,则可以使用

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

有关水豚输入操作的更多信息,请参见此处。


2
最好不要创建具有相同id的多个元素,因为它不是有效的HTML。如果正确使用rails form helper,那应该不是问题。
ihaztehcodez

1
我想补充一点,复选框/取消选中仅接受以下值:id,名称或相关标签元素。在这里您可以了解更多有关它的信息。
Nesha Zoric '18

58

运行水豚测试时,您得到了page对象。您可以使用它来选中/取消选中任何复选框。正如@buruzaemon已经提到的:

以按名称,ID或标签文本查找和选中复选框。

因此,假设您在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
是的,这是最好的答案。它更干净,并且紧密模仿用户的操作。它不会污染带有额外ID的表单,并且使测试易于阅读。
B 2015年

我同意这更干净。但是,有趣的是,可接受的答案与check在Capybara中实现该方法的方式没有太大不同。def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan 2015年

谢谢,根据文档,答案是相同的:rubydoc.info/github/jnicklas/capybara/master/Capybara/Node / ... “找到一个复选框并将其标记为已选中。该复选框可通过名称找到, id或标签文字。”
迈克·瓦拉诺


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。


4

一个古老的话题但另一个解决方案是:

check('Option 3', allow_label_click: true)


1

如果在查找时遇到问题,也可以使用:xpath代替:css。

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

在Chrome(当然还有其他浏览器)上,您可以“检查元素”,然后右键单击您感兴趣的元素,如果您不知道xpath是什么,则可以“复制xpath”,现在您可以了。


1

您也可以在此示例中检查所有复选框是否均未选中。

all('input [type = checkbox]')。each | checkbox | checkbox.should_not_checked结束


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自定义复选框字段完美配合。另外,如果您需要取消选中它,则可以:取消选中'checkbox [name]',allow_label_click:true
pastullo

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

我认为这将使capybara等待连接到该输入的任何事件侦听器,如果不等待,有时会很痛苦....如果该输入没有ID,请选择另一个属性(必须有一个)...


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.