【问题标题】:Ruby - unable to bind to locking port 7054 within 45 seconds (Selenium::WebDriver::Error::WebDriverError)Ruby - 无法在 45 秒内绑定到锁定端口 7054 (Selenium::WebDriver::Error::WebDriverError)
【发布时间】:2011-07-26 16:31:09
【问题描述】:

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

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

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

以防万一有人建议这样做,我已经多次重新启动我的机器并擦除了我的 gemset 并重新运行了“捆绑包”。

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

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 进程运行 pkill 之前,一切正常。在测试套件期间,我有大约 9 个 Firefox 实例同时运行。我不确定这是否会导致发生一些混乱的事情,从而产生我现在通过运行 Cucumber 测试看到的结果。

有人对解决这个问题有什么建议吗?

【问题讨论】:

  • 您是否尝试在等待连接的 45 秒窗口中运行 lsof 命令?使用 $DEBUG = true 运行(或将 -d 传递给 ruby​​)将为您提供更多调试输出。
  • 我确实在第一次测试期间运行了 lsof,在 45 秒的窗口内。我仍然没有得到任何输出。对于我拥有的每个 gem,使用调试模式运行都会出现此错误:“Exception NoMethodError' at rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.15/lib/bundler/lazy_specification.rb:66 - undefined method to_ary' for json_pure (1.5.1):Bundler::LazySpecification”
  • $DEBUG = true 将打印所有获救的异常,因此预计会有很多输出。查看该输出将帮助我们诊断您的问题。
  • 抱歉,$DEBUG 需要在 Ruby 代码中设置为全局变量,而不是环境变量。通过在命令行上将 -d 传递给 ruby​​ 也可以实现同样的目的。

标签: ruby-on-rails ruby selenium cucumber


【解决方案1】:

更新:问题已解决

在将 $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:我将主机文件从 Windows 复制到 OS X。Windows 不需要 localhost 条目(由 DNS 处理),但 OS X 需要。如果我没有找到您的答案,我可能不会知道如何解决这个问题,所以谢谢。
【解决方案2】:

我能够在初始化程序中重置这个常量,而工作量少了一点。我需要将它设置得更短,以便我的脚本可以创建另一个浏览器。

# 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】:

    由于这是 google 和 duck duck go 在这个问题上得分最高的条目,我将在此处记录我的解决方法。据我了解,问题是 selenium 使用端口 7054 作为互斥体 * 来解决 firefox 在启动时分叉真正的 firefox 并退出启动脚本的问题。因此,真正的 fox 的 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/

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多