【问题标题】:Ruby selenium/capybara wait for element to go awayRuby selenium/capybara 等待元素消失
【发布时间】:2018-07-31 10:30:03
【问题描述】:

我知道这不是一个独特的问题,但我还没有找到实际的解决方案...我有一个页面在加载时有一个微调器。我希望我的 ruby​​ rspec 做的是等待微调器在它移动之前消失......

我已经实现了一个wait_for_ajax,它有助于但不能完全解决问题:

def wait_for_ajax
  Timeout.timeout(Capybara.default_max_wait_time) do
    loop until page.evaluate_script('jQuery.active').zero?
  end
end

鉴于微调器具有特定的类(由 Kendo 生成),我如何才能等待该元素消失?这就是我目前正在尝试的......

def wait_until_load
  Timeout.timeout(Capybara.default_max_wait_time) do
    loop until !find(".k-loading-color")
  end
end

【问题讨论】:

    标签: ruby selenium rspec kendo-ui capybara


    【解决方案1】:

    如果你需要wait_for_ajax,99% 的时间你做错了什么。在您目前的情况下,您应该这样做

    expect(page).to have_no_css('.k-loading-color')
    

    它将等待 Capybara.default_max_wait_time 秒以使匹配的元素消失。如果您需要允许的时间超过 Capybara.default_max_wait_time 设置的时间,您可以覆盖最大等待时间,例如

    expect(page).to have_no_css('.k-loading-color', wait: 10)
    

    这将等待最多 10 秒以使任何匹配的项目消失

    【讨论】:

    • @Zack 升级你的default_max_wait_time 很好,并且在几乎所有 Capybara 的查找器/匹配器/断言上,如果你需要特定的东西,你可以通过传递 :wait 选项来覆盖该默认值。很多人没有抓住的是default_max_wait_time:wait 选项都指定了最长等待时间,因此在大多数情况下(除了失败),延长等待时间并不会减慢任何速度
    【解决方案2】:

    我最终使用了:

    def wait_until_load
      Timeout.timeout(Capybara.default_max_wait_time) do
        loop until page.has_no_css?(".k-loading-color")
      end
    end
    

    【讨论】:

    【解决方案3】:

    如果您当前的循环不起作用,我希望具有 k-loading-color 类的微调器仍保留在 DOM 中,但具有 hidden 属性。

    我会尝试使用可见的?方法

    def wait_until_load
      Timeout.timeout(Capybara.default_max_wait_time) do
        loop until !find(".k-loading-color").visible?
      end
    end
    

    当然,这只有在以下情况下才有效

    find(".k-loading-color").visible? == true
    

    页面首次加载时

    【讨论】:

    • 默认情况下,find 只查找可见元素,因此在从 find 返回的元素上立即检查 visible? 是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多