2011-07-26 11 views
11

最近、キュウリ試験を実行しようとしたときにこのエラーメッセージが表示されました。私はいくつかの調査を行い、このエラーのいくつかの類似したインスタンスを見つけましたが、そのほとんどはブラウザ関連の問題でした。私は、この出力で任意のブラウザ特定のエラーメッセージが表示されない:Ruby - 45秒以内にロックポート7054にバインドできません(Selenium :: WebDriver :: Error :: WebDriverError)

unable to bind to locking port 7054 within 45 seconds (Selenium::WebDriver::Error::WebDriverError) 

私は(A selenium webdriver exception)に答えたここに掲載別の質問を見て、しかし、そのソリューションが私のために動作しませんでした。 "lsof -i TCP:7054"を実行しても出力は生成されません。

誰かがこれを示唆している場合には、私はすでにマシンを何度も再起動し、自分のgemsetを一掃して「バンドル」を再実行しました。ここで

私が使用している関連の宝石されています

capybara (0.4.1.2) 
cucumber (0.10.7) 
cucumber-rails (0.4.1) 
fuubar-cucumber (0.0.9) 
selenium-webdriver (0.2.0) 

を念のためには、私はまた、Firefoxの3.6、4.0、および5.0でこれらのテストを実行しようとしました。毎回同じメッセージ。

私のテストスイートを手動で終了してキュウバーが起動したすべてのアクティブなFirefoxプロセスでpkillを実行する前に、陰謀理論やその他のことはうまくいきませんでした。私はテストスイートの間に同時に約9つのFirefoxインスタンスを実行していました。私はこれがキュウリ試験を実行することから今見ている結果を生み出す何かが乱れてしまったのかどうかはわかりません。

誰でもこの問題を修正するための提案はありますか?

+0

あなたは接続するために待っている間、45秒のウィンドウでのlsofコマンドを実行してみてくださいましたか? $ DEBUG = trueで実行する(またはルビに-dを渡す)と、より多くのデバッグ出力が得られます。 – jarib

+0

私は45秒のウィンドウ内で最初のテスト中にlsofを実行しました。私はまだ出力を得ることはありません。デバッグモードで走っていると、私の持っているすべての宝石にこのエラーが出ます:rvm/gems/ruby​​-1.9.2-p136/gems/bundler-1.0.15/lib/bundler/lazy_specification.rbで例外 "NoMethodError"未定義のメソッド 'to_ary 'for json_pure(1.5.1):Bundler :: LazySpecification" –

+0

$ DEBUG = trueはレスキューされたすべての例外を出力するので、多くの出力が期待されます。その出力を見れば、あなたの問題を診断するのに役立ちます。 – jarib

答えて

18

更新:問題は、このエラーが最も面白かったテストをtrueに$デバッグを設定し、再実行した後

を解決:

<Selenium::WebDriver::Firefox::SocketLock:0x00000102f9c010>: getaddrinfo: nodename nor servname provided, or not known 
Exception `SocketError' at /Users/bobrossasaurus/.rvm/gems/ruby-1.9.2-p136/gems/selenium-webdriver-0.2.0/lib/selenium/webdriver/common/platform.rb:131 - getaddrinfo: nodename nor servname provided, or not known 

platform.rbを見てとった後:131、私はそれはポート80の "localhost"に接続しようとしていたが、失敗していたことに気づいた。私は最近、ブラウザ経由で "localhost"にアクセスするのに問題があったので、127.0.0.1:3000を使用して私のレールプロジェクトを表示する必要がありました。

ソリューション:

私は、/ etc/hostsファイルのlocalhostホストファイルのエントリがありませんでした:

127.0.0.1 localhost 

かなり恥ずかしい問題を、しかしそれにもかかわらず答えました。

+0

+1:ホストファイルをWindowsからOS Xにコピーしました.Windowsにはlocalhostエントリは必要ありません(DNSによって処理されます)が、OS Xはそれを行います。私があなたの答えを見つけなかったなら、おそらく私はこの問題を解決する方法を見つけられないでしょう。 – rsenna

+0

私のために働いてくれて、ありがとう。 –

0

これはgoogleとduck duckの両方でこの問題のトップスコアエントリですので、ここで回避方法を説明します。私が理解しているように、セレンはポート7054をミューテックス*として使用して、起動時にfirefoxが実際のfirefoxをフォークし、スタータースクリプトを終了するという問題を解決しています。したがって、実際のキツネのPIDはセレンから推測することしかできず、複数のfirefoxを並行して起動すると一定の競合状態になります。したがって、多くのfirefoxが並行して起動する必要がある場合、問題になるロックポート。

私たちの回避策は、このタイムアウトを増やすことです。

# Starting many firefoxen in parallel can easily take more than 45 (default) seconds 
module Selenium 
    module WebDriver 
    module Firefox 
     class Launcher 
     remove_const(:SOCKET_LOCK_TIMEOUT) 
     end 
    end 
    end 
end 
Selenium::WebDriver::Firefox::Launcher::SOCKET_LOCK_TIMEOUT = 90 

セレンの起動コードです。このヒントをモデルにした

修正:http://www.assertselenium.com/selenium-tips-tricks/

*ミューテックスが同時にない、そのようなファイルアクセスと同じリソースを共有するために、複数のプログラムスレッドを許しますが、プログラムオブジェクトです。

0

私は初期化器でこの定数をリセットすることができました。スクリプトを短くして、別のブラウザを作成できるようにする必要がありました。

#設定/初期化子/ selenium.rb

module Selenium module WebDriver module Firefox class Launcher Selenium::WebDriver::Firefox::Launcher::SOCKET_LOCK_TIMEOUT = 10 end end end end

関連する問題