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

Proper way to uncheck a checkbox in Capybara

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

选择了它们
checkboxes = all("input[type='checkbox']")

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

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 显示了同样的事情。自页面加载以来,复选框似乎没有改变。

问题:

相关问题:

提前致谢!

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

至于为什么不更新html,你遇到的是html属性和属性的区别。在框上调用 uncheck 会更改元素的 'checked' 属性,但这不会更改属性(属性保持初始状态,属性 是当前状态)。这是预期的并且是正确的,属性 是与您的表单一起提交的内容。

注意:#checked 的事实?对于 rack_test 驱动程序返回 "checked" 而不是 true 是一个错误,将在下一个 Capybara 版本中修复。您应该使用 expect(field).to be_checked 而不是 eq('checked') 这样的东西,这样以后就不会出现问题

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