2012-01-24 15 views
11

Necesito ejecutar capybara-webkit dentro de una aplicación de Rails para habilitar la navegación web sin cabeza con soporte de JavaScript (es decir, no para propósitos de prueba/CI, y webrat u otras pruebas de aceptación de controladores/marcos no funcionarán). Me pregunto si esto es posible en una implementación de Heroku, específicamente porque requiere QtWebKit y la capacidad de bifurcar el proceso de webkit_server con la comunicación de socket. Estoy abierto a ideas creativas sobre cómo hacer que esto funcione en Heroku (por ejemplo, un grupo de trabajadores dinnos). Espero que alguien tenga una mejor idea de las restricciones que existen en el entorno de Heroku, o puede descartar categóricamente la posibilidad de que pueda pasar a AWS EC2 si es necesario.¿Es posible ejecutar capybara-webkit (es decir, webkit_server forked) en Heroku Cedar?

Buscar esto tiende a aparecer mucho sobre las pruebas de capibara y complementos para servidores de CI, ninguno de los cuales son relevantes para mi caso de uso. No estoy probando nada (al menos no en el sentido tradicional de pepino/rspec/etc) - Estoy usando la integración de Capybara con el controlador de webkit, los buscadores y el modelo de nodo/elemento para navegar en un sitio web que requiere una gran cantidad de clientes. lado JS para trabajar.

También estoy abierto a otras soluciones (nativas de Ruby) para interactuar mediante programación con sitios web usando DOM habilitado para JavaScript.

Respuesta

7

Hablé con el apoyo Heroku sobre esto y su respuesta fue que esto es básicamente una) sin soporte; b) muy difícil, incluyendo (entre otras cosas) una versión estáticamente construida de QtWebKit.

Mi propia investigación sobre esto en Amazon EC2 también me hizo darme cuenta de que QtWebKit requiere una instancia en ejecución de Xvfb. Dudo mucho que esto esté disponible en Heroku, y sospecho que sería extremadamente difícil hacerlo funcionar.

Mi propio enfoque ha sido poner esta funcionalidad en una instancia de EC2. Después de hacer algunos intentos con las AMI estándar de Amazon (su compilación y RHEL), descubrí que los paquetes disponibles a través de los sistemas de administración de paquetes de Ubuntu hacían MUCHO más fácil la ejecución.

Resumen de la historia larga: Heroku no es un iniciador, Amazon EC2 con Ubuntu es la mejor manera de hacerlo.

2

Puede lograr lo que quiere con PhantomJS.

Este proyecto tiene JavaScript, en lugar de Ruby API, aunque la instancia del navegador puede exponer un servidor web, lo que le permite comunicarse con él desde Ruby a través de HTTP.

http://code.google.com/p/phantomjs/wiki/Interface

+1

la gema poltergeist proporciona una API Ruby a PhantomJS – subelsky

+0

Parece que Capybara/Phantomjs/Poltergeist no funciona en Heroku. El ticket está cerrado, por lo que no es probable que lo haga pronto. https: // github.com/jonleighton/poltergeist/issues/194 –

5

que era capaz de ejecutar con éxito Carpincho + + Poltergeist PhantomJS en Heroku

He colocado PhantomJS compilados binarios para OSX (para mi máquina de desarrollo) y Linux-64 (para Heroku) en bin/carpeta de mi Aplicación Rails.

inicializadores/capybara.rb

require 'capybara/poltergeist' 

Capybara.register_driver :poltergeist do |app| 
    phantomjs_path = if RUBY_PLATFORM['x86_64-darwin'] 
        Rails.root.join('bin', 'phantomjs-osx').to_s 
        elsif RUBY_PLATFORM['x86_64-linux'] 
        Rails.root.join('bin', 'phantomjs-linux-64').to_s 
        else 
        raise "Can't load PhantomJS for OS: #{RUBY_PLATFORM}" 
        end 

    options = { 
     phantomjs: phantomjs_path, 
     phantomjs_logger: Logger.new('/dev/null'), 
     phantomjs_options: %w[--load-images=no --ignore-ssl-errors=yes], 
     js_errors: false, 
     timeout: 90 
    } 
    Capybara::Poltergeist::Driver.new(app, options) 
end 

Capybara.default_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 
Capybara.default_wait_time = 1 

Ejemplo de código:

session ||= Capybara::Session.new(:poltergeist) 
session.visit('http://google.com') 

buena suerte!

+0

Las cosas deben haber cambiado desde 2015 - Ahora, en lugar de incluir los binarios en el contenedor, puedes usar la gema phantomjs y luego hacer 'phantomjs_path' =' Phantomjs.path.to_s' – MingMan

Cuestiones relacionadas