【问题标题】:Proper way to uncheck a checkbox in Capybara在 Capybara 中取消选中复选框的正确方法
【发布时间】:2016-02-01 13:15:04
【问题描述】:

在 Capybara 集成测试中取消选中复选框的正确方法是什么?我有一个需要取消选中的复选框列表。我已经使用all 选择了它们:

checkboxes = all("input[type='checkbox']")

为了取消选中我使用的每个each。根据我在 StackOverflow 上找到的信息,应该有三种方法可以取消选中复选框:

uncheck(field)
field.click
field.set(false)

为了测试这些不同的方法是否我创建了以下测试(每个测试都在同一页面上的单独场景中):

使用uncheck成功了:

checkboxes = all("input[type='checkbox']")
checkboxes.each { |field| expect(field.checked?).to eq("checked") }
checkboxes.each { |field| uncheck(field[:id]) }
checkboxes.each { |field| expect(field.checked?).to eq(nil) }
puts page.body
save_and_open_page

使用click 失败了,所以我认为这是取消选中该字段的不正确方法:

checkboxes = all("input[type='checkbox']")
checkboxes.each { |field| expect(field.checked?).to eq("checked") }
checkboxes.each { |field| field.click }
checkboxes.each { |field| expect(field.checked?).to eq(nil) }
puts page.body
save_and_open_page

使用set(false) 成功了:

checkboxes = all("input[type='checkbox']")
checkboxes.each { |field| expect(field.checked?).to eq("checked") }
checkboxes.each { |field| field.set(false) }
checkboxes.each { |field| expect(field.checked?).to eq(nil) }
puts page.body
save_and_open_page

我想我应该只使用uncheck,但后来我注意到一些奇怪的事情:page.body 仍然显示复选框为选中状态,即使我在测试中断言checked? 为 nil。 save_and_open_page 显示了同样的事情。自页面加载以来,复选框似乎没有更改。

问题:

  • 为什么uncheck 和set(false) 不改变HTML 表单?在 订购表格我的测试以通过与field 相关的一些元素 未选中。 page.body 和 uncheck 处理什么?
  • 取消选中复选框的规范方法是什么?由于uncheck 是 API 的一部分并且易于使用,因此它似乎是调用此类事情的正确函数,但它并没有改变 page.body 的事实让我感到担忧。

相关问题:

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby checkbox capybara simple-form


    【解决方案1】:

    Capybara 将#uncheck 实现为find(...).set(false),因此在现有元素上调用set(false) 或使用定位符字符串调用uncheck 对元素执行相同的操作,如果它已经取消选中,则会留下一个未选中的框。如果您使用的是支持 JS 的驱动程序(不是默认的机架测试驱动程序),在复选框上调用 #click 将切换状态(除非某些 JS 正在捕获/阻止点击),所以如果您想要取消选中该框,您想要正在使用uncheck 或set(false)

    至于为什么不更新html,你是遇到了html属性和属性的区别。在框上调用uncheck 会更改元素的“已选中”属性,但这不会更改属性(属性保持在初始状态,属性是当前状态)。这是预期且正确的,属性是随表单提交的内容。

    注意:#checked 的事实?对于 rack_test 驱动程序返回“已检查”而不是 true 是一个错误,将在下一个 Capybara 版本中修复。您应该使用 expect(field).to be_checked 而不是 eq('checked') 之类的东西,以免将来出现问题

    注意:save_and_open_page - 保存 html(属性)然后加载它 - 它不保存元素的属性,因此它很可能会在测试期间显示复选框处于实际不存在的状态

    【讨论】:

    • 我在想save_and_open_page 就像某种 DOM 快照。由于它只是原始页面的 HTML,因此我的功能规范的当前行为是有意义的。谢谢!
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多