2010-11-28 50 views
13

今天,当我使用硒webdrive,我得到了一个错误。我的平台是mac osx。这是我的例外日志。一个硒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>' 

我不知道为什么发生这种情况。我的firefox路径是默认路径。 感谢您的帮助!

回答

19

WebDriver使用端口7054(“锁定端口”)作为互斥体,以确保我们不会同时启动两个Firefox实例。您创建的每个新实例都将在启动浏览器之前等待互斥锁,然后在浏览器打开后立即释放它。

所以这可能确实是一个资源问题 - 以前创建的驱动程序需要超过45秒才能启动并且保持当前的锁定状态。

如果在你的情况下这看起来不太可能,那么知道哪个进程持有锁将会很有趣。尝试在超时前的45秒内运行lsof -i TCP:7054

使用-d(或设置$DEBUG = true)运行红宝石还将提供一些有用的信息,用于进一步调试。

+0

谢谢!这帮助我以某种方式解决了这个问题,我花了75%的CPU监听这个端口(也许是另一个没有优雅地停止的selenium-webdriver实例)。杀死该进程让Firefox像平常一样启动。 – nzifnab 2011-06-06 22:07:21

+0

谢谢。你能告诉我什么是锁定端口和互斥锁吗? – HelloWorldNoMore 2016-04-13 18:26:21

6

我做lsof -i TCP:7054,发现相应的PROCESS_ID,最后杀死了给定的过程与kill -9 process_id

然后试图再次测试,发现其工作:)

1

我一直用黄瓜+水豚+ webdriver + parallel_tests,&我遇到了上述错误。要解决这个问题,我增加了以下功能到/支持/ 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干什么用的,这个想法仅仅是强制的睡眠时间,以避免启动所有的firefox实例在同一时间,等待45secs可能不够。

1

我得到这个以及运行“lsof -i TCP:7054”并杀死冒犯的pid也解决了我的问题。

0

我注意到,它会在端口7054上运行,但它一直在寻找它在端口7055

bundle update为我做