Ruby selenium/capybara 等待元素消失

Ruby selenium/capybara wait for element to go away

我知道这不是一个独特的问题,但我还没有找到实际的解决方案...我有一个页面在加载时上面有一个微调器。我希望我的 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

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

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

如果您当前的循环不工作,我希望带有 class k-loading-color 的微调器保留在 DOM 中,但带有隐藏的 属性。

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

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

首次加载页面时

我最终使用了:

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

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

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 秒让任何匹配项消失