0

いくつかのSeleniumテストをSeleniumグリッドを使用するように変換する作業を行っていますが、問題が発生しています。

テストは、ローカルマシンのブラウザを使用して正常に実行されます。

私はこのような新しいドライバーを(spec_helper.rbで)作成しました:

Capybara.register_driver :selenium_remote do |app|
  caps = Selenium::WebDriver::Remote::Capabilities.chrome
  Selenium::WebDriver.for(:remote, 
    :url => 'http://gridhub:4444/grid/driver', 
    :desired_capabilities => caps)
end

新しいドライバーでテストを実行すると、ハブに接続され、ノードがChromeドライバーをロードしますが、グリッド側ではすべて問題ないように見えます。

問題は、テストを開始するマシンで次の例外が発生することです。

Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep
# /home/.rvm/gems/ruby-1.9.3-p194/gems/capybara-2.0.1/lib/capybara.rb:298

このベアボーンテストを作成しましたが、実行しただけでも同じ例外が発生します。

Capybara.default_driver = :selenium_remote

describe 'I can' do
  it 'visit Google without throwing an error' do        
    visit 'http://www.google.com'
  end
end

Seleniumサーバースタンドアロン2.26.0、Capybara 2.0.1、およびRSpec2.9.0を使用しています。

これを引き起こしているアイデアはありますか?

4

1 に答える 1

1

さて、このブログ投稿(http://www.softr.li/blog/2012/11/08/capybara-selenium-rspec-vagrant-remotely)の助けを借りて、私はそれを機能させました。

上記のブログ投稿は、別のブログ投稿( http://www.without-brains.net/blog/2012/08/01/capybara-and-selenium-with-vagrant )に基づいています。

CapybaraSeleniumWebドライバーを誤って登録していたようです。

以下は、ドライバーを正しく登録するブログ投稿のコードです。そのまま使用するだけで問題が修正され、自分で使用できるように変更しました。

コードも要点にあります(https://gist.github.com/4038197#file-capybara_remote-rb)。

新しいRubyファイルを作成し、このコードを追加して、spec_helper.rbファイルに含めます。

# SELENIUM_SERVER is the IP address or hostname of the system running Selenium
# Server, this is used to determine where to connect to when using one of the
# selenium_remote_* drivers
SELENIUM_SERVER = "10.10.11.1"

# SELENIUM_APP_HOST is the IP address or hostname of this system (where the
# tests run against) as reachable for the SELENIUM_SERVER. This is used to set
# the Capybara.app_host when using one of the selenium_remote_* drivers
SELENIUM_APP_HOST = "10.10.11.2"

# CAPYBARA_DRIVER is the Capybara driver to use, this defaults to Selenium with
# Firefox
CAPYBARA_DRIVER = "selenium_remote_firefox"

# At this point, Capybara.default_driver is :rack_test, and
# Capybara.javascript_driver is :selenium. We can't run :selenium in the Vagrant box,
# so we set the javascript driver to :selenium_remote_firefox which we're going to
# configure.
Capybara.javascript_driver = :selenium_remote_firefox

RSpec.configure do |config|

  config.before(:each) do
    if selenium_remote?
      Capybara.app_host = "http://#{SELENIUM_APP_HOST}:#{page.driver.rack_server.port}"
    end
  end

  config.after(:each) do
    Capybara.reset_sessions!
    Capybara.use_default_driver
    Capybara.app_host = nil
  end

  # Determines if a selenium_remote_* driver is being used
  def selenium_remote?
    !(Capybara.current_driver.to_s =~ /\Aselenium_remote/).nil?
  end
end

# CapybaraDriverRegistrar is a helper class that enables you to easily register
# Capybara drivers
class CapybaraDriverRegistrar

  # register a Selenium driver for the given browser to run on the localhost
  def self.register_selenium_local_driver(browser)
    Capybara.register_driver "selenium_#{browser}".to_sym do |app|
      Capybara::Selenium::Driver.new(app, browser: browser)
    end
  end

  # register a Selenium driver for the given browser to run with a Selenium
  # Server on another host
  def self.register_selenium_remote_driver(browser)
    Capybara.register_driver "selenium_remote_#{browser}".to_sym do |app|
      Capybara::Selenium::Driver.new(app, browser: :remote, url: "http://#{SELENIUM_SERVER}:4444/wd/hub", desired_capabilities: browser)
    end
  end
end

# Register various Selenium drivers
CapybaraDriverRegistrar.register_selenium_remote_driver(:firefox)

これで、:js => trueメタデータを持つRSpecの例では、このドライバーが使用されます。

于 2013-01-08T18:19:55.823 に答える