Cucumber With Selenium and Authlogic
I had some Issues with cucumber/selenium working properly with authlogic. After much searching, I’ve figured out how to get it all to work properly.
I would get an error like:
When I follow "Manage pages" # features/step_definitions/webrat_steps.rb:19
ed out after 5000ms (Selenium::CommandError)
/opt/local/lib/ruby/1.8/timeout.rb:62:in `timeout'
/opt/local/lib/ruby/1.8/timeout.rb:93:in `timeout'
(eval):2:in `/^I follow "([^\"]*)"$/'
features/plain/admin_page.feature:8:in `When I follow "Manage pages"'
Initially, to setup authlogic to work with regular webrat tests, I had to put the following in my env.rb:
require "authlogic/test_case"
Before do
activate_authlogic
end
After getting it working with webrat, I decided I wanted to test some of my javascript and AJAX with selenium, so I followed this guide
The database_cleaner gem had to be added because you can’t use
Cucumber::Rails.use_transactional_fixtures
with selenium, so it had to be removed from the env.rb and placed in the plain.rb. As a result, this ended up in my enhanced.rb
require 'database_cleaner'
Before do
# truncate your tables here, since you can't use transactional fixtures*
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
end
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
Originally, I had it just in my enhanced.rb as an After block instead of Before, but after further contemplation, I realized that if something goes terribly wrong with the selenium tests, then the database would have bad data in it… So might as well clean it before hand.
Finally, my problem with authlogic + seleniu, was how I wrote my test. The way it was erroring out made it look like something completely different (the selenium timeout error), but after I watched it a couple times closely, I determined that the test was being sent to the next page before the “button press” was executed.
Here is the beginning of my test that failed:
Scenario: Visit Add Page page
Given I am logged in
And I am on "the admin page"
When I follow "Manage pages"
And I follow "New Page"
With a little help from a post on stack overflow, I got it to work with the following:
def user
@user ||= Factory.create(:user)
end
def login
user
fill_in "Email", :with => @user.email
fill_in "Password", :with => @user.password
click_button "Login"
# This is what was added
if Webrat.configuration.mode == :selenium
selenium.wait_for_page_to_load
end
end
Given /^I am logged out$/ do
@current_user_session.destroy if @current_user_session
end
Given /^I am logged in$/ do
visit path_to("the login page")
login
end
When /^I login$/ do
login
end
Notice I had to add the if selenium line in order to get it to work in webrat.
Something tells me there is a better way to do it… probably overriding the click_button method when selenium is loaded… but I don’t know it well enough quite yet to venture that far, I’ll probably try it soon though.
Edit: oh, its a thing with webrat… but installing the newest version didn’t fix it for me, then I actually read the ticket… I’ll stick with my current solution for now.
Edit2: Actually the issue is in the visit method, if you can believe that. click_button works fine, as it waits for the page to load before clicking, but the visit method is sent so fast, that because of the way my test is set up, we are sent to the next page either before the login button is pressed, or before the request gets a chance to process… I don’t feel like investigating which one it exactly is, because the solution is the same… wait for the next page to load.