Я пытаюсь запустить 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 и выполнив оттуда скрипт.
Я приветствую дальнейшее понимание точной причины этого.