2010-11-28 8 views
13

今日、セレンウェブドライブを使用すると、エラーが発生しました。私のプラットフォームはmac osxです。これは私の例外ログです。セレンウェブドライバ例外

ruby-1.9.2-p0 > Selenium::WebDriver.for :firefox 
Selenium::WebDriver::Error::WebDriverError: unable to bind to locking port 7054 within 45 seconds 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver/firefox/socket_lock.rb:48:in `lock' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver/firefox/socket_lock.rb:29:in `locked' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver/firefox/launcher.rb:32:in `launch' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver/firefox/bridge.rb:21:in `initialize' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver/common/driver.rb:38:in `new' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver/common/driver.rb:38:in `for' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/selenium-webdriver-0.1.0/lib/selenium/webdriver.rb:51:in `for' 
from (irb):8 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in `start' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `start' 
from /Users/Apple/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands.rb:23:in `<top (required)>' 
from script/rails:6:in `require' 
from script/rails:6:in `<main>' 

なぜこのようなことが起こるのか分かりません。私のfirefoxのパスはデフォルトのパスです。 ご協力いただきありがとうございます!

答えて

19

WebDriverは、同時に2つのFirefoxインスタンスを起動しないように、ポート7054(「ロックポート」)をミューテックスとして使用します。作成した新しいインスタンスは、ブラウザを起動する前にmutexを待ってから、ブラウザが開いたらすぐに解放します。

これは実際にリソースの問題である可能性があります。以前に作成されたドライバは、起動に45秒以上かかるため、その時間ロックを保持しています。

あなたのケースではそうは思わない場合は、どのプロセスがロックを保持しているか知ることは興味深いでしょう。タイムアウトする前に45秒でlsof -i TCP:7054を実行してみてください。

-d(または$DEBUG = trueの設定)でルビーを実行すると、これをさらにデバッグするのに役立つ情報が得られます。

+0

おかげで私のためにそれをやりました!これはどうにかして問題を解決しました。75%のCPUがこのポートをリッスンしているプロセスを持っていました(それは正常に停止しなかった別のインスタンスのselenium-webdriverでしょう)。そのプロセスを終了すると、firefoxは通常のように起動します。 – nzifnab

+0

ありがとうございます。ロックポートとミューテックスは何ですか? – HelloWorldNoMore

6

私はlsof -i TCP:7054を行なったし、対応するprocess_idをを発見し、そして最後にkill -9 process_id

で指定されたプロセスを殺してから、再度テストを試みたが、それは働いた:)

+0

これは完全に私のために働いた、私は別のプロセスは、私が取り組んでいた過去のプロジェクトからの残党だったそのポートで実行していたことがわかった。 – Evolve

+0

あなたがそれを殺す前に、どのプロセスがポートを保持しているのかを理解してください!たとえば、私の場合、リモート接続でポートが使用されていました。そのプロセスでKill -9が悪い考えだったでしょう! – SamStephens

1

私はキュウリ+を使用してきましたcapybara + webdriver + parallel_tests、&上記のエラーが発生しました。

unless (env_no = ENV['TEST_ENV_NUMBER'].to_i).zero? 
    # Standard, which is described at the parallel_tests github page 
    Capybara.server_port = 8888 + env_no 

    # This successfully avoids locking port error, may require less, but 
    # on my 8 cores vm, this works like a charm 
    sleep env_no * 10 
end 

はUはおそらくuを使用するものに合わせて上記を適応させる必要がある、という考えがちょうど始まる避けるために睡眠時間を強制することです:問題を解決するには、私は機能/サポート/ env.rbに、次の追加しましたすべてのfirefoxインスタンスはabtと同時に45秒の待機時間では十分ではないかもしれません。

1

私もこれを取得していて、 "lsof -i TCP:7054"を実行していて、問題のあるPIDを強制終了すると私の問題も解決しました。

0

私はそれがポート7054上で実行するだろうと気づいたが、それはポート7055.

bundle update上でそれを探していましたが