如何检查水豚中的复选框?
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 是的,看起来是这样的<input type="checkbox" name="Extrapainful[]" id="Extrapainful[]" ''="" value="12345" onclick="selectThisPain(this);">
我根本找不到使用 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 id
s 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'
【讨论】:
以上是关于如何检查水豚中的复选框?的主要内容,如果未能解决你的问题,请参考以下文章