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

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

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

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

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

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

 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测试中看到的结果。

有没有人有解决这个问题的建议?

更新:解决了问题

将$ DEBUG设置为true并重新运行测试后,此错误最有趣:

 : 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 

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

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

#config / initializers / selenium.rb

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

由于这是google和duck duck go中这个问题的最高得分条目,我将在此处记录我的解决方法。 我理解的问题是,selenium使用端口7054作为互斥*来解决firefox启动时问题真正的firefox并退出启动脚本的问题。 因此,真正的狐狸的PID只能从selenium中猜出并且并行启动多个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/

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