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

Str*_*s3D 1 ruby checkbox ruby-on-rails capybara simple-form

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

checkboxes = all("input[type='checkbox']")
Run Code Online (Sandbox Code Playgroud)

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

uncheck(field)
field.click
field.set(false)
Run Code Online (Sandbox Code Playgroud)

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

使用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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

问题:

  • 为什么不uncheck和set(false)改变HTML表单?为了形成我的测试传递一些与之关联的元素field必须取消选中.是否有一些脱节page.body和什么uncheck处理?
  • 取消选中复选框的规范方法是什么?因为它uncheck是API的一部分并且易于使用,所以它似乎是适当的函数来调用这种东西,但事实上它不会改变page.body我的想法.

相关问题:

提前致谢!

Tho*_*ole 5

水豚实现#uncheck为find(...).set(false)使调用set(false)现有的元件上,或者uncheck用一个定位器字符串都在做同样的事情元素,并会留下一个未选中状态,如果它已经选中.如果您正在使用支持JS的驱动程序(不是默认的机架测试驱动程序),则调用#click复选框将切换状态(除非某些JS正在捕获/阻止点击),因此如果您希望取消选中该框,则需要使用uncheck或set(false)

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

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

注意:save_and_open_page - 保存html(属性)然后加载它 - 它不保存元素的属性,所以它很可能显示在测试期间它们实际上不在的状态下的复选框