Official Ruby client API for Selenium Remote Control (bare bone client driver)
Switch branches/tags
Pull request Compare This branch is 13 commits ahead, 84 commits behind ph7:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Welcome to the official Ruby driver for Selenium Remote Control


Provide a lightweight, simple and idiomatic API to write Selenium tests in Ruby. Focus is also on improving test feedback -- especially on failures -- by providing out-of-the-box state-of-the-art reporting capabilities. With screenshots, HTML snapshopts and log captures, investigating test failures becomes a breeze.

Install It

The easiest way to install the install selenium-client using RubyGems:

sudo gem install selenium-client


  • Backward compatible with the old-fashioned, XSL generated Selenium Ruby API. See the generated driver to get an extensive reference.

  • Idiomatic interface to the Selenium API. See the Idiomatic module for more details.

  • Convenience methods for AJAX. See the Extensions for more details.

  • Flexible wait semantics inline with the trigerring action. e.g.

    • click 'the_button_id', :wait_for => :page
    • click 'the_button_id', :wait_for => :ajax
    • click 'the_button_id', :wait_for => :element, :element => 'new_element_id'
    • click 'the_button_id', :wait_for => :no_element, :element => 'disappearing_element_id'
    • click 'the_button_id', :wait_for => :text, :text => 'New Text'
    • click 'the_button_id', :wait_for => :text, :text => /A Regexp/
    • click 'the_button_id', :wait_for => :text, :element => 'notification_box', :text => 'New Text'
    • click 'the_button_id', :wait_for => :no_text, :text => 'Disappearing Text'
    • click 'the_button_id', :wait_for => :no_text, :text => /A Regexp/
    • click 'the_button_id', :wait_for => :no_text, :element => 'notification_box', :text => 'Disappearing Text'
    • click 'the_button_id', :wait_for => :effects
    • click 'the_button_id', :wait_for => :value, :element => 'a_locator', :value => 'some value'
    • click 'the_button_id', :wait_for => :no_value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to not be 'some value'
    • click 'the_button_id', :wait_for => :condition, :javascript => "some arbitrary javascript expression"

    Check out the click, go_back and wait_for methods of the Idiomatic Module

  • Leveraging latest innovations in Selenium Remote Control (screenshots, log captures, ...)

  • Robust Rake task to start/stop the Selenium Remote Control server. More details in the next section.

  • State-of-the-art reporting for RSpec.

Plain API

Selenium client is just a plain Ruby API, so you can use it wherever you can use Ruby.

To used the new API just require the client driver:

require "rubygems"
require "selenium/client"

For a fully backward compatible API you can start with:

require "rubygems"
gem "selenium-client"
require "selenium"

For instance to write a little Ruby script using selenium-client you could write something like:

#!/usr/bin/env ruby
# Sample Ruby script using the Selenium client API
require "rubygems"
gem "selenium-client", ">=1.2.13"
require "selenium/client"

  @browser = \
      :host => "localhost", 
      :port => 4444, 
      :browser => "*firefox", 
      :url => "", 
      :timeout_in_second => 60

  @browser.start_new_browser_session "/"
	@browser.type "q", "Selenium" "btnG", :wait_for => :page
	puts @browser.text?("")

Writing Tests

Most likely you will be writing functional and acceptance tests using selenium-client. If you are a Test::Unit fan your tests will look like:

#!/usr/bin/env ruby
# Sample Test:Unit based test case using the selenium-client API
require "test/unit"
require "rubygems"
gem "selenium-client", ">=1.2.13"
require "selenium/client"

class ExampleTest < Test::Unit::TestCase
	attr_reader :browser

  def setup
    @browser = \
        :host => "localhost", 
        :port => 4444, 
        :browser => "*firefox", 
        :url => "", 
        :timeout_in_second => 60


  def teardown

  def test_page_search "/"
		assert_equal "Google", browser.title
		browser.type "q", "Selenium seleniumhq" "btnG", :wait_for => :page
		assert_equal "Selenium seleniumhq - Google Search", browser.title
		assert_equal "Selenium seleniumhq", browser.field("q")
		assert browser.text?("")
		assert browser.element?("link=Cached")


If BDD is more your style, here is how you can achieve the same thing using RSpec:

require 'rubygems'
gem "rspec", "=1.1.12"
gem "selenium-client", ">=1.2.13"
require "selenium/client"
require "selenium/rspec/spec_helper"

describe "Google Search" do
	attr_reader :selenium_driver
	alias :page :selenium_driver

  before(:all) do
      @selenium_driver = \
          :host => "localhost", 
          :port => 4444, 
          :browser => "*firefox", 
          :url => "", 
          :timeout_in_second => 60

  before(:each) do

  # The system capture need to happen BEFORE closing the Selenium session 
  append_after(:each) do    

  it "can find Selenium" do "/"
    page.title.should eql("Google")
    page.type "q", "Selenium seleniumhq" "btnG", :wait_for => :page
    page.value("q").should eql("Selenium seleniumhq")
    page.text?("").should be_true
    page.title.should eql("Selenium seleniumhq - Google Search")
    page.text?("").should be_true
		page.element?("link=Cached").should be_true		


Start/Stop a Selenium Remote Control Server

Selenium client comes with some convenient Rake tasks to start/stop a Remote Control server. To leverage all selenium-client capabilities I recommend downloading a recent nightly build of a standalone packaging of Selenium Remote Control (great for kick-ass Safari and Firefox 3 support anyway). You will find the mightly build at

You typically "freeze" the Selenium Remote Control jar in your vendor directory.

require 'selenium/rake/tasks' do |rc|
  rc.port = 4444
  rc.timeout_in_seconds = 60
  rc.background = true
  rc.wait_until_up_and_running = true
  rc.jar_file = "/path/to/where/selenium-rc-standalone-jar-is-installed"
  rc.additional_args << "-singleWindow"
end do |rc| = "localhost"
  rc.port = 4444
  rc.timeout_in_seconds = 60

Check out RemoteControlStartTask and RemoteControlStopTask for more details.

State-of-the-Art RSpec Reporting

Selenium Client comes with out-of-the-box RSpec reporting that include HTML snapshots, O.S. screenshots, in-browser page screenshots (not limited to current viewport), and a capture of the latest remote controls for all failing tests. And all course all this works even if your infrastructure is distributed (In particular in makes wonders with Selenium Grid)

Using selenium-client RSpec reporting is as simple as using SeleniumTestReportFormatter as one of you RSpec formatters. For instance:

require 'spec/rake/spectask'
desc 'Run acceptance tests for web application''test:acceptance:web') do |t|
 t.libs << "test"
 t.pattern = "test/*_spec.rb"
 t.spec_opts << '--color'
 t.spec_opts << "--require 'rubygems,selenium/rspec/reporting/selenium_test_report_formatter'"
 t.spec_opts << "--format=Selenium::RSpec::SeleniumTestReportFormatter:./tmp/acceptance_tests_report.html"
 t.spec_opts << "--format=progress"                
 t.verbose = true

You can then get cool reports like this one

To capture screenshots and logs on failures, also make sure you require the following files in your spec_helper:

require "rubygems"
require "spec"
require "selenium/client"
require "selenium/rspec/spec_helper"

Contribute and Join the Fun!

We welcome new features, add-ons, bug fixes, example, documentation, etc. Make the gem work the way you envision!

Core Team

  • Philippe Hanrigou (ph7): Current Maintainer and main contributor
  • Aslak Hellesoy and Darren Hobbs : Original version of the Selenium Ruby driver


  • Aaron Tinio (aptinio):

    • Patch for more robust Selenium RC shutdown
    • Patch to support locator including single quotes in wait_for_... methods
  • Rick Lee-Morlang (rleemorlang):

    • Patch for incremental calls to wait_for_text
    • Regex support in wait_for_text