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.