【问题标题】:Trying to get selenium working in rails 3 - "WebMock::NetConnectNotAllowedError"试图让 selenium 在 rails 3 中工作 - “WebMock::NetConnectNotAllowedError”
【发布时间】:2011-05-12 15:56:48
【问题描述】:

我第一次尝试在 rails 3 应用程序中使用 selenium。 (我之前在rails 2中使用过它)。我在一个 rvm 中,它当然有自己的 gemset。

我首先用 capybara 运行了一个任务,没有硒:

#./spec/requests/homepage_spec.rb
require 'spec_helper'

describe 'home page', :type => :request do
  it 'should welcome the user' do
    visit '/'
    page.should have_content('Buddy')
  end
end

这运行良好。然后我在描述的选项中添加了一个“:js => true”选项,这应该使它使用硒运行(据我所知)。并得到了这个错误:

 Failure/Error: @page.start_new_browser_session
 WebMock::NetConnectNotAllowedError:
   Real HTTP connections are disabled. Unregistered request: POST http://localhost:4444/selenium-server/driver/ with body 'cmd=getNewBrowserSession&1=%2Afirefox&2=http%3A%2F%2Flocalhost%3A3000&3=&4=' with headers {'Accept'=>'*/*', 'Content-Type'=>'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent'=>'Ruby'}

   You can stub this request with the following snippet:

   stub_request(:post, "http://localhost:4444/selenium-server/driver/").
     with(:body => "cmd=getNewBrowserSession&1=%2Afirefox&2=http%3A%2F%2Flocalhost%3A3000&3=&4=", 
          :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent'=>'Ruby'}).
     to_return(:status => 200, :body => "", :headers => {})

   ============================================================

这是我第一次使用 capybara,我认为我的配置有点错误。也许错过了一些重要的宝石?我正在关注这篇博文:Capybara (and Selenium) with RSpec & Rails 3: quick tutorial

有什么想法吗?

PS,这是我的 Gemfile 内容:

source 'http://rubygems.org'
gem 'rails', '3.0.7'
gem 'haml'
gem 'heroku'
gem "heroku_backup_task"
gem 'authlogic', '3.0.2'
gem 'rails3-generators'
gem 'txtlocal', :git => 'git://github.com/epigenesys/txtlocal.git'
gem 'chronic'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'bcrypt-ruby'

group :development, :test do
  gem 'rspec'
  gem 'mocha'
  gem "rspec-rails", "~> 2.4"
  gem "webmock"
  gem 'database_cleaner', '0.5.2'  
  gem 'capybara', :git => 'git://github.com/jnicklas/capybara.git'
  gem 'selenium-client'
end

还有我的 Gemfile.lock:

GIT
  remote: git://github.com/epigenesys/txtlocal.git
  revision: 66aab6628d4385eda959e4a8bd083cc2c259fea0
  specs:
    txtlocal (0.0.1)
      json

GIT
  remote: git://github.com/jnicklas/capybara.git
  revision: 9cdf015e28637b7b0d94f5a69f9bc3605455ce22
  specs:
    capybara (1.0.0.beta1)
      mime-types (>= 1.16)
      nokogiri (>= 1.3.3)
      rack (>= 1.0.0)
      rack-test (>= 0.5.4)
      selenium-webdriver (~> 0.2.0)
      xpath (~> 0.1.4)

GEM
  remote: http://rubygems.org/
  specs:
    abstract (1.0.0)
    actionmailer (3.0.7)
      actionpack (= 3.0.7)
      mail (~> 2.2.15)
    actionpack (3.0.7)
      activemodel (= 3.0.7)
      activesupport (= 3.0.7)
      builder (~> 2.1.2)
      erubis (~> 2.6.6)
      i18n (~> 0.5.0)
      rack (~> 1.2.1)
      rack-mount (~> 0.6.14)
      rack-test (~> 0.5.7)
      tzinfo (~> 0.3.23)
    activemodel (3.0.7)
      activesupport (= 3.0.7)
      builder (~> 2.1.2)
      i18n (~> 0.5.0)
    activerecord (3.0.7)
      activemodel (= 3.0.7)
      activesupport (= 3.0.7)
      arel (~> 2.0.2)
      tzinfo (~> 0.3.23)
    activeresource (3.0.7)
      activemodel (= 3.0.7)
      activesupport (= 3.0.7)
    activesupport (3.0.7)
    addressable (2.2.5)
    arel (2.0.9)
    authlogic (3.0.2)
      activerecord (~> 3.0.7)
      activerecord (~> 3.0.7)
    bcrypt-ruby (2.1.4)
    builder (2.1.2)
    childprocess (0.1.8)
      ffi (~> 1.0.6)
    chronic (0.3.0)
    configuration (1.2.0)
    crack (0.1.8)
    database_cleaner (0.5.2)
    diff-lcs (1.1.2)
    erubis (2.6.6)
      abstract (>= 1.0.0)
    ffi (1.0.7)
      rake (>= 0.8.7)
    haml (3.1.1)
    heroku (2.1.2)
      launchy (>= 0.3.2)
      rest-client (~> 1.6.1)
      term-ansicolor (~> 1.0.5)
    heroku_backup_task (0.0.5)
      heroku (>= 1.13.7)
      rake
    i18n (0.5.0)
    json (1.5.1)
    json_pure (1.5.1)
    launchy (0.4.0)
      configuration (>= 0.0.5)
      rake (>= 0.8.1)
    mail (2.2.19)
      activesupport (>= 2.3.6)
      i18n (>= 0.4.0)
      mime-types (~> 1.16)
      treetop (~> 1.4.8)
    mime-types (1.16)
    mocha (0.9.12)
    nokogiri (1.4.4)
    polyglot (0.3.1)
    rack (1.2.2)
    rack-mount (0.6.14)
      rack (>= 1.0.0)
    rack-test (0.5.7)
      rack (>= 1.0)
    rails (3.0.7)
      actionmailer (= 3.0.7)
      actionpack (= 3.0.7)
      activerecord (= 3.0.7)
      activeresource (= 3.0.7)
      activesupport (= 3.0.7)
      bundler (~> 1.0)
      railties (= 3.0.7)
    rails3-generators (0.17.4)
      railties (>= 3.0.0)
    railties (3.0.7)
      actionpack (= 3.0.7)
      activesupport (= 3.0.7)
      rake (>= 0.8.7)
      thor (~> 0.14.4)
    rake (0.8.7)
    rest-client (1.6.1)
      mime-types (>= 1.16)
    rspec (2.6.0)
      rspec-core (~> 2.6.0)
      rspec-expectations (~> 2.6.0)
      rspec-mocks (~> 2.6.0)
    rspec-core (2.6.0)
    rspec-expectations (2.6.0)
      diff-lcs (~> 1.1.2)
    rspec-mocks (2.6.0)
    rspec-rails (2.6.0)
      actionpack (~> 3.0)
      activesupport (~> 3.0)
      railties (~> 3.0)
      rspec (~> 2.6.0)
    rubyzip (0.9.4)
    selenium-client (1.2.18)
    selenium-webdriver (0.2.0)
      childprocess (>= 0.1.7)
      ffi (>= 1.0.7)
      json_pure
      rubyzip
    sqlite3 (1.3.3)
    sqlite3-ruby (1.3.3)
      sqlite3 (>= 1.3.3)
    term-ansicolor (1.0.5)
    thor (0.14.6)
    treetop (1.4.9)
      polyglot (>= 0.3.1)
    tzinfo (0.3.27)
    webmock (1.6.2)
      addressable (>= 2.2.2)
      crack (>= 0.1.7)
    xpath (0.1.4)
      nokogiri (~> 1.3)

PLATFORMS
  ruby

DEPENDENCIES
  authlogic (= 3.0.2)
  bcrypt-ruby
  capybara!
  chronic
  database_cleaner (= 0.5.2)
  haml
  heroku
  heroku_backup_task
  mocha
  rails (= 3.0.7)
  rails3-generators
  rspec
  rspec-rails (~> 2.4)
  selenium-client
  sqlite3-ruby
  txtlocal!
  webmock

【问题讨论】:

    标签: ruby-on-rails-3 selenium capybara


    【解决方案1】:

    有了这个……

    WebMock.disable_net_connect!(:allow_localhost => true)
    

    您允许对您的本地主机进行真正的 Web 访问。当您需要为您的应用程序使用 Selenium 并同时模拟外部资源时,它是完美的选择。

    【讨论】:

      【解决方案2】:

      这是因为您使用的是 webmock。它会阻止所有出站 HTTP 请求。

      如果您不需要它,请将其从 Gemfile 中删除。如果您确实需要它,那么您可能需要根据您的需要更精确地配置它:

      https://github.com/bblimke/webmock

      【讨论】:

        【解决方案3】:

        我们使用它来启用 capybara 中的正常请求,并允许 selenium 的回调无处不在,因为它们在请求完成后被触发。

        # spec/spec_helper.rb
        RSpec.configure do |config|
          config.before(:all, type: :request) do
            WebMock.allow_net_connect!
          end  
        
          config.after(:all, type: :request) do
            selenium_requests = %r{/((__.+__)|(hub/session.*))$}
            WebMock.disable_net_connect! :allow => selenium_requests
          end
        end
        

        【讨论】:

        • 成功了!谢谢!不过,我不确定 selenium_requests 是关于什么的。
        【解决方案4】:

        改进@grosser 代码

        RSpec.configure do |config|
          config.before do
            WebMock.enable!
            if Capybara.current_driver != :rack_test
              selenium_requests = %r{/((__.+__)|(hub/session.*))$}
              WebMock.disable_net_connect! :allow => selenium_requests
              WebMock.disable_net_connect! :allow => "127.0.0.1:#{Capybara.current_session.driver.server_port}" # this only works for capybara selenium and capybara-webkit
            else
              WebMock.disable_net_connect!
            end
          end
        
          # for connections where we need to have network access we just tag it network
          config.before(:each, :network => true) do
            WebMock.disable!
          end
        end
        

        【讨论】:

          【解决方案5】:

          WebMock.disable_net_connect! allow_localhost: true

          【讨论】:

            【解决方案6】:

            在我的具体情况下,我的问题出在evergreen (javascript rspec)。

            我补充说:

            WebMock.disable_net_connect! :allow_localhost => true
            

            到我的环境/env*.rb 因为 evergreen 不加载 rspec 助手。

            【讨论】:

            • 这是对我有用的答案!我的情况是我正在尝试运行 rake assets:precompile with asset_sync 以在测试成功后将资产推送到 Amazon S3。 Webmock gem 阻止了资产推送,即使我已经用WebMock.disable_net_connect!(:allow => /s3.amazonaws.com/, :allow_localhost => true) 更新了我的 spec_helper.rb 我不得不用这条线更新了 environment/test.rb 然后它开始工作,这要感谢这个答案@carlosveucv
            【解决方案7】:

            这里有很好的建议。另一个更可微调的解决方案:

            WebMock.disable_net_connect!(
              allow: [
                'localhost',
                'dynamo:8000',
                'pact-broker:81'
              ]
            )
            

            特别适合将 docker-compose 容器列入白名单!

            【讨论】:

              【解决方案8】:

              我尝试了上述答案,但都没有奏效,然后发现问题出在我工作场所的 Internet 连接上。它适用于我家的互联网连接。

              【讨论】:

                猜你喜欢
                • 2011-05-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-08-06
                • 2011-11-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多