浏览器已完成加载,水豚仍未通过测试

Browser is done loading and capybara still failing test

我是 运行 自动化检查 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 做相等的断言,也不应该使用 driver 特定的方法(任何时候你做 current_session.driver.xxx 你可能做错了什么。要验证页面title 是你所期望的,只需使用 Capybara 提供的一种 title assertion/matcher 方法(它还将包括内置 waiting/retrying)

page.assert_title(expected_title)

另外请注意,将 Timeout::timeout 与与网络客户端通信的代码一起使用是非常危险的,因为它可以随时中断代码并使这些通信处于 non-recoverable 状态。如果你需要对 Capybara 使用某种超时,你最好只是在一个循环中休眠并检查条件直到预期的时间已经过去,而不是使用 Timeout::timeout - 请参阅 http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/