2010-11-28 20 views
13

Hoy, cuando uso el webbinive de selenio, recibo un error. mi plataforma es mac osx este es mi registro de excepción.Una excepción de Seinerium webdriver

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

no sé por qué sucedió esto. mi ruta de Firefox es la ruta predeterminada. gracias por su ayuda !!

Respuesta

19

WebDriver utiliza el puerto 7054 (el "puerto de bloqueo") como un mutex para garantizar que no ejecutemos dos instancias de Firefox al mismo tiempo. Cada nueva instancia que cree esperará el mutex antes de iniciar el navegador, luego lo lanzará tan pronto como el navegador esté abierto.

Por lo tanto, esto podría ser un problema de recursos: un controlador creado anteriormente tarda más de 45 segundos en iniciarse y se está reteniendo en ese momento.

Si esto no parece probable en su caso, sería interesante saber qué proceso está manteniendo el bloqueo. Intenta ejecutar lsof -i TCP:7054 en los 45 segundos antes de que se agote el tiempo de espera.

Ejecutar Ruby con -d (o configuración $DEBUG = true) también proporcionará información útil para depurar esto aún más.

+0

Gracias! Esto me ayudó a solucionar el problema de alguna manera. Tuve un proceso que acaparaba un 75% de CPU que escuchaba este puerto (tal vez otra instancia de Selenium-webdriver que no se detuvo con gracia). Matar ese proceso permite que Firefox arranque como siempre. – nzifnab

+0

Gracias. ¿Puedes decirme qué es un puerto de bloqueo y mutex? – HelloWorldNoMore

6

lo hice lsof -i TCP:7054 halló al id_proceso correspondiente, y finalmente mató al proceso dado con kill -9 process_id

y luego trató de la prueba de nuevo, y se trabajó :)

+0

Esto funcionó por completo para mí, descubrí que tenía otro proceso ejecutándose en ese puerto, que era un remanente de un proyecto anterior en el que había trabajado. – Evolve

+0

¡Solo asegúrese de entender qué proceso está sujetando el puerto antes de matarlo! Por ejemplo, en mi caso, el puerto estaba siendo utilizado por mi conexión remota. ¡Matar -9 en ese proceso hubiera sido una mala idea! – SamStephens

1

He estado usando el pepino + capybara + webdriver + parallel_tests, & He encontrado el error mencionado. Para resolver el problema, he añadido las siguientes características a/soporte/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 

T probablemente tendrá que adaptar el anterior para adaptarse a lo que el uso de u, la idea es sólo para forzar un tiempo de sueño para evitar un arranque todas las instancias de Firefox al mismo tiempo, donde una espera de 45 segundos puede no ser suficiente.

1

Estaba obteniendo esto también y ejecutando "lsof -i TCP: 7054" y matando al pid ofensor también solucionó mi problema.

0

me di cuenta de que iba a ejecutar en el puerto 7054 pero estaba buscando en el puerto 7055.

bundle update lo hizo por mí

Cuestiones relacionadas