ruby-on-rails - Selenium Webdriver Turbolinks

标签 ruby-on-rails ruby selenium turbolinks

我目前正在为使用 turbolinks(在 ruby​​ 中)的产品编写 selenium webdriver 测试。当我点击一个按钮时,我必须等待 turbolinks 工作。当我测试 jQuery 回调时,我通常等待我的代码:

driver.execute_script 'return jQuery.active == 0'

我可以通过 Javascript 检查什么来验证 Turbolinks 是否已完成?或者有没有我可以捕获的元素可以做同样的事情?我在顶部看到一个进度条,但在任何地方都找不到该元素。

编辑:

我可以做这样的事情:

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;' }

有没有更好的方法来处理这个问题?

最佳答案

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

当我需要知道 Turbolinks 已完成时,监听 Turbolinks turbolinks:load 事件(以前的 page:load)是我能想到的最佳方式。

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

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 }

引用资料:

关于ruby-on-rails - Selenium Webdriver Turbolinks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31328469/

相关文章:

ruby-on-rails - 无法加载此类文件 -- mysql2/2.4/mysql2 (LoadError) - windows

ruby-on-rails - 防止 rspec 输出服务器和数据库日志

selenium - 如何使用调试器端口连接到 Firefox 实例?

c# - Selenium:如何识别 if 语句中的元素?

mysql - Ruby on Rails。无法在数据库中创建记录

ruby-on-rails - 时间戳未在 RoR 应用程序中更新

ruby-on-rails - 在 Rails 上使用 'rinruby' gem 时,我目前无法使用 png ("path/to/file.png") & dev.off() 将热图等转储到文件夹中

java - 如何使用 IE (Internet Explorer 11) 更改默认下载目录

ruby-on-rails - 为什么我应该在部署 Web 应用程序之前向 Ubuntu 添加新用户?

ruby-on-rails - 删除 Warden 策略 - 如何确保原始的 devise_authenticable 策略消失