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

时间:2016-02-01 13:15:04

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

在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?为零。 save_and_open_page显示了同样的事情。似乎自页面加载后复选框没有更改。

问题:

  • 为什么我不会uncheckset(false)更改HTML表单?在 命令从我的测试中传递一些与field相关的元素 不加控制。 page.body和之间是否存在脱节? uncheck处理什么?
  • 取消选中复选框的规范方法是什么?由于uncheck是API的一部分并且易于使用,因此它似乎是调用此类事物的正确功能,但事实上它不会改变page.body

相关问题:

提前致谢!

1 个答案:

答案 0 :(得分:5)

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

至于为什么它没有更新html,你会遇到html属性和属性之间的区别。在框中调用uncheck会更改“已检查”状态。元素的属性,但不会改变属性(属性保持初始状态,属性是当前状态)。这是预期和正确的,属性是与您的表单一起提交的。

注意:#checked的事实?正在回来"检查"而不是true的rack_test驱动程序是一个错误,并将在下一个Capybara版本中修复。您应该使用类似expect(field).to be_checked而非eq('已检查')的内容,以便将来不会出现问题

注意:save_and_open_page - 保存html(属性)然后加载它 - 它不保存元素的属性,所以它很可能会显示一个状态,它们在测试期间实际上并不存在< / p>