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

时间:2017-08-24 10:07:53

标签: javascript ruby-on-rails ruby web-scraping capybara

经过长时间的无用搜索,我想问下列内容:

1 即可。特别是在Capybara返回后会发生什么{“status”=> “成功”}?是否等到所有元素都被加载(例如JS等)?或者它只是处理HTTP 200响应并将其发回而不给予关注?

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

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

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

2 个答案:

答案 0 :(得分:1)

有时候,我真的不相信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

答案 1 :(得分:0)

visit行为取决于驱动程序,并且无法保证页面在返回时已完全加载(但是您完全定义)。 Capybara的等待方法是那些等待特定元素的方法。所以

find(:css, '#blah')
对于ID为' blah'的元素,

将等待(最多为Capybara.default_max_wait_time秒)出现在页面上。如果您不了解您正在访问的页面的结构以及您希望它在哪个元素上,那么唯一的方法就是通过超时。