【发布时间】:2018-04-04 11:10:55
【问题描述】:
我正在运行自动化检查 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
【问题讨论】:
-
从你的问题中并不完全清楚你到底在做什么(也许在你的问题中显示实际的代码),但是你不应该真正调用驱动程序特定的方法,或者直接进行 == 比较在
title- 你应该只使用have_title/assert_title/has_title?方法,具体取决于你想要做什么。 -
@thomaswalpole 感谢您的评论。我添加了一些代码来简化我正在做的事情。所以基本上第一个循环通过了,它实际上输出了“pass 1”,但是它在底部的 assert_equal 失败了,所以我在它之前添加了另一个循环。在中断之前循环大约 10-20 次,然后通过 assert_equal。这告诉我第一个循环没有检查某些内容,浏览器实际上仍在“加载”
-
其中的变量
title是什么? -
好的 - 那么你应该做类似
page.assert_title(title)的事情。同样将Timeout::timeout用于涉及网络通信的任务是危险的,因为连接可能会处于未知/断开状态(基本上Timeout::timeout本身已经很断开 - 请参阅mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api) -
作为答案添加
标签: javascript ruby selenium automation capybara