In a Rails RSpec that uses Capybara, we were visiting a page, clicking some stuff, making assertions and the click “complete” at the very end.
In the spec right before clicking “complete”, we were supposed to go to a different path and check that some UI had changed contextually, as different users would be accessing those different views and get real-time results.
The great solution that Justin recommended was to use a separate Capybara session to go check in the other view was we were expecting was happening. It was super neat and this is how it worked:
describe "my cool feature" do it "checks the result on both pages" do # first we set up the Session: # We can specify the driver or more agnostically if we want to # be sure we are using the same driver that both our system and # the CI/CD is using for example, we can refer to the current_driver. # This could be :chrome, :selenium, etc.: driver = Capybara.current_driver # This an instance of our application that we are running in the # test suite, that we arbitrarily name rack_application: rack_application = Capybara.app # Instantiate the new session passing the driver and the app: new_awesome_session = Capybara::Session.new(driver, rack_application) visit main_page_path # Here we start the session for the other page and call the `.visit` # method from Capybara session and have it open in another window: new_awesome_session.visit(the_other_page_path) # We start clicking around in the first page we are looking at, # `main_page_path`: within "#some-part-of-this-page" do click_on blue_button click_on green_button expect(page).to have content("almost done") end # Then we call the `.using_session`(*) method and its block to # check the other page: using_session(new_awesome_session) do within "#some-part-of-that-page" do expect(page).to have_content("I know someone clicked the blue and green buttons elsewhere") end end # Finally we want to complete our first chore and click the button: within "#some-part-of-this-page" do click_on complete_button expect(page).to have_content("task complete") end end end
Documentation Capybara Session