lakesare lakesare - 4 months ago 15
Ruby Question

Watir app deployed to heroku

I'm trying to deploy an app to Heroku that uses Watir webdriver. It runs successfully locally. According to answers to this question: Can you deploy Watir on Heroku to generate HTML Snapshots? If so, how?, you can do it. I followed steps from this answer http://stackoverflow.com/a/21267376/3192470. My app.rb looks like this:

require "sinatra"
require "rubygems"
require "shotgun"
require "rake"
require "watir"

get '/sending_out' do
browser = Watir::Browser.new :phantomjs
erb :index
end


But it crashes when deployed to Heroku with these logs:

2014-10-24T13:01:10.620468+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/launcher.rb:32:in `launch'
2014-10-24T13:01:10.620465+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/launcher.rb:35:in `block in launch'
2014-10-24T13:01:10.620480+00:00 app[web.1]: credits.rb:44:in `rencredit'
2014-10-24T13:01:10.620496+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `process_route'
2014-10-24T13:01:10.620510+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `block in invoke'
2014-10-24T13:01:10.620534+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:217:in `call'
2014-10-24T13:01:10.620590+00:00 app[web.1]: /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service'
2014-10-24T13:01:10.620460+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/binary.rb:60:in `execute'
2014-10-24T13:01:10.620475+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/watir-webdriver-0.6.11/lib/watir-webdriver/browser.rb:46:in `initialize'
2014-10-24T13:01:10.620491+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (2 levels) in route!'
2014-10-24T13:01:10.620506+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `invoke'
2014-10-24T13:01:10.620524+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
2014-10-24T13:01:10.620587+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `call'
2014-10-24T13:01:10.620469+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/bridge.rb:24:in `initialize'
2014-10-24T13:01:10.620484+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!'
2014-10-24T13:01:10.620500+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `route!'
2014-10-24T13:01:10.620525+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
2014-10-24T13:01:10.620526+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
2014-10-24T13:01:10.620528+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
2014-10-24T13:01:10.620529+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
2014-10-24T13:01:10.620574+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:2014:in `call'
2014-10-24T13:01:10.621081+00:00 app[web.1]: ip-10-226-67-253.ec2.internal - - [24/Oct/2014:13:01:10 UTC] "POST /sending_out HTTP/1.1" 500 30
2014-10-24T13:01:10.620462+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/binary.rb:34:in `start_with'
2014-10-24T13:01:10.620477+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/watir-5.0.0/lib/watir/loader.rb:9:in `initialize'
2014-10-24T13:01:10.620492+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1006:in `block in process_route'
2014-10-24T13:01:10.620507+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1073:in `dispatch!'
2014-10-24T13:01:10.620531+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/logger.rb:15:in `call'
2014-10-24T13:01:10.620588+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:in `service'
2014-10-24T13:01:10.620459+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/binary.rb:127:in `path'
2014-10-24T13:01:10.620474+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver.rb:67:in `for'
2014-10-24T13:01:10.620490+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:985:in `route_eval'
2014-10-24T13:01:10.620505+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `catch'
2014-10-24T13:01:10.620517+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
2014-10-24T13:01:10.620584+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `block in call'
2014-10-24T13:01:10.620464+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/launcher.rb:70:in `start_silent_and_wait'
2014-10-24T13:01:10.620479+00:00 app[web.1]: credits.rb:44:in `new'
2014-10-24T13:01:10.620494+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `catch'
2014-10-24T13:01:10.620509+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:898:in `block in call!'
2014-10-24T13:01:10.620532+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call'
2014-10-24T13:01:10.620586+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1788:in `synchronize'
2014-10-24T13:01:10.620483+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call'
2014-10-24T13:01:10.620499+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `each'
2014-10-24T13:01:10.620513+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `invoke'
2014-10-24T13:01:10.620573+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:180:in `call'
2014-10-24T13:01:10.620761+00:00 app[web.1]: 83.245.232.99 - - [24/Oct/2014 13:01:10] "POST /sending_out HTTP/1.1" 500 30 0.3206
2014-10-24T13:01:10.620466+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/socket_lock.rb:20:in `locked'
2014-10-24T13:01:10.620481+00:00 app[web.1]: credits.rb:36:in `block in <main>'
2014-10-24T13:01:10.620497+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:964:in `block in route!'
2014-10-24T13:01:10.620511+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `catch'
2014-10-24T13:01:10.620535+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:210:in `call'
2014-10-24T13:01:10.620592+00:00 app[web.1]: /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run'
2014-10-24T13:01:10.620471+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/common/driver.rb:31:in `new'
2014-10-24T13:01:10.620486+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]'
2014-10-24T13:01:10.620502+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1076:in `block in dispatch!'
2014-10-24T13:01:10.620514+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:898:in `call!'
2014-10-24T13:01:10.620537+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'
2014-10-24T13:01:10.620593+00:00 app[web.1]: /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'
2014-10-24T13:01:10.620453+00:00 app[web.1]: Selenium::WebDriver::Error::WebDriverError - Could not find Firefox binary (os=linux). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path=:
2014-10-24T13:01:10.620472+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/common/driver.rb:31:in `for'
2014-10-24T13:01:10.620487+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (3 levels) in route!'
2014-10-24T13:01:10.620503+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `block in invoke'
2014-10-24T13:01:10.620515+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:886:in `call'
2014-10-24T13:01:10.620555+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:in `call'
2014-10-24T13:01:10.621098+00:00 app[web.1]: http://sleepy-dawn-1804.herokuapp.com/ -> /sending_out
2014-10-24T13:01:10.625080+00:00 heroku[router]: at=info method=POST path="/sending_out" host=sleepy-dawn-1804.herokuapp.com request_id=ab9957cb-f2af-416c-9055-8fe4d4ccae69 fwd="83.245.232.99" dyno=web.1 connect=1ms service=327ms status=500 bytes=326
2014-10-24T13:19:46+00:00 heroku[slug-compiler]: Slug compilation started
2014-10-24T13:19:56+00:00 heroku[slug-compiler]: Slug compilation finished
2014-10-24T13:19:56.715255+00:00 heroku[api]: Deploy a3750e4 by ___
2014-10-24T13:19:56.715329+00:00 heroku[api]: Release v13 created by ___
2014-10-24T13:19:56.987774+00:00 heroku[web.1]: State changed from up to starting
2014-10-24T13:19:59.188226+00:00 app[web.1]: == Sinatra has ended his set (crowd applauds)
2014-10-24T13:19:59.372012+00:00 heroku[web.1]: Starting process with command `bundle exec ruby credits.rb -p 38378`
2014-10-24T13:19:59.936031+00:00 app[web.1]: bash: bundle: command not found
2014-10-24T13:19:58.792208+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2014-10-24T13:20:00.744914+00:00 heroku[web.1]: State changed from crashed to starting
2014-10-24T13:20:00.744331+00:00 heroku[web.1]: State changed from starting to crashed
2014-10-24T13:20:00.731432+00:00 heroku[web.1]: Process exited with status 127
2014-10-24T13:20:00.979441+00:00 app[web.1]: [2014-10-24 13:20:00] INFO WEBrick::HTTPServer#start done.
2014-10-24T13:20:00.979326+00:00 app[web.1]: [2014-10-24 13:20:00] INFO going to shutdown ...
2014-10-24T13:20:01.793815+00:00 heroku[web.1]: Process exited with status 0
2014-10-24T13:20:02.890977+00:00 heroku[web.1]: Starting process with command `bundle exec ruby credits.rb -p 8176`
2014-10-24T13:20:03.432512+00:00 app[web.1]: bash: bundle: command not found
2014-10-24T13:20:04.173800+00:00 heroku[web.1]: State changed from starting to crashed
2014-10-24T13:20:04.164173+00:00 heroku[web.1]: Process exited with status 127
2014-10-24T13:20:04.812284+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=sleepy-dawn-1804.herokuapp.com request_id=f0b2bb74-8eaa-4a4c-801f-97ab9d442f04 fwd="54.166.216.157" dyno= connect= service= status=503 bytes=
2014-10-24T13:20:06.224767+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/sending_out" host=sleepy-dawn-1804.herokuapp.com request_id=eb306448-91ee-40ea-89ec-7756e277e986 fwd="83.245.232.99" dyno= connect= service= status=503 bytes=


And also when I push it to Heroku it thinks it's a phantomjs app:

PhantomJS app detected


What could be done about all that? Is this at all possible to run Watir from Heroku?

EDIT: answer from Heroku support:


Watir requires selenium, which requires an X server install on the machine.
Because our dynos aren't meant to launch graphic applications, they don't have any X server installed, and therefore can't install Selenium.
Therefore, I'm afraid it's not going to be possible to use Watir in your application.

Answer

Yes, it is possible! Just follow steps from this article: https://github.com/edelpero/watir-examples/blob/master/watir_on_heroku.md.

Shortly:

$ heroku config:set BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
$ touch .buildpacks

Then add to your newly created directory .buildpacks these lines:

https://github.com/heroku/heroku-buildpack-ruby
https://github.com/stomita/heroku-buildpack-phantomjs

Then in terminal:

$ heroku config:set PATH="/usr/local/bin:/usr/bin:/bin:/app/vendor/phantomjs/bin"
$ heroku config:set LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/lib:/app/vendor/phantomjs/lib

Then push these changes to Heroku, and

Watir::Browser.new :phantomjs

with usual Watir code following should work!