Read more

How to make a cucumber test work with multiple browser sessions

Tobias Kraze
February 21, 2020Software engineer at makandra GmbH

Imagine you want to write a cucumber test for a user-to-user chat. To do this, you need the test to work with several browser sessions, logged in as separate users, at the same time.

Illustration web development

Do you need DevOps-experts?

Your development team has a full backlog? No time for infrastructure architecture? Our DevOps team is ready to support you!

  • We build reliable cloud solutions with Infrastructure as code
  • We are experts in security, Linux and databases
  • We support your dev team to perform
Read more Show archive.org snapshot

Luckily, Capybara makes this relatively easy:

Scenario:

Scenario: Alice and Bob can chat
  Given Alice, Bob, and a chat session
  When I am signed in as "Alice"
    And I go to the chat
    And I am signed in as "Bob" [session: bob]
    And I go to the chat [session: bob]
    And I send the message "Hello, this is Alice!"
  Then I should see "Hello, this is Alice!" within the chat
    And I should see "Hello, this is Alice!" within the chat [session: bob]

Capybara has a method Capybara.using_session allowing you to perform steps in different browser sessions, so all you need is the following:

When(/^(.*) \[session: (.*?)\]$/) do |step_text, session_name|
  Capybara.using_session(session_name) do
    step(step_text)
  end
end

Effect on other step definitions

Be careful that this also affects other steps. For example, we often use something like this for authentication:

module AuthenticationSteps
  def sign_in(user)
    sign_out if @current_user # BROKEN!
    login_as user
    @current_user = user
  end

  # ...
end
World(AuthenticationSteps)

This will not work, since now there is no longer one logged in user, but potentially several.

Work around this with something like:

module AuthenticationSteps
  def reset_signed_in_users
    @current_users = {}
  end

  def sign_in(user)
    sign_out if @current_users[Capybara.current_session]
    login_as user
    @current_users[Capybara.current_session] = user
  end

  # ...
end
World(AuthenticationSteps)

Before do
  reset_signed_in_users
end
Tobias Kraze
February 21, 2020Software engineer at makandra GmbH
Posted by Tobias Kraze to makandra dev (2020-02-21 10:58)