【发布时间】: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 并且不再受支持。
我通过 rubygems 安装了 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 我得到了与以前完全相同的结果,除了在 rails 中我得到这个错误:
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