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

时间:2017-10-23 19:39:14

标签: javascript ruby selenium automation capybara

我正在运行自动化,检查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

1 个答案:

答案 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/

相关问题