2011-07-26 42 views
11

我最近在嘗試運行任何Cucumber測試時開始看到此錯誤消息。我已經做了一些調查,發現了其他一些類似的錯誤情況,但其中大部分都是與瀏覽器相關的問題。我沒有看到任何瀏覽器的特定錯誤消息在此輸出:Ruby - 無法在45秒內綁定到鎖定端口7054(Selenium :: WebDriver :: Error :: WebDriverError)

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運行這些測試。每次都有同樣的信息。

不是一個陰謀論者或任何東西,但一切工作正常我手動退出運行我的測試套件,並運行在所有黃瓜啓動活動的Firefox進程一個pkill的面前。在測試套件中,我有大約9個Firefox實例同時運行。我不確定這是否會導致某些事情發生,從而產生我現在從運行Cucumber測試中看到的結果。

有沒有人有任何建議來解決這個問題?

+0

你嘗試在45秒的窗口中運行lsof命令,而它的等待連接?使用$ DEBUG = true(或將-d傳遞給ruby)運行將爲您提供更多的調試輸出。 – jarib

+0

我在第一次測試期間在45秒窗口內運行了lsof。我仍然沒有得到任何輸出。在調試模式下運行,給我這個錯誤,我有每一個寶石:「Exception'NoMethodError'rvm/gems/ruby​​-1.9.2-p136/gems/bundler-1.0.15/lib/bundler/lazy_specification.rb:66 - 未定義的方法'to_ary'爲json_pure(1.5.1):Bundler :: LazySpecification「 –

+0

$ DEBUG = true將打印所有獲救的異常,所以預計會有很多輸出。看到輸出將幫助我們診斷您的問題。 – jarib

回答

18

更新:問題就迎刃而解了

$ 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」,而是不得不使用127.0.0.1:3000來查看我的rails項目。

解決方案:

我錯過了在/ etc/hosts中的本地主機的主機文件條目:

127.0.0.1 localhost 

很尷尬的問題,但它的答案仍然。

+0

+1:我將我的主機文件從Windows複製到OS X. Windows不需要本地主機條目(由DNS處理),但是OS X則需要。如果我沒有找到你的答案,可能我不知道如何解決這個問題,所以謝謝。 – rsenna

+0

也爲我工作,非常感謝。 –

0

由於這是在谷歌和鴨鴨這個問題上得分最高的條目,我會在這裏記錄我的解決方法。我的理解是,硒使用端口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 

中硒的啓動代碼。

修復此提示之後建模:http://www.assertselenium.com/selenium-tips-tricks/

* A互斥是一個程序對象,允許多個程序線程共享相同的資源,例如文件訪問,但不是同時。

0

我能夠在一個初始化器中重新設置這個常量,而且工作量少一點。我需要將它設置得更短,以便我的腳本可以創建另一個瀏覽器。

#配置/初始化/ selenium.rb

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

相關問題