As many say, a good solution to selenese flu is Webdriver (see more at http://code.google.com/p/selenium).
Webdriver has been accepted by the Selenium guys as the new approach to web application testing, opposed to the classical “selenium 1.0” approach, based on a javascript driver, which suffers from way too many issues.
Unfortunately, Selenium 2.0, which plan to fully support Webdriver, is still on an alpha release, and actually is very difficult to find ruby-based web testing tools supporting this alpha version of selenium 2.0.
One of those tools is actually Watir (though Webrat too is planning to support Selenium 2.0 sooner or later), and more precisely this project is quite stable to allow a first test drive.
So this is what I did:
First: installed required gems
Second: configure my Rails testing configuration to use watir
Third: write a test
Some comments here:
sudo gem install selenium-webdriver sudo gem install watir-webdriver --pre
config/environments/test.rb
... config.gem "watir-webdriver" ...
test/test_helper.rb
require 'test_help' ... require 'watir-webdriver' ...
test/integration/paypal_integration_test.rb
require 'test_helper'
class PaypalIntegrationTest < ActionController::IntegrationTest
include LocaleHelper
self.use_transactional_fixtures = false
def setup
... some setup stuff here ...
@browser = Watir::Browser.new(:firefox)
end
def teardown
@browser.close
end
test "something interesting" do
@browser.goto "https://developer.paypal.com/"
@browser.text_field(:name, "login_email").set "my_test_account@sourcesense.com"
@browser.text_field(:name, "login_password").set "mysecret"
@browser.button(:name, "submit").click
@browser.goto "https://localhost"
@browser.link(:id, 'loginlink').click
@browser.text_field(:name, "email").set @user.email
@browser.text_field(:name, "password").set @user.password
@browser.button(:text, "Login").click
# add_a_product_to_cart
product = Factory(:product, :code => "a code", :categories => [@juve_store])
Factory(:product_variant, :code => "03", :availability => 99, :product => product)
@browser.goto "https://localhost/frontend/products/show/#{product.id}"
@browser.button(:id, "add_to_cart").click
@browser.link(:text, "Checkout").click
@browser.link(:id, "gotobuy").click
# choose "Paypal"
@browser.radios.last.set
@browser.link(:id, "gotobuy").click
sleep 5
assert @browser.text.include?("Payment for order #{last_order_number()}")
@browser.text_field(:name, "login_email").set "my_test_buyer@sourcesense.com"
@browser.text_field(:name, "login_password").set "yetanothersecrethere"
@browser.button(:text, "Accedi").click
@browser.button(:text, "Paga ora").click
sleep 5
assert @browser.text.include?("Il pagamento รจ stato inviato")
@browser.button(:id, "merchantReturn").click
assert_contain_waiting("Your purchase")
assert_contain_waiting(last_order_number())
end
private
def last_order_number
Order.last ? Order.last.number : ""
end
end
- This is a spike, so please don’t say this test is too long and not well refactored

- I had to put two sleep calls in two places (I gotta say that this specific test, involving paypal sandbox, is really slow due to the slowness in the paypal response time).
- Anyway, this alpha version of webdriver is still lacking: I cannot say wheather this is a problem I’ll have even with future (possibly more stable) version of Webdriver.