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

Posted

技术标签:

【中文标题】如何检查水豚中的复选框?【英文标题】:How to check a checkbox in capybara? 【发布时间】:2012-01-08 00:24:50 【问题描述】:

我正在使用 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">

【问题讨论】:

您的输入不应具有相同的 ID - 它们应具有相同的名称,但不同的 ID。 【参考方案1】:

我发现以下内容对我有用:

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

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

【讨论】:

@Jon M 我有一些带有空括号的奇怪 id,所以对于检查示例...find(:css, "#cityID[value='62']").set(true) 可以工作,但 find(:css, "#cityID[][value='62']").set(true) 将找不到并且失败。如何使用空括号 id 运行相同的函数? @TangibleDream 澄清一下 - 你是说复选框的 ID 为“[]”? @Jin M 是的,看起来是这样的&lt;input type="checkbox" name="Extrapainful[]" id="Extrapainful[]" ''="" value="12345" onclick="selectThisPain(this);"&gt; 我根本找不到使用 CSS 选择器的方法!必须有某种方法可以逃脱方括号,但我找不到它。我不得不求助于 XPath 查找器:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true) 我可以标记这个答案吗...我知道它有效,但是标记不属于可用简单 api 的答案是反直觉的:check('name, id or text这里')(见下面的答案)【参考方案2】:

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

check 'cityID'
uncheck 'cityID'

如果一个人无法避免多个元素具有相同的 id 并且仍然需要选中一个复选框具有一定的价值,他可以这样做

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

关于capybara输入操作的更多信息可以在here

找到

【讨论】:

最好不要创建具有相同 id 的多个元素,因为它不是有效的 html。如果正确使用 Rails 表单助手,这应该不是问题。 我想补充一点,复选框/取消选中仅接受以下值:id、名称或相关标签元素。 Here您可以阅读更多相关信息。【参考方案3】:

在运行 capybara 测试时,您得到了 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方法即可。

【讨论】:

可靠的答案,似乎比使用 css 选择器接受的答案更干净(即使这是检查方法在幕后所做的) 是的,这是最好的答案。它更干净,并且紧密地模仿了用户操作。它不会用额外的 id 污染表单,并且使测试易于阅读。 我同意这更干净。有趣的是,接受的答案与在 Capybara 中实现 check 方法的方式没有太大区别。 def check(locator, options=) find(:checkbox, locator, options).set(true) end 谢谢,根据文档,这是相同的答案:rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/…“找到一个复选框并将其标记为选中。可以通过名称、ID 或标签文本找到该复选框。” 【参考方案4】:

我想你可能需要give unique ids to your form elements,首先。

但对于 Capybara 和复选框,Capybara::Node::Actions#check instance method 将允许您按名称、ID 或标签文本查找和检查复选框。

【讨论】:

【参考方案5】:

如果框与文本相关联,例如'选项 3',然后从 capybara 3.0.3 你可以这样做

check 'Option 3'

【讨论】:

这个响应应该在顶部,而不是 8 年前的语法。 其实对于作者描述的场景,@samuel 的答案是正确的自己【参考方案6】:

我知道这是一个较老的问题,但我自己一直在解决这个问题,并且尝试了以上所有方法,这最终对我有用:

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

希望这对某人有所帮助。我正在使用 Capybara 2.4.4。

【讨论】:

【参考方案7】:

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

check('Option 3', allow_label_click: true)

【讨论】:

【参考方案8】:

隐藏在标签元素后面的自定义复选框有一些问题。需要allow_label_click: true

参考这个blog post,

check 'checkbox[name]', allow_label_click: true

如果您的标签中有“我同意terms and conditions”之类的链接,上面的代码将打开页面,这不是您想要的。

改为这样做。

find(:css, "#checkbox_id", visible: false).execute_script('this.checked = true')

【讨论】:

谢谢!这与 Boostrap 4 自定义复选框字段完美配合。此外,如果您需要取消选中它,您可以:取消选中 'checkbox[name]', allow_label_click: true【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

您还可以通过此示例检查是否所有复选框都未选中。

all('input[type=checkbox]').each 都做 |checkbox| checkbox.should_not be_checked 结束

【讨论】:

【参考方案11】:

.set(true) 对我不起作用,所以我不得不调用 .click:

find(...).click

【讨论】:

(1) 我不认为 click 本身是一个有效的水豚命令(或者至少如果是,它似乎不在文档中),并且 (2)如果是,它可能会切换复选框,不确定它是打开还是关闭【参考方案12】:
check find(".whenever input")[:id]

我认为这将使 capybara 等待任何附加到该输入的事件侦听器,如果它不等待,这有时会让人头疼.... 如果该输入没有 ID,请选择另一个属性(必须有一个)...

【讨论】:

【参考方案13】:

选中复选框

  check 'name_of_checkbox'

【讨论】:

以上是关于如何检查水豚中的复选框?的主要内容,如果未能解决你的问题,请参考以下文章

检查数组中的另一个复选框后如何禁用复选框

如何根据角度 7 中的某些值默认检查特定复选框

django 表单:如何检查模板中的复选框状态

如何使用 C# 检查 datagridview 中的多个复选框

如何检查表格中的所有复选框并使用JS为每个复选框做一项工作

使用表格中的复选框检查后如何获取值?