Ruby on rails 使用minitest capybara rails进行测试显示/隐藏

Ruby on rails 使用minitest capybara rails进行测试显示/隐藏,ruby-on-rails,capybara,integration-testing,minitest,Ruby On Rails,Capybara,Integration Testing,Minitest,我试图在单击按钮后测试div的可见性 assert page.find("#visu")[:class].include?("hidden") # this passes assert page.has_xpath?("//*[@id='visu'][contains(@style, 'display: none')]") click_button("Show/hide") assert page.has_xpath?("//*[@id='visu'][contains(

我试图在单击按钮后测试div的可见性

   assert page.find("#visu")[:class].include?("hidden") # this passes
   assert page.has_xpath?("//*[@id='visu'][contains(@style, 'display: none')]")
   click_button("Show/hide")
   assert page.has_xpath?("//*[@id='visu'][contains(@style, 'display: block')]")
不幸的是,这不起作用。有什么建议吗


我使用的是“minitest rails capybara”

默认情况下,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_测试驱动程序,它只处理CSS/属性的一部分来确定可见性。在这种情况下,如果元素内联样式属性包含
显示:无
/
显示:无
或元素具有
隐藏
属性,则认为元素不可见如果元素被隐藏在一个类名“HiDyMe”中,应用了<代码>显示:在外部CSS文件中,没有一个“//CODE”,RACKYST测试不会认为这个元素是隐藏的,而是可以做一些类似于

的事情。
assert_selector(:css, '#visu.hide_me')
assert_selector(:css, '#visu.hide_me')
click_button("Show/hide")
assert_selector(:css, '#visu:not(.hide_me)')
而完整的测试应该是这样的

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_选择器,则可以省略:css选择器类型参数。此外,使用
assert_选择器
断言比执行
assert页面更具描述性。has_xxx?

assert_选择器(:css,#visu'))即使它是隐藏的,也能找到它,那么我如何才能检查我是否使用了rack_test?@Ayrad阅读答案中以“如果另一方面”开头的部分,它已经回答了,只需将“hide_me”替换为应用程序中隐藏元素的任何类名-从您的示例来看,它可能是“隐藏的”是的,我确实阅读并应用了第二部分断言选择器(:css,#visu.hidden')工作正常,但assert_选择器(:css,#visu:not(.hidden))不会,因为jquery不会从元素I中删除.hiddensuppose@Ayrad如果您使用的是rack_test,那么JQuery没有做任何事情-rack_test驱动程序不支持JS-您需要使用支持JS的驱动程序来测试依赖于JS行为的任何事情