2010-11-28 17 views
13

Heute, wenn ich das selen webdrive benutze, habe ich einen Fehler bekommen. Meine Plattform ist Mac OSX. Das ist mein Ausnahmeprotokoll.Eine selen webdriver exception

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>' 

Ich weiß nicht, warum das passiert ist. Mein Firefox-Pfad ist der Standardpfad. danke für Ihre Hilfe !!

Antwort

19

WebDriver verwendet den Port 7054 (der "locking port") als Mutex, um sicherzustellen, dass wir nicht zwei Firefox-Instanzen gleichzeitig starten. Jede neue Instanz, die Sie erstellen, wartet vor dem Starten des Browsers auf den Mutex und gibt sie dann frei, sobald der Browser geöffnet ist.

Dies könnte in der Tat ein Ressourcenproblem sein - ein zuvor erstellter Treiber benötigt mehr als 45 Sekunden zum Starten und hält sich für diese Zeit am Schloss fest.

Wenn dies in Ihrem Fall unwahrscheinlich erscheint, wäre es interessant zu wissen, welcher Prozess das Schloss hält. Versuchen Sie, lsof -i TCP:7054 in den 45 Sekunden vor dem Timeout auszuführen.

Running Ruby mit -d (oder Einstellung $DEBUG = true) wird auch einige nützliche Informationen für das Debuggen weiter zur Verfügung stellen.

+0

Dank suchen! Dies half mir, das Problem irgendwie zu beheben. Ich hatte einen Prozess, bei dem 75% CPU auf diesen Port lauschte (vielleicht eine andere Instanz von Selen-Webdriver, die nicht aufhörte). Durch das Töten dieses Prozesses kann Firefox wie gewohnt starten. – nzifnab

+0

Danke. Können Sie mir bitte sagen, was ist ein Sperr-Port und Mutex? – HelloWorldNoMore

6

Ich habe lsof -i TCP:7054 und fand die entsprechenden process_id, und dann schließlich den gegebenen Prozess mit kill -9 process_id getötet

und versuchte dann den Test erneut, und es hat funktioniert hat :)

+0

Das funktionierte für mich total, fand heraus, dass ich einen anderen Prozess hatte, der auf diesem Port lief, der ein Rest von einem früheren Projekt war, an dem ich gearbeitet hatte. – Evolve

+0

Stellen Sie sicher, dass Sie verstehen, welcher Prozess den Port hält, bevor Sie ihn löschen! In meinem Fall wurde der Port beispielsweise von meiner Remote-Verbindung verwendet. Kill -9 bei diesem Prozess wäre eine schlechte Idee gewesen! – SamStephens

1

Ich habe Gurke + benutze capybara + webdriver + parallel_tests, & Ich habe den erwähnten Fehler gefunden. Um das Problem zu beheben, i die folgenden Funktionen hinzugefügt/support/env.rb:

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 wahrscheinlich braucht, um die oben anpassen zu passen, was u verwendet, ist die Idee, nur eine Schlafzeit zu erzwingen Starten zu vermeiden alle firefox-Instanzen zur gleichen Zeit, wo eine Wartezeit von 45 Sekunden möglicherweise nicht genug ist.

1

Ich bekam dies auch und läuft "lsof -i TCP: 7054" und das Töten der störenden Pid behoben mein Problem auch.

0

Ich bemerkte, dass es auf Port 7054 laufen würde, aber es war für sie auf Port 7055.

bundle update hat es für mich