【发布时间】: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:
spec/features/features_spec_helper.rb:
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(至少对我而言)。但是,所有规范都会在以下情况下通过:
- 您删除了line which initializes Geocoder(示例应用中没有使用它,但我在我的应用中使用了它)。
- 你删除了line which initializes Map。
- 最让我惊讶的是,当您提供琐碎的样式表时,仅此而已:
#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