我最近在尝试运行任何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测试的结果。
有没有人有解决此问题的建议?
答案 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