Ruby - 无法在45秒内绑定到锁定端口7054(Selenium :: WebDriver :: Error :: WebDriverError)

时间:2011-07-26 16:31:10

标签: ruby-on-rails ruby selenium cucumber

我最近在尝试运行任何Cucumber测试时都开始看到此错误消息。我做了一些研究,发现了一些其他类似的错误实例,但大多数是与浏览器相关的问题。我在此输出中看不到任何特定于浏览器的错误消息:

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

我看到这里发布的另一个问题得到解答(A selenium webdriver exception),但是这个解决方案对我不起作用。运行“ lsof -i TCP:7054 ”不会产生任何输出。

万一有人建议这样做,我已经多次重启我的机器并擦掉了我的宝石并重新运行了“捆绑”。

以下是我正在使用的相关宝石:

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运行这些测试。每次都是相同的消息。

不要成为一个阴谋理论家或任何东西,但在我手动退出运行我的测试套件并对Cucumber启动的所有活动Firefox进程运行时,一切正常。我在测试套件中同时运行了大约9个Firefox实例。我不确定这是否会导致一些事情发生,从而产生我现在看到的运行Cucumber测试的结果。

有没有人有解决此问题的建议?

4 个答案:

答案 0 :(得分:19)

更新:解决问题

将$ DEBUG设置为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查看我的rails项目。

解决方案:

我错过了/ etc / hosts中的localhost主机文件条目:

127.0.0.1 localhost

相当令人尴尬的问题,但它仍然是答案。

答案 1 :(得分:0)

由于这是google和duck duck go中此问题的最高得分条目,我将在此处记录我的解决方法。我理解的问题是,selenium使用端口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

在selenium的启动代码中。

在此提示后建模:http://www.assertselenium.com/selenium-tips-tricks/

*互斥锁是一个程序对象,它允许多个程序线程共享相同的资源,例如文件访问,但不能同时共享。

答案 2 :(得分:0)

我能够在初始化程序中重置此常量,但工作量稍少。我需要将其缩短,以便我的脚本可以创建另一个浏览器。

#config / initializers / selenium.rb

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

答案 3 :(得分:0)

我在使用 Chrome 时遇到了同样的问题,并在我的 application_system_test_case.rb 中使用了以下内容:

class Selenium::WebDriver::Service
  remove_const(:SOCKET_LOCK_TIMEOUT)
  SOCKET_LOCK_TIMEOUT = 120
end