【问题标题】:Capybara tests fail with Timeout::Error in the first test when using Google MapsCapybara 测试在使用 Google 地图时在第一次测试中失败并出现 Timeout::Error
【发布时间】:2012-11-26 20:58:42
【问题描述】:

我正在使用 RSpec + Capybara + Selenium (Firefox) 进行测试。无论我运行验收测试的哪个子集,第一个测试都会失败(下一个测试可以正常工作),原因如下:

 Failure/Error: visit '/'
 Timeout::Error:
   Timeout::Error

我的应用程序严重依赖 GoogleMaps 和 BackboneJS。当我运行测试时,页面没有完成加载并且“从 maps.googleapis.com 传输数据”消息停留在 Firefox 窗口的左下角,但是页面看起来加载正确(存在地图和其他内容)。我已经将超时设置为 60 秒以排除任何慢速网络问题。并且所有后续测试都运行得非常快(例如正确的 Google 脚本已被提取并已被缓存)。此外,当我在开发环境中启动服务器并访问它(localhost:3000)时,一切正常。

火狐 17.0.1。我的一些宝石:

capybara (2.0.1)
database_cleaner (0.9.1)
mongoid (3.0.13)
rspec (2.12.0)
rspec-core (2.12.1)
rspec-expectations (2.12.0)
rspec-mocks (2.12.0)
rspec-rails (2.12.0)
selenium-webdriver (2.26.0)

您知道为什么会发生这种情况以及如何预防吗?

编辑:

spec/spec_helper.rb:

# 当你运行 'rails generate rspec:install' 时,这个文件被复制到 spec/ ENV["RAILS_ENV"] ||= '测试' 需要 File.expand_path("../../config/environment", __FILE__) 需要'rspec/rails' 需要'rspec/autorun' # 需要支持带有自定义匹配器和宏等的 ruby​​ 文件, # 在 spec/support/ 及其子目录中。 目录[Rails.root.join("spec/support/**/*.rb")].each {|f|要求 f} RSpec.configure 做 |config| config.include FactoryGirl::Syntax::Methods config.treat_symbols_as_metadata_keys_with_true_values = true config.infer_base_class_for_anonymous_controllers = false #config.order = "随机" 结尾

spec/features/features_spec_helper.rb:

require_relative "../spec_helper" 需要“水豚/rspec” Capybara.default_driver = :硒 Capybara.default_wait_time = 60

EDIT2:

它以前可以正常工作(几周前;该项目当时停止了)。 可以通过 RSpec 从 2.11 升级到 2.12(几周前我做过)引入,但我刚刚尝试降级它并且确实发生了同样的事情。我已将整个代码库恢复为点前一个月排除可能的宝石回归。问题仍然存在。

EDIT3:

我刚刚发现,如果我注释掉负责从 Google 附加地图的行:

new google.maps.Map($("#map")[0], mapOptions)

然后一切都像魅力一样发挥作用。

EDIT4:

示例应用源码:https://github.com/skalee/capybara-google-maps-failure

运行所有规范将导致第一个规范中出现 Timeout::Error(至少对我而言)。但是,所有规范都会在以下情况下通过:

  1. 您删除了line which initializes Geocoder(示例应用中没有使用它,但我在我的应用中使用了它)。
  2. 你删除了line which initializes Map
  3. 最让我惊讶的是,当您提供琐碎的样式表时,仅此而已:
#map{ 宽度:600px ;高度:600px }

宝石与我在应用中使用的宝石完全相同。 /vendor/assets 中有一些第 3 方脚本。

【问题讨论】:

  • 您能否在某个站点编写与 Google 地图一起使用的失败示例代码,以便我们重现它?
  • @AndreyBotalov — 好点。我通过从与地图无关的东西中剥离我的应用程序来准备一个示例应用程序。我还发现了两种使规范通过的新方法(虽然不是修复问题)。这个问题对我来说真的很奇怪......
  • 不幸的是我不知道 Rails。启动 rails server 后,导航到 localhost:3000 时出现以下异常:require_tree argument must be a directory (in /path_is_here/capybara-google-maps-failure/app/assets/javascripts/application.js:26)。我该如何解决?
  • @AndreyBotalov 我的错误,一个目录不受版本控制。修好了,谢谢。因此,如果您不是 Rails 专家,只需输入 bundle exec rspec 即可运行规范。
  • 你有没有试过让水豚在测试的那个时候保存截图?它有时会有所帮助。另外,尝试使用 WebMock 拦截请求并检查正在使用的 url。可能针对测试进行不同的配置,例如您的 API 密钥可能在 production.rb 中。

标签: ruby-on-rails selenium google-maps-api-3 rspec capybara


【解决方案1】:

您不应依赖外部服务进行测试。这是一个策略:

http://robots.thoughtbot.com/post/34761570235/using-capybara-to-test-javascript-that-makes-http

【讨论】:

  • 我同意影子丸。不要依赖任何外部服务进行测试。你无法控制它们。如果它们发生变化(即使是轻微的),或者下降,您的测试就会中断。正如思想机器人文章所建议的那样,使用您的环境配置将您的测试指向您所做可以控制的事情。
【解决方案2】:

您是否尝试过更改 GemFile 以创建一个组 :production ?

您是否将整个脚本加载到正确的位置?

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false">

此示例用于引导程序:

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE"
type="text/javascript">
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多