【问题标题】:testing show/hide with minitest capybara rails用 minitest capybara rails 测试显示/隐藏
【发布时间】:2017-02-22 19:04:25
【问题描述】:

我正在尝试在单击按钮后测试 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”

【问题讨论】:

    标签: ruby-on-rails capybara integration-testing minitest


    【解决方案1】:

    默认情况下,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? 断言,错误消息将更具描述性

    【讨论】:

    • assert_selector(:css, '#visu') 即使它被隐藏也能找到它,那么如何检查我是否正在使用 rack_test?
    • @Ayrad 阅读了以“如果另一方面”开头的答案部分,它已经得到了回答,只需将“hide_me”替换为在您的应用程序中隐藏元素的任何类名 - 从您的示例来看,它可能是“隐藏的” '
    • 是的,我确实阅读并应用了第二部分 assert_selector(:css, '#visu.hidden') 效果很好,但 assert_selector(:css, '#visu:not(.hidden)') 没有' t 因为 jquery 不会从我想的元素中删除 .hidden
    • @Ayrad 如果您使用的是 rack_test,那么 JQuery 没有做任何事情 - rack_test 驱动程序不支持 JS - 您需要使用支持 JS 的驱动程序来测试任何依赖于 JS 行为的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多