【问题标题】:Capybara wait for page to load all elements completely with RubyCapybara 等待页面使用 Ruby 完全加载所有元素
【发布时间】:2017-08-24 10:07:53
【问题描述】:
经过长时间无用的搜索,我想问以下问题:
1。 Capybara 返回 {"status" => "success"} 之后会发生什么?是不是等到所有元素都加载完毕(比如JS等)?或者它只是处理 HTTP 200 响应并将其发回而不关心?
2。除了设置超时之外,还有其他方法可以让 Capybara 等待页面完全加载所有元素和功能吗?
例如,有什么方法可以告诉 Capybara:“在访问特定页面时执行了 JS 吗?”或“页面加载完成了吗?”。
我会很感激任何想法,谢谢!
【问题讨论】:
标签:
javascript
ruby-on-rails
ruby
web-scraping
capybara
【解决方案1】:
visit 行为取决于驱动程序,并且不能保证页面在返回时已完全加载(无论您如何定义完全)。 Capybara 中的等待方法是等待特定元素的方法。所以
find(:css, '#blah')
将等待(最多 Capybara.default_max_wait_time 秒)id 为“blah”的元素出现在页面上。如果您对正在访问的页面的结构以及您希望在其中包含哪些元素一无所知,那么唯一的方法就是通过超时。
【解决方案2】:
有时,我真的不相信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
require File.dirname(__FILE__) + "/../support/utilities"
include Helper
element :login_button, '#login'
click(@app.login_page,'login_button')
注意:以上逻辑可用于网络和移动平台。
对于网络,它是您需要应用的附加包装器。
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