2012-01-24 47 views
11

我需要在Rails應用程序中運行capybara-webkit,以支持使用JavaScript支持的無頭網頁瀏覽(即不用於測試/ CI目的,並且webrat或其他驗收測試驅動程序/框架不起作用)。我想知道這是否可以在Heroku部署中使用,特別是因爲它需要QtWebKit以及使用套接字通信分離webkit_server進程的能力。對於如何在Heroku上進行這項工作(例如工作人員動態庫),我很樂意提供創意。我希望有人能更好地處理Heroku環境中存在的約束,或者可以絕對排除這種可能性,以便我可以根據需要轉向AWS EC2。是否可以在Heroku Cedar上運行capybara-webkit(即分叉webkit_server)?

尋找這個問題往往會引發很多關於CI服務器的水豚測試和附件的問題,這兩者都與我的用例無關。我沒有測試任何東西(至少不是在傳統的cucumber/rspec/etc中) - 我正在使用Capybara與webkit驅動程序,查找程序和節點/元素模型的集成來瀏覽一個需要大量客戶端 - 方JS爲了工作。

我也對其他(原生Ruby)解決方案開放,以使用支持JavaScript的DOM以編程方式與網站進行交互。

回答

7

我向Heroku的支持這件事,他們的回答是,這基本上是一個)不支持的; b)非常困難,包括(除其他之外)靜態構建的QtWebKit版本。

我在Amazon EC2上對此進行的調查也讓我意識到QtWebKit需要運行Xvfb實例。我非常懷疑這可以在Heroku上得到,我懷疑要使它工作是非常困難的。

我自己的方法是將此功能放在EC2實例上。在對亞馬遜的標準AMI(他們的版本和RHEL)進行了一些嘗試之後,我發現通過Ubuntu的軟件包管理系統提供的軟件包使啓動運行起來更容易。

長話短說:Heroku不是首發,Amazon EC2與Ubuntu是最好的選擇。

2

您可能可以使用PhantomJS完成您想要的功能。

雖然瀏覽器實例可以公開一個Web服務器,允許您通過HTTP通過Ruby進行通信,但該項目使用JavaScript,而不是Ruby API。

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

+1

poltergeist gem提供了一個Ruby API到PhantomJS – subelsky

+0

似乎Capybara/Phantomjs/Poltergeist在Heroku上不起作用。該票已關閉,因此很可能不會很快。 https://開頭github上。com/jonleighton/poltergeist/issues/194 –

5

我能夠在Heroku

成功運行,水豚+騷靈+ PhantomJS我在斌/文件夾放置編譯phantomjs二進制文件OSX(我的開發機)和Linux-64(用於Heroku的)我Rails應用程序。

初始化/ 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 

示例代碼:

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

祝你好運!

+0

事情自2015年以來一定發生了變化 - 現在,您可以使用phantomjs gem,然後將'phantomjs_path' ='Phantomjs.path.to_s' – MingMan

相關問題