The main concern with this solution is that Waitr required native ruby instead of jruby. Not a huge deal, but still an extra annoyance for folks in a java shop. Requiring QA to switch between jruby and watir wasn't ideal. Additionally, taking snapshots of the screen during a failed test was far from trivial.
So instead, I embarked on a quest to use watir-webdriver and Celerity together. The advantage here is that watir-webdriver, through selenium-webdriver, can talk to browsers and runs on jruby. This combination was alluded to on several blog sites that I had found, but I never quite found something that put it all together for me. Eventually, i got it working. Hopefully this will at least get you about 90% of the way there.
The first step would be adding watir-webdriver to your Gemfile:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
source "http://rubygems.org" | |
gem "cucumber", "0.10.0" | |
gem "gherkin", "2.3.3" | |
gem "watir-webdriver", "0.2.0" | |
gem "rake" | |
gem "rspec" | |
platforms :jruby do | |
gem "celerity", "0.8.7" | |
gem "syntax" | |
end |
Following that we create a browser.rb file that determines what sort of browser you are running. I placed this in the support folder in the Cucumber project. One thing to remember about this, is that you could also throw this method into your env.rb.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Just returns the appropriate browser class to instantiate | |
case RUBY_PLATFORM | |
when /java/ | |
if ENV['BROWSER'] =~ /true/ | |
require "watir-webdriver" | |
Browser = Watir::Browser | |
WEBDRIVER = true | |
puts "Running in a Browser" | |
if ENV['CHROMEWATIR'] | |
BROWSER_TYPE = :chrome | |
puts "Using Chrome" | |
elsif ENV['FIREWATIR'] | |
BROWSER_TYPE = :firefox | |
puts "Using Firefox" | |
if ENV['FIREWATIRPATH'] | |
# Custom Firefox Path, handy if you don't install in default locations | |
# or if you want to test with multiple Firefoxes | |
Selenium::WebDriver::Firefox.path = ENV['FIREWATIRPATH'] | |
puts "at #{ENV['FIREWATIRPATH']}" | |
end | |
else # ENV['WATIR'] | |
BROWSER_TYPE = :ie | |
puts "Using IE" | |
end | |
else | |
require 'celerity' | |
Browser = Celerity::Browser | |
Celerity.index_offset = 0 | |
WEBDRIVER = false | |
puts "Running Headless" | |
end | |
else | |
raise "This platform is not supported (#{PLATFORM})" | |
end |
What's going on here? We're using the environment variable BROWSER to determine if we want to run something in a browser. We then use another environment variable to determine which browser to use. We even have an environment variable to determine what Firefox we want to use, which is a nice feature of selenium-webdriver. At the end, Browser contains the class of browser we want to instantiate for tests, and BROWSER_TYPE contains the actual type of browser to instantiate for watir-webdriver.
One other thing to note, when we use Celerity, we're setting the offset for index based searches to 0. Unlike watir-webdriver, Watir uses 1th based arrays. Celerity, being a wrapper of HtmlUnit, had to translate those arrays from 1 to 0 so that HtmlUnit would run properly. By setting this value, we can use 0th based arrays, just like watir-webdriver does in Celerity.
Next we setup our Cucumber Before block in hooks.rb:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Before do | |
case RUBY_PLATFORM | |
when /java/ | |
if WEBDRIVER | |
@browser = Browser.new BROWSER_TYPE | |
else | |
@browser = Browser.new | |
@browser.webclient.setUseInsecureSSL(true) | |
end | |
else | |
raise "This platform is not supported (#{PLATFORM})" | |
end | |
@base_url = RegionBaseURL | |
end | |
After do | |
@browser.close | |
end |
In here, we simply instantiate the object. In my case, we also needed to setup some URLs and turn off SSL for our Celerity testing.
The Rakefile is probably a bit more complex due to our desire to run both headless and browser tests on our CI box, but it is helpful, since it uses the :browser task to setup the BROWSER environment variable.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'rake/clean' | |
require 'cucumber' | |
require 'cucumber/rake/task' | |
task :browser => ['features:setupenv', 'features:isbrowser', 'features:browser'] do | |
end | |
task :headless => ['features:setupenv', 'features:headless'] do | |
end | |
def setup_environment | |
ENV['TEST_SERVER'] ||= 'devl' | |
puts "running on the #{ENV['TEST_SERVER']} environment..." | |
end | |
namespace :features do | |
task :setupenv do | |
setup_environment | |
end | |
task :isbrowser do | |
ENV['BROWSER'] ||= 'true' | |
end | |
Cucumber::Rake::Task.new(:browser, 'Run Cucumber Features using a Browser') do |t| | |
t.profile = ENV['CI'] ? 'browser_ci' : 'browser' | |
end | |
Cucumber::Rake::Task.new(:headless, 'Run Cucumber Features using a Headless Browser') do |t| | |
t.profile = ENV['CI'] ? 'ci' : 'default' | |
end | |
end | |
task :default => :headless |
Finally, to help our QA folks, three batch files to execute the tests.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
set TEST_SERVER= | |
set FIREWATIR= | |
set CHROMEWATIR= | |
set WATIR= | |
if "" == "%1%" goto NO_SERVER | |
set TEST_SERVER=%1 | |
shift | |
echo testing on %TEST_SERVER% environment | |
:NO_SERVER | |
echo jruby -S rake --trace headless | |
jruby -S rake --trace headless |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
set TEST_SERVER= | |
set FIREWATIR= | |
set CHROMEWATIR= | |
set WATIR=true | |
if "" == "%1%" goto NO_SERVER | |
set TEST_SERVER=%1 | |
shift | |
echo testing on %TEST_SERVER% environment | |
:NO_SERVER | |
echo jruby -S rake --trace browser | |
jruby -S rake --trace browser |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
set TEST_SERVER= | |
set FIREWATIR=true | |
set CHROMEWATIR= | |
set WATIR= | |
@REM set FIREWATIRPATH=C:\path\to\your\other\version\of\firefox.exe | |
if "" == "%1%" goto NO_SERVER | |
set TEST_SERVER=%1 | |
shift | |
echo testing on %TEST_SERVER% environment | |
:NO_SERVER | |
echo jruby -S rake --trace browser | |
jruby -S rake --trace browser |
Hopefully you'll find this useful. Please let me know if you do.
No comments:
Post a Comment