在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
显示了同样的事情。似乎自页面加载后复选框没有更改。
问题:
uncheck
和set(false)
更改HTML表单?在
命令从我的测试中传递一些与field
相关的元素
不加控制。 page.body
和之间是否存在脱节?
uncheck
处理什么?uncheck
是API的一部分并且易于使用,因此它似乎是调用此类事物的正确功能,但事实上它不会改变page.body
。 相关问题:
提前致谢!
答案 0 :(得分:5)
Capybara将#uncheck
实现为find(...).set(false)
,因此在现有元素上调用set(false)
或使用定位器字符串调用uncheck
对元素执行相同的操作,并且将保留如果已经取消选中,则取消选中该框。如果您正在使用支持JS的驱动程序(不是默认的机架测试驱动程序),则在复选框上调用#click
将切换状态(除非某些JS正在捕获/阻止点击),所以如果您想要取消选中此框想要使用uncheck
或set(false)
至于为什么它没有更新html,你会遇到html属性和属性之间的区别。在框中调用uncheck
会更改“已检查”状态。元素的属性,但不会改变属性(属性保持初始状态,属性是当前状态)。这是预期和正确的,属性是与您的表单一起提交的。
注意:#checked的事实?正在回来"检查"而不是true
的rack_test驱动程序是一个错误,并将在下一个Capybara版本中修复。您应该使用类似expect(field).to be_checked
而非eq('已检查')的内容,以便将来不会出现问题
注意:save_and_open_page - 保存html(属性)然后加载它 - 它不保存元素的属性,所以它很可能会显示一个状态,它们在测试期间实际上并不存在< / p>