【问题标题】:(Watir-)Webdriver cannot find stable firefox connection on Fedora 14 w/ Firefox 10(Watir-)Webdriver 在带 Firefox 10 的 Fedora 14 上找不到稳定的 Firefox 连接
【发布时间】:2013-03-18 03:27:51
【问题描述】:

我试图让 watir 在 rackspace linux 机器 (fedora 14) 上运行,但是当我尝试启动 watir 时出现此错误

Selenium::WebDriver::Error::WebDriverError: unable to obtain stable firefox connection in 60 seconds

我从 firefox 3.6.24 开始并升级到 firefox 10.0.2。当我升级时,我收到一条警告,说 fedora 14 是 Firefox 的 EOL 并且不再受支持。

我通过 ruby​​gems 安装了 watir,这是我的版本。

watir-webdriver (0.5.3)
selenium-webdriver (2.19.0)

我还安装了 GNOME,认为 firefox 和 selenium 需要一个窗口系统才能正常运行。我错过了什么?我要做的就是在远程 linux 服务器上自动执行浏览器操作。一切都使用 Mac OSX Lion 在本地运行。


编辑 1

好的,所以这变得很奇怪。当我从命令行运行以下脚本时,它可以在服务器上运行。

#! /usr/bin/env ruby

require 'watir-webdriver'
require 'headless'

@headless = Headless.new
@headless.start
browser = Watir::Browser.new :ff
browser.goto("http://www.google.com")

但是当我在 rails 环境中运行代码时,它根本不起作用。我确实安装了无头 gem。在我的代码中,事物被分成模块,但我验证了以下代码表现出完全相同的行为。

在 routes.rb 我有一个资源

resources :stories

然后在 stories_controller 我有这段代码

def create
    @headless = Headless.new
    @headless.start
    browser = Watir::Browser.new :ff
    browser.goto("http://google.com")
    count = browser.as.count
    respond_to do |format|
      format.json {render :json => {:count => count}.to_json}
    end
end

我向 server_ip/stories 发送一个 post 请求并得到一个错误响应。在 production.log 中我发现以下错误

Selenium::WebDriver::Error::WebDriverError (unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055)):

我在 Apache/2.2.17 (Unix) 上使用 Rails 3.0.3,与通过 Passenger (3.0.11) gem 安装的 Phusion Passenger 连接。

当我从命令行仅运行脚本(有效)时,我观察到 Xvfb 已启动并启动了两个 firefox 进程,其中一个立即失效。第二个进程继续运行,我假设它正在正确执行脚本。

当我观察到在 rails 环境中运行相同的代码时,我看到了相同的事件链,但出现了未失效的 firefox 进程,然后立即停止执行。然后我看到一串 PhusionHelper 进程启动。

知道为什么真正的 firefox 进程会在通过 apache --> phusion --> rails 而不是在 ruby​​ 解释器中运行时停止在 rails 中吗?我什至验证了以下作品

rails console
h = Headless.new
h.start
b = Watir::Browser.new :ff

所以我不相信这只是一个 Rails 环境问题。


编辑 2

尝试了完全相同的代码,但在 chrome 中使用 ChromeDriver 和 watir-webdriver 我得到了与以前完全相同的结果,除了在 r​​ails 中我得到这个错误:

Selenium::WebDriver::Error::UnknownError (Unable to either launch or connect to Chrome. Please check that ChromeDriver is up-to-date. Using Chrome binary at: /opt/google/chrome/google-chrome):

编辑 3

我将问题缩小到 Phusion Passenger。据我了解,webdriver 通过流套接字上的服务器/客户端架构连接到浏览器。连接发生在 selenium_webdriver 的 socket_poller.rb 中:

      addr     = Socket.getaddrinfo(@host, @port, Socket::AF_INET, Socket::SOCK_STREAM)
      sock     = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
      sockaddr = Socket.pack_sockaddr_in(@port, addr[0][3])

      begin
        sock.connect_nonblock sockaddr

......并且在这里获救

    rescue *NOT_CONNECTED_ERRORS
      sock.close if sock
      $stderr.puts [@host, @port].inspect if $DEBUG
      false
    end

原来 phusion_passenger 不允许您在套接字上查找或倒带,并提供一个不响应这些方法的包装器。你可以在这里阅读更多http://rubydoc.info/github/FooBarWidget/passenger/master/PhusionPassenger/Utils/UnseekableSocket我不确定这是否是确切的问题,但我认为它必须与此有关。

这就解释了为什么在 Phusion Passenger 框架内运行此服务会失败,但在其他地方运行。我能够通过在Passenger/Rails 框架之外创建一个简单的服务器并从那里执行脚本来解决这个问题。

我欢迎对造成这种情况的确切原因提供更多见解。

【问题讨论】:

  • 这是一个网络驱动程序问题,我编辑了您的标题并相应地重新标记。 Watir-webdriver 使用 webdriver 与浏览器进行所有通信(并将其包装在更友好的 watir API 中),在这种情况下,问题是 webdriver 无法连接到 firefox,这是 watir-webdriver 的 webdriver 端的问题。
  • 我用这个主题解决了我的类似问题:stackoverflow.com/q/5782055/270433小心运行你的 Rails 应用程序的用户

标签: linux firefox webdriver fedora gnome


【解决方案1】:

通常,当 Firefox 无法启动时会出现此错误。这主要是因为您的机架空间盒是无头的,而 Firefox 需要可用的显示器才能运行。安装 Xvfb 并再次尝试使用 headless gem - http://rubygems.org/gems/headless

【讨论】:

  • 有道理。我没有在系统上安装 Xvfb,所以我继续这样做。奇怪的是,当我使用 rails 控制台(h = Headless.new;h.start;Watir::Browser.new :ff)时,一切都很好,但是当我从 rails 应用程序的上下文中执行代码时,它却没有似乎不起作用。仍然说它无法获得稳定版本的 Firefox。
  • 我用更多细节更新了这个问题。非常感谢您的帮助
  • 很奇怪。首先,它是否在开发模式下工作?其次,为什么要在控制器中创建 Watir-WebDriver 实例?
  • 是的,它在开发模式下工作 (WebBrick)。我正在创建一个 Api,控制器调用存储在一些帮助模块中的方法。这些模块进行一些处理并向控制器报告这些操作的成功或失败。然后控制器将日志报告发送回客户端。所以对 Watir 的调用不一定在控制器中,而是在控制器的上下文中调用。我开始怀疑,Passenger 如何处理从 ApplicationController 继承的类,而不是 rails 控制台如何处理它们,是否有什么独特之处。
  • 抱歉,我还是不明白为什么你需要在开发/生产模式下使用 Watir。它应该像水豚一样被满足:1)在测试环境中; 2) 在单独的服务器上运行单独的应用程序实例(例如 Webrick)。这个问题可能与单独的进程有关(一个用于Passenger的应用程序,一个用于Firefox),但我不确定。
【解决方案2】:

我遇到了一个非常相似的问题。 就我而言,我有一个简单的环境,没有 Phusion。 我使用的是无头模式,即使我安装了图形界面。 该脚本以 root 身份正常运行,但在以其他用户身份运行时崩溃。 我通过手动运行一次 Firefox(作为请求的用户)并删除了每次更新检查来解决它。

HTH

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 2012-07-19
    • 2013-05-30
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多