在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
也显示相同的结果。看起来复选框自页面加载以来就没有改变。
问题:
- 为什么
uncheck
和set(false)
不能更改表单HTML?为了使我的测试通过,与field
相关的某个元素必须取消选中。是否存在page.body
和uncheck
处理的内容之间的某种不连贯性? - 取消选中复选框的规范方式是什么?由于
uncheck
是API的一部分且易于使用,因此它似乎是调用此类操作的正确函数,但它未更改page.body
的事实让我担忧。
相关问题:
提前感谢!
save_and_open_page
是某种DOM快照。由于它只是原始页面的HTML,所以我的功能规格说明的当前行为是有意义的。谢谢! - Stratus3D