Capybara如何使用Ruby等待页面所有元素完全加载

3

在漫长无果的搜索之后,我想问以下问题:

1. 当Capybara返回{"status" => "success"}时会发生什么?它会等待所有元素被加载完毕(例如JS等)吗?还是只处理HTTP 200响应并返回,不关心其余情况?

2. 除了设置超时之外,是否有其他方法可以使Capybara等待页面完全加载所有元素和功能?

例如,是否有任何方法可以告诉Capybara:“在访问特定页面时是否执行了JS?”或“页面加载是否已完全完成?”。

我将感激任何想法,谢谢!

2个回答

6

visit行为取决于驱动程序,无法保证页面完全加载(您如何定义完全),当函数返回时。Capybara中的等待方法是那些等待特定元素。因此,

find(:css, '#blah')

它将等待(最多Capybara.default_max_wait_time秒),直到页面上出现一个id为“blah”的元素。如果您不知道您访问的页面的结构以及您希望在其中看到哪些元素,则唯一的方法是通过超时来实现。


我现在正在使用这个。到目前为止还不错。从未错过我想要的东西。 - Yakob Ubaidi

3

有时候,我并不真的相信capybara中的等待包装器/方法。然而,我接下来的实现每次都能准确地响应元素的可见性。

  • 创建一个模块
module Helper

  def wait_for_element(page, elem, count=6)

    init = 0
    until init == count
      begin
        break if page.send("#{elem}").visible? == true
      rescue
        raise ArgumentError.new("Unable to find the element #{elem} in #{count*10} secs") if init == count - 1
      end
      init += 1
    end
  end

  def click(page, elem)
    wait_for_element(page, elem)
    page.send("#{elem}").click
  end

end
  • spec_helper.rb中导入该模块
require File.dirname(__FILE__) + "/../support/utilities"

include Helper
  • 在页面级别中定义一个元素
element :login_button, '#login'
  • 从步骤定义中调用实用程序方法
click(@app.login_page,'login_button')

注意: 上述逻辑可用于Web和移动平台。

对于Web,需要应用额外的包装器。

def wait_for_pageload(count=15)
  init = 0
  until (page.execute_script("return document.readyState").eql?('complete') || init == count)
    sleep 0.3
    init += 1
    raise ArgumentError.new("Page not loaded fully") if init == count
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接