We had a case where we wanted to create smoke tests to ensure each customer’s subdomain was working (used pre- and post-deployment). Unfortunately, not all of the customer’s login pages were consistent in how to “submit” the login form 🙁
The Cucumber tests looked something like this:
Scenario Outline: Check that the navigation is correctly customized per org
Given I login as "<user>" of "<org>"
And I am on the "<page>" page
Then I should see only the expected "<menu_items>" in top nav bar
Examples:
| user | org | page | menu_items |
| acme-admin | acme | Home | Home, Preferences, Feedback, Help, Logout |
| wyle-admin | wyle.com | Home | Home, Preferences, Links, Help, BI Tool, Logout |
Here is how I used Capybara’s find() method to get around this issue:
# A bit of a hack, org_name is normally a subdomain, but sometimes it is the complete domain
def login(user, org_name)
# Use the below to automatically hit each user's org's server
if org_name.include? '.com'
Capybara.app_host = "http://#{org_name}"
else
Capybara.app_host = "http://#{org_name}.mydomain.com"
end
visit '/'
fill_in 'username', :with => user
fill_in 'userpwd', :with => '***'
begin
click_on 'submit'
rescue Capybara::ElementNotFound
page.find(:link_or_button, 'Log In')
click_on 'Log In'
rescue Capybara::ElementNotFound
pending "Need to determine how to invoke the Login button for #{org_name} near Line ##{__LINE__} of #{__method__} in #{__FILE__} "
end
# Ensure that login was successful
page.should_not have_content 'Login failed'
end
Since our analysts write a bunch of these tests, I also added in a helpful error message should a new org get added that has yet another style of login.
