默认情况下,Capybara 只查找可见元素,所以如果您使用的是完全处理 CSS 的驱动程序之一(几乎除了 rack_test 之外的任何东西),那么就这样做
assert_selector(:css, '#visu')
足以检查可见元素。如果你想检查一个元素是否特别不可见,你需要这样做
assert_selector(:css, '#visu', visible: :hidden)
因此,要测试一个元素是否被隐藏然后变得可见,您可以这样做
assert_selector(:css, '#visu', visible: :hidden)
click_button("Show/hide")
assert_selector(:css, '#visu')
请注意,检查元素是否存在但不可见实际上可能没有意义,仅检查元素是否不存在(可能隐藏,可能不存在)可能更有意义,因为这样如果按钮行为更改为加载元素(或呈现模板)测试不会中断(并且行为的更改不会改变用户体验)。要做到这一点,你可以这样做
refute_selector(:css, '#visu') # or assert_no_selector depending on preference
click_button('Show/hide')
assert_selector(:css, '#visu')
另一方面,如果您使用的是 rack_test 驱动程序,它只会处理 CSS/属性的一小部分以确定可见性。在这种情况下,如果元素的内联样式属性包含display: none/display:none 或者如果元素具有hidden 属性(不是“隐藏”的类名),则元素被认为是不可见的。因此,如果该元素被一个在外部 css 文件中应用 display:none 的类名“hide_me”隐藏,rack_test 不会认为该元素是隐藏的。相反,你可以做类似的事情
assert_selector(:css, '#visu.hide_me')
完整的测试类似于
assert_selector(:css, '#visu.hide_me')
click_button("Show/hide")
assert_selector(:css, '#visu:not(.hide_me)')
注意:如果您没有更改 Capybara.default_selector,可以省略 :css 选择器类型参数。此外,使用assert_selector 断言而不是使用assert page.has_xxx? 断言,错误消息将更具描述性