Understanding the Context

By default, test helpers wrap the current session, aliased in Capybara as page.

They also have access to the test context.

When finders and certain actions return an element, it will be wrapped in a new test helper.

scenario 'edit user', test_helpers: [:users] do
  user = users.find(:table_row, { 'Name' => 'Kim' })
  user.click_to_edit # a method defined in UsersTestHelper

In this example, the context for users is the entire page, because it was injected in the test.

On the other hand, the context for user is the table row returned by find, which we say it's the current element for that helper.

Current Element

Certain methods can only be performed on node elements, such as click, hover or set.

When a test helper is not wrapping an element, an element will be obtained by using an :el alias defined in the test helper.

class CheckboxTestHelper < BaseTestHelper
    el: 'input[type=checkbox]',

# same as
# same as

:el should always be the top-level element that the test helper is encapsulating, which could be a small component, or an entire page.

This convention makes it less cumbersome to extract and use test helpers for simple components.

class DropdownTestHelper < BaseTestHelper
    el: '.dropdown',
    toggle: '.dropdown-toggle',

  def toggle_menu
    within { toggle.click }

# same as
within('.dropdown') { find('.dropdown-toggle').click }