使用谷歌地图时,在第一次测试中,Capybara测试失败并显示Timeout :: Error

时间:2012-12-09 02:38:24

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

我正在使用RSpec + Capybara + Selenium(Firefox)进行测试。无论我运行的验收测试的哪个子集,第一个失败(下一个测试都能正常工作),其中“reason”如下:

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

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

Firefox 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

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |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 = "random"
end

spec/features/features_spec_helper.rb

require_relative "../spec_helper"

require 'capybara/rspec'

Capybara.default_driver = :selenium
Capybara.default_wait_time = 60

EDIT2:

它曾经在以前工作(几周前;这个项目暂停了)。 可以通过RSpec升级从2.11升级到2.12(我几周前做过),但我只是试图降级它并且确实发生了同样的事情。我已经将整个代码库恢复到了点月前排除可能的宝石回归。问题仍然存在。

EDIT3:

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

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. 当你提供琐碎的样式表时,最让我感到惊讶的是,只不过是:
  4. #map{ width: 600px ; height: 600px }

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您是否尝试过改变GemFile来创建一个组:生产吗?

你在正确的地方加载这整个脚本吗?

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

此示例适用于bootstrap:

<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>