测试用minitest水豚轨道显示/隐藏

问题描述:

我想单击按钮后测试div的可见性。测试用minitest水豚轨道显示/隐藏

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护栏,水豚”

默认情况下只水豚发现可见的元素,所以如果你使用的是完全处理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属性(不是类名称为“隐藏”),则认为该元素不可见。所以如果元素被类名'hide_me'隐藏,在外部css文件中应用display:none,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?

+0

assert_selector要多得多描述(:CSS,“#visu”)发现它,即使它是隐藏的,所以我怎么能检查,如果我使用rack_test? – Ayrad

+0

@Ayrad阅读从'如果'另一方面'已经回答'的部分,只需用你的应用中的任何类名称隐藏元素替换'hide_me' - 从你的例子中可能'隐藏' –

+0

是的,我确实阅读过应用第二部分assert_selector(:css,'#visu.hidden')完美工作,但assert_selector(:css,'#visu:not(.hidden)')不会因为jquery不会从元素I中删除.hidden假设 – Ayrad