Ruby on rails Selenium Webdriver Turbolinks

Ruby on rails Selenium Webdriver Turbolinks,ruby-on-rails,ruby,selenium,turbolinks,Ruby On Rails,Ruby,Selenium,Turbolinks,我目前正在为一个利用TurboLink(ruby)的产品编写SeleniumWebDriver测试。当我点击一个按钮时,我必须等待TurboLink工作。在测试jQuery回调时,我通常使用以下命令等待代码: driver.execute_script 'return jQuery.active == 0' 我可以通过Javascript检查哪些内容来验证TurboLink是否已完成?或者有没有一个元素我可以抓住,可以做同样的事情?我在顶部看到一个进度条,但我在任何地方都找不到该元素 编辑:

我目前正在为一个利用TurboLink(ruby)的产品编写SeleniumWebDriver测试。当我点击一个按钮时,我必须等待TurboLink工作。在测试jQuery回调时,我通常使用以下命令等待代码:

driver.execute_script 'return jQuery.active == 0'
我可以通过Javascript检查哪些内容来验证TurboLink是否已完成?或者有没有一个元素我可以抓住,可以做同样的事情?我在顶部看到一个进度条,但我在任何地方都找不到该元素

编辑:

我可以做这样的事情:

driver.execute_script "$(document).on('page:load', function () { window.turbolinks = true; });"
driver.execute_script "$(document).on('page:before-change', function () { window.turbolinks = false; });"
在页面加载,然后我可以等待window.turbolinks为真

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { driver.execute_script 'return window.turbolinks;' }

是否有更好的方法处理此问题?

根据turbolinks文档,进度条具有类
turbolinks进度条
,您可以检查是否存在此问题并等待其消失?

等待页面元素完成加载是一个经典的Selenium问题,没有单一的最佳解决方案。使用TurboLink只会加剧这个问题

当我需要知道Turbolinks已经完成时,我能想到的最好方法就是监听Turbolinks
Turbolinks:load
事件(以前称为
page:load

如果我们知道触发页面加载的确切代码行,我们可以将此代码作为块传递给包装器方法,该方法为我们处理所有等待逻辑,如下所示:

def wait_for_page_load(driver)
  # listen for Turbolinks to start and stop
  driver.execute_script('document.addEventListener("turbolinks:before-visit", function() { window.turbolinks_is_busy = true; });')
  driver.execute_script('document.addEventListener("turbolinks:load", function() { window.turbolinks_is_busy = false; });')

  # execute the code that causes the page load
  yield

  # optional short sleep, just to be safe
  sleep(1)

  # wait for the various 'page is loading' indicators, including our custom Turbolinks indicator
  wait = Selenium::WebDriver::Wait.new(:timeout => 60)
  wait.until { driver.execute_script("return document.readyState == 'complete' && jQuery.active == 0 && !window.turbolinks_is_busy;") }
end
用法示例:

wait_for_page_load(@driver) { @driver.find_element(id: 'a#logout').click }
参考资料: