Capybara中取消选中复选框的正确方法

3

在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,但是我发现了一些奇怪的事情:尽管我在测试中断言checked?为nil,但页面仍然显示复选框已被选中。 save_and_open_page也显示相同的结果。看起来复选框自页面加载以来就没有改变。

问题:

  • 为什么uncheckset(false)不能更改表单HTML?为了使我的测试通过,与field相关的某个元素必须取消选中。是否存在page.bodyuncheck处理的内容之间的某种不连贯性?
  • 取消选中复选框的规范方式是什么?由于uncheck是API的一部分且易于使用,因此它似乎是调用此类操作的正确函数,但它未更改page.body的事实让我担忧。

相关问题:

提前感谢!

1个回答

7
Capybara将#uncheck实现为find(...).set(false),因此对现有元素调用set(false)或使用定位字符串调用uncheck会对元素执行相同的操作,并且如果框已经未选中,则保持未选中状态。如果您正在使用JS驱动程序(而不是默认的rack-test驱动程序),则在复选框上调用#click将切换状态(除非某些JS捕获/阻止点击),因此如果您想取消选择框,则应该使用uncheckset(false)
至于为什么它不更新html,这是由于HTML属性和属性之间的区别。在框上调用uncheck会更改元素的“checked”属性,但这不会更改属性(属性保持初始状态,属性是当前状态)。这是期望的和正确的,属性是随表单一起提交的内容。
注意:对于rack_test驱动程序,#checked?返回“checked”而不是true是一个错误,在下一个Capybara版本中将进行修复。您应该使用像expect(field).to be_checked这样的语句,而不是eq('checked'),以避免未来出现问题。
注意:save_and_open_page-保存HTML(属性),然后加载它-它不保存元素的属性,因此在测试期间,它可能会显示复选框处于实际状态不同的状态。

我曾认为save_and_open_page是某种DOM快照。由于它只是原始页面的HTML,所以我的功能规格说明的当前行为是有意义的。谢谢! - Stratus3D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接