(Watir-) Webdriver не может найти стабильное соединение Firefox на Fedora 14 с Firefox 10 - PullRequest
2 голосов
/ 18 февраля 2012

Я пытаюсь запустить watir на Ruxpace 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 является EOL для Firefox и больше не поддерживается.

Я установил watir через rubygems, и вот мои версии.

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, он вообще не работает. У меня установлен безголовый камень. В моем коде все разделено на модули, но я убедился, что следующий код демонстрирует точно такое же поведение.

В маршрутах .rb у меня есть ресурс

resources :stories

Тогда в story_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 и получаю ответ об ошибке. В production.log я нахожу следующую ошибку

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

Я использую Rails 3.0.3 на Apache / 2.2.17 (Unix), связанный с Phusion Passenger, установленным через гем Passenger (3.0.11).

Когда я запускаю только скрипт (который работает) из командной строки, я замечаю, что Xvfb запускается и запускаются два процесса firefox, один из которых сразу перестает работать. Второй процесс продолжает работать, и я полагаю, что он правильно выполняет сценарий.

Когда я наблюдаю тот же код, запущенный из среды rails, я вижу ту же цепочку событий, но появляется несуществующий процесс firefox, а затем немедленно останавливает выполнение. Затем я вижу цепочку запуска процессов PhusionHelper.

Есть идеи, почему реальный процесс firefox останавливается в rails при запуске через apache -> phusion -> rails, но не в интерпретаторе ruby? Я даже проверил следующие работы

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

Так что я не уверен, что это просто проблема среды рельсов.


РЕДАКТИРОВАТЬ 2

Пробовал точно такой же код, но в chrome, используя ChromeDriver и watir-webdriver, и я получаю те же результаты, что и раньше, за исключением того, что в рельсах я получаю эту ошибку:

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. Насколько я понимаю, webdriver подключается к браузерам через архитектуру сервер / клиент через потоковый сокет. Соединение происходит в socket_poller.rb в selenium_webdriver здесь:

      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 и выполнив оттуда скрипт.

Я приветствую дальнейшее понимание точной причины этого.

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

Обычно эта ошибка возникает, когда Firefox не запускается. Это в основном потому, что ваш блок стойки не имеет головы, а для запуска Firefox необходим доступный дисплей. Установите Xvfb и попробуйте еще раз, используя headless gem - http://rubygems.org/gems/headless

0 голосов
/ 17 марта 2013

У меня очень похожая проблема.В моем случае у меня простая среда, без Phusion.Я использую безголовый режим, даже если у меня установлен графический интерфейс.Сценарий правильно работал от имени пользователя root, и он зависал при запуске от имени другого пользователя.Я решил это, запустив Firefox вручную один раз (как запрашиваемый пользователь) и удалив каждую проверку обновлений.

...