在漫长无果的搜索之后,我想问以下问题:
1. 当Capybara返回{"status" => "success"}时会发生什么?它会等待所有元素被加载完毕(例如JS等)吗?还是只处理HTTP 200响应并返回,不关心其余情况?
2. 除了设置超时之外,是否有其他方法可以使Capybara等待页面完全加载所有元素和功能?
例如,是否有任何方法可以告诉Capybara:“在访问特定页面时是否执行了JS?”或“页面加载是否已完全完成?”。
我将感激任何想法,谢谢!
在漫长无果的搜索之后,我想问以下问题:
1. 当Capybara返回{"status" => "success"}时会发生什么?它会等待所有元素被加载完毕(例如JS等)吗?还是只处理HTTP 200响应并返回,不关心其余情况?
2. 除了设置超时之外,是否有其他方法可以使Capybara等待页面完全加载所有元素和功能?
例如,是否有任何方法可以告诉Capybara:“在访问特定页面时是否执行了JS?”或“页面加载是否已完全完成?”。
我将感激任何想法,谢谢!
visit
行为取决于驱动程序,无法保证页面完全加载(您如何定义完全),当函数返回时。Capybara中的等待方法是那些等待特定元素。因此,
find(:css, '#blah')
它将等待(最多Capybara.default_max_wait_time秒),直到页面上出现一个id为“blah”的元素。如果您不知道您访问的页面的结构以及您希望在其中看到哪些元素,则唯一的方法是通过超时来实现。
有时候,我并不真的相信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