【问题标题】:Check for temporary element with Capybara使用 Capybara 检查临时元素
【发布时间】:2019-11-22 01:48:01
【问题描述】:

一个元素在点击后短暂出现,然后在服务器返回响应后消失。这是当前代码:

#send request to server
something.click
#make sure temporary element appears
expect(page).to have_css('#foo')
#make sure temporary element disappears after server returns response
expect(page).to have_no_css('#foo')

有时元素会消失得如此之快,以至于第一个期望无法识别它的存在并且测试失败。但是,如果第一个期望被删除,第二个期望可能会在元素首次出现之前执行,并且我们无法成功测试不存在。

有没有更好的方法来测试 Capybara 中短暂出现的元素?

编辑:测试元素是否消失就足够了,但考虑到水豚不应该使用睡眠。

【问题讨论】:

    标签: ruby rspec capybara


    【解决方案1】:

    浏览器测试的异步特性意味着使用默认设置并不总是能够可靠地定位临时元素。既然你说你可以确保元素已经消失,并且你有一个时间框架,你可以可靠地保证元素会出现在你可以做类似的事情

    #send request to server
    something.click
    #wait for temporary element to appear - don't error if it doesn't
    page.has_css?('#foo', wait: 2)
    #make sure temporary element disappears after server returns response
    expect(page).to have_no_css('#foo')
    

    这将等待最多 2 秒(根据需要进行调整)以使元素出现。如果它确实出现了,它将在元素可见后立即继续,否则它将在 2 秒后返回 false 并继续。

    如果确实需要检测元素的出现和消失,那么任何解决方案都将取决于究竟是什么触发了元素的显示和移除。假设它是一个请求发生的指示器,它在请求开始时出现,然后在请求完成时被删除,您需要考虑减慢请求,以便元素保持可见的时间更长。可以实现的两种方法是

    1. 像 puffing-billy 这样的可编程代理
    2. 如果在 Chrome 中使用 Selenium 驱动程序,您可以使用 page.driver.browser.set_network_conditions,尽管这将是特定于驱动程序的解决方案。

    【讨论】:

    • 似乎是正确的答案。谢谢你。将在星期一进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多