存根谷歌地方调用 selenium v​​s capybara-webkit

Posted

技术标签:

【中文标题】存根谷歌地方调用 selenium v​​s capybara-webkit【英文标题】:Stubing google places call selenium vs capybara-webkit 【发布时间】:2015-03-12 09:07:53 【问题描述】:

我正在使用 Capybaraselenium AND/OR capybara-webkit 驱动程序和 Webmock 作为存根框架。

当我使用 selenium (firefox) 对 google 地图(地点)自动完成输入运行集成测试时,浏览器会向 google 发出一些实际调用,并接收带有地点组件的 JSON。

当我更改为 capybara-webkit 驱动程序(muuuuch 更快)做同样的事情时,我收到 webmock 消息,我应该存根外部请求。

有人可以解释一下为什么两者之间有区别吗?

注意:我设置WebMock.disable_net_connect!( :allow_localhost => true ) 允许调用本地服务器...

编辑:

像 WebMock 这样的工具很棒,但是在测试 javascript 时,它是 加载页面的单独浏览器进程,而不是您的 Ruby 测试 过程。这意味着对您的构建服务器的请求不会 通过网络::HTTP;请求来自 Firefox 或 capybara-webkit,而那些工具兴高采烈地不知道你的软弱 尝试重新路由 HTTP 流量

引用http://robots.thoughtbot.com/using-capybara-to-test-javascript-that-makes-http

这解释了为什么对支付系统的某些调用(在 Rails 控制器中完成)需要存根,以及为什么 ajax 不需要存根,但它没有解释为什么 Firefox 到达 Google 而 webkit 要求存根

解决方案:

TL;DR; 保留 :selenium 并在需要对外部 API 进行 ajax 调用的测试中进行真正的调用

我尝试使用用于 JS/浏览器外部调用的 puffing-billy 进行模拟,但这个与 Webmock 不能“很好地合作”。此外,我已经用 Webmock 编写了支付系统的 25 个存根,所以我没有办法切换......

我也尝试过 VRC,它是一个录制框架,但这个也适用于您的应用程序(Ruby NET 库)进行的调用

最后,我只是决定继续运行这几个需要 ajax API 响应的测试,使用 :selenium 驱动程序启动 firefox 并真正调用 gMaps

#spec_helper
...
WebMock.disable_net_connect!( :allow_localhost => true )   # Ask to stub all requests except to localhost
...

# Use headless capybara-webkit that is way faster!
Capybara.javascript_driver = :webkit
config.before(:each, js: true) do
   ...
end

# And when you need :selenium and firefox mark the spec with :force_selenium => true
config.before(:each, force_selenium: true) do
   Capybara.current_driver = :selenium
end

【问题讨论】:

【参考方案1】:

这些警告不是来自webmock,而是来自capybara-webkit 本身,它希望您明确声明访问主机的行为,如下所示:

Capybara::Webkit.configure do |config|                                      
   config.allow_url("fonts.googleapis.com")
   config.allow_url("www.sandbox.paypal.com")
   config.allow_url("altfarm.mediaplex.com")
end

【讨论】:

以上是关于存根谷歌地方调用 selenium v​​s capybara-webkit的主要内容,如果未能解决你的问题,请参考以下文章

如何创建不调用底层对象的构造函数的ScalaMock存根?

Coinitialize ex 在 JNI 程序存根中的 WMI 调用中失败

webdirver.Chrom() selenium webdirver调用谷歌浏览器的问题解决

怎么调用selenium打开chrome浏览器?

rpc机制和实现过程

在 chromedriver (Selenium) 中导入根 CA