我正在运行自动化,检查document.readyState === 'complete'
以及一个名为window.renderComplete
的局部变量(当服务器完成渲染页面时)。
但不知怎的,Capybara.current_session.driver.browser.title
对于该检查的几个循环失败title == Capybara.current_session.driver.browser.title
。它可能在检查通过之前循环10次并且它打破了循环。
浏览器获取将数据设置为某些变量所需的所有数据后是否有一段时间?或者这是水豚的缺陷?如果readyState和renderComplete都为真,我无法确定为什么浏览器仍会出现延迟。
renderComplete = page.evaluate_script("(window.renderComplete == true) && (document.readyState === 'complete');")
if renderComplete
puts "pass 1"
else
loop do
renderComplete = page.evaluate_script("window.renderComplete == true;")
break if renderComplete == true
end
puts "pass 2"
end
browser = Capybara.current_session.driver.browser
Timeout::timeout(Capybara.default_max_wait_time) do
i=1
loop do
puts "loop! #{i}"
i+=1
break if title == browser.title
end
end
assert_equal title, browser.title
答案 0 :(得分:1)
你不应该对title
做同等的断言,也不应该使用特定于驱动程序的方法(任何时候current_session.driver.xxx
你可能做错了。要验证页面标题是你所期望的使用Capybara提供的标题断言/匹配方法之一(其中还包括内置等待/重试)
page.assert_title(expected_title)
另外,请注意,使用Timeout::timeout
代码与网络客户端通信是非常危险的,因为它可以在任何时候中断代码并使这些通信处于不可恢复的状态。如果你需要在Capybara中使用某种超时,你最好只是在一个循环中睡觉并检查条件直到预期的时间已经过去而不是使用Timeout::timeout
- 请参阅http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/