Using Selenium to generate screenshots for support documents
I’ve just been working on some support documentation for 88 Miles, and I wanted to include some screenshots. Since I’m lazy, and hate having to repeat tasks, I decided to use Selenium and Capybara to generate all the screenshots for me. Using robots means I can re-generate all my screenshots quickly, so I’m more likely to do it if I change the UI. I covered using PhantomJS for generating screenshots before, but I’m using Selenium for this to make sure a real browser is used, just in case there are any rendering differences (which there usually is).
Again, this guide is for OSX. I’m also using Chrome, rather than the default Firefox as the webdriver.
First, install the selenium server
brew install selenium-server-standalone
and start the server up
java -jar /usr/local/opt/selenium-server-standalone/selenium-server-standalone-2.35.0.jar -p 4444
Next, download the chrome webdriver from google code, unzip it and copy the chromedriver executable to /usr/local/bin
Add the selenium-webdriver gem to your Gemfile in the test section
group :test do
gem "selenium-webdriver"
end
Edit your test/test_helper.rb and create a new driver for chrome (put this after you require capybara)
require 'capybara/rails'
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome)
end
Finally, create a new test that will generate the screenshots. I created a directory for the tests, and a directory for the screen shots to be saved to
mkdir test/support
mkdir app/assets/images/support
Now you can create a integration test file, and watch as a browser opens an starts replaying all the actions!
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
module Support
class ReportsControllertest < ActionDispatch::IntegrationTest
self.use_transactional_fixtures = false
setup do
Capybara.default_driver = :chrome
Capybara.javascript_driver = :chrome
end
teardown do
Capybara.use_default_driver
end
test 'generate screenshots' do
visit '/login'
save_screenshot(Rails.root.join('app', 'assets', 'images', 'support', 'login.png'))
end
end
end
To run just this test (it’s slow, so you probably don’t want to automatically run it using guard):
bundle exec ruby -I"lib:test" test/support/reports_controller_test.rb
You can see (a beta) example on the 88 Miles beta website.