2012-01-24 16 views
11

Ho bisogno di eseguire capybara-webkit all'interno di un'applicazione Rails per abilitare la navigazione web headless con il supporto JavaScript (vale a dire non per test/scopi CI, e webrat o altri driver/framework di test di accettazione non funzioneranno). Mi chiedo se sia possibile su una distribuzione di Heroku, in particolare perché richiede QtWebKit e la possibilità di eseguire il fork del processo webkit_server con la comunicazione socket. Sono aperto a idee creative su come realizzare questo lavoro su Heroku (ad esempio un pool di dinamiche dei lavoratori). Spero che qualcuno riesca a gestire meglio i vincoli esistenti nell'ambiente Heroku o che possa escludere categoricamente la possibilità di passare ad AWS EC2 se necessario.È possibile eseguire capybara-webkit (cioè, forked webkit_server) su Heroku Cedar?

La ricerca di questo tende a presentare molte informazioni sui test di capibara e sui componenti aggiuntivi per i server CI, nessuno dei quali è rilevante per il mio caso d'uso. Non sto testando nulla (almeno non nel tradizionale senso cetriolo/rspec/etc) - Sto usando l'integrazione di Capybara con il driver webkit, i finder e il modello nodo/elemento per navigare in un sito web che richiede una quantità significativa di client- lato JS per lavorare.

Sono aperto anche ad altre soluzioni (nativo Ruby) per l'interazione programmatica con siti Web utilizzando DOM abilitato per JavaScript.

risposta

7

ho parlato con il supporto Heroku su questo e la loro risposta è stata che questo è fondamentalmente a) non supportato; b) molto difficile, tra cui (tra le altre cose) una versione di QtWebKit creata staticamente.

Le mie indagini su Amazon EC2 mi hanno fatto capire che QtWebKit richiede un'istanza in esecuzione di Xvfb. Dubito fortemente che questo sia disponibile su Heroku e sospetto che sarebbe estremamente difficile farlo funzionare.

Il mio approccio è stato quello di mettere questa funzionalità su un'istanza EC2. Dopo aver fatto alcuni tentativi con le AMI standard di Amazon (la loro build e RHEL), ho scoperto che i pacchetti disponibili attraverso i sistemi di gestione dei pacchetti di Ubuntu hanno reso MOLTO più facile ottenere una corsa.

Per farla breve: Heroku è un non-starter, Amazon EC2 con Ubuntu è il modo migliore per andare.

2

Potrebbe essere possibile ottenere ciò che si desidera utilizzando PhantomJS.

Questo progetto ha un JavaScript, piuttosto che un'API di Ruby, sebbene l'istanza del browser possa esporre un server Web, consentendo di comunicare con esso da Ruby su HTTP.

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

+1

la gemma poltergeist fornisce un'API Ruby a PhantomJS – subelsky

+0

Sembra che Capybara/Phantomjs/Poltergeist non funzioni su Heroku. Il biglietto è chiuso, quindi non è probabile che lo farà presto. https: // GitHub.com/jonleighton/poltergeist/issues/194 –

5

sono stato in grado di eseguire con successo Capybara + Poltergeist + PhantomJS su Heroku

Ho messo phantomjs compilati i binari per OSX (per la mia macchina di sviluppo) e linux-64 (per Heroku) in bin/cartella del mio Applicazione Rails.

inizializzatori/capybara.rb

codice
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 

Esempio:

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

buona fortuna!

+0

Le cose devono essere cambiate dal 2015 - Ora invece di includere i binari nel raccoglitore puoi usare la gemma phantomjs e creare il 'phantomjs_path' =' Phantomjs.path.to_s' – MingMan

Problemi correlati