在 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
显示了同样的事情。自页面加载以来,复选框似乎没有改变。
问题:
- 为什么
uncheck
和 set(false)
不改变形式 HTML?在
订购我的测试以通过与 field
相关的一些元素
取消选中。 page.body
和
uncheck
处理什么?
- 取消选中复选框的规范方法是什么?由于
uncheck
是 API 的一部分并且易于使用,因此它似乎是调用此类函数的正确函数,但它没有改变 page.body
的事实让我担心。
相关问题:
- How to check a checkbox in capybara?
提前致谢!
Capybara 将 #uncheck
实现为 find(...).set(false)
,因此在现有元素上调用 set(false)
或使用定位器字符串调用 uncheck
对元素执行相同的操作,并将如果一个框已经取消选中,则将其保留为未选中状态。如果您使用的是支持 JS 的驱动程序(不是默认的机架测试驱动程序),则在复选框上调用 #click
将切换状态(除非某些 JS 是 capturing/blocking 的点击),所以如果您想要该框未选中您要使用 uncheck
或 set(false)
至于为什么不更新html,你遇到的是html属性和属性的区别。在框上调用 uncheck
会更改元素的 'checked' 属性,但这不会更改属性(属性保持初始状态,属性 是当前状态)。这是预期的并且是正确的,属性 是与您的表单一起提交的内容。
注意:#checked 的事实?对于 rack_test 驱动程序返回 "checked" 而不是 true
是一个错误,将在下一个 Capybara 版本中修复。您应该使用 expect(field).to be_checked
而不是 eq('checked') 这样的东西,这样以后就不会出现问题
注意:save_and_open_page - 保存 html(属性)然后加载它 - 它不保存元素的属性,因此它很可能会以它们不存在的状态显示复选框实际上在测试期间
在 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
显示了同样的事情。自页面加载以来,复选框似乎没有改变。
问题:
- 为什么
uncheck
和set(false)
不改变形式 HTML?在 订购我的测试以通过与field
相关的一些元素 取消选中。page.body
和uncheck
处理什么? - 取消选中复选框的规范方法是什么?由于
uncheck
是 API 的一部分并且易于使用,因此它似乎是调用此类函数的正确函数,但它没有改变page.body
的事实让我担心。
相关问题:
- How to check a checkbox in capybara?
提前致谢!
Capybara 将 #uncheck
实现为 find(...).set(false)
,因此在现有元素上调用 set(false)
或使用定位器字符串调用 uncheck
对元素执行相同的操作,并将如果一个框已经取消选中,则将其保留为未选中状态。如果您使用的是支持 JS 的驱动程序(不是默认的机架测试驱动程序),则在复选框上调用 #click
将切换状态(除非某些 JS 是 capturing/blocking 的点击),所以如果您想要该框未选中您要使用 uncheck
或 set(false)
至于为什么不更新html,你遇到的是html属性和属性的区别。在框上调用 uncheck
会更改元素的 'checked' 属性,但这不会更改属性(属性保持初始状态,属性 是当前状态)。这是预期的并且是正确的,属性 是与您的表单一起提交的内容。
注意:#checked 的事实?对于 rack_test 驱动程序返回 "checked" 而不是 true
是一个错误,将在下一个 Capybara 版本中修复。您应该使用 expect(field).to be_checked
而不是 eq('checked') 这样的东西,这样以后就不会出现问题
注意:save_and_open_page - 保存 html(属性)然后加载它 - 它不保存元素的属性,因此它很可能会以它们不存在的状态显示复选框实际上在测试期间