The Page Object design pattern divides browser tests into three areas: the controller, where the test is created (this is a description of the test): the steps of the test, which are actions taken by the test (the steps are verbs, actions, navigation from one place to another and checking on status; and the page definitions, which are the nouns against which the steps/actions/verbs are working.
In our implementation of the Page Object pattern:
* the Cucumber feature files are the story of the tests
* the steps.rb files are the verbs and actions
* the page.rb files are the nouns and the pages
If you know anything about Design Patterns, you may know that they are discovered, not invented. Among people who do browser testing, the Page Object design pattern is generally accepted to be the best known solution for creating browser tests that are robust, readable, maintainable, and that will scale to large numbers of tests.
In practice, that boils down to some rules that we need to follow, and one of those rules is: *no element identifiers in steps files*. Page elements like div and span that have identifiers of e.g. class: and css: need to be managed in the page.rb files and *only* in the page.rb files.
Do not put page element identifiers into the steps of the test. This makes the tests difficult to read, difficult to scale, and very difficult to maintain.
Adhere to the Page Object design pattern: keep your page element identifiers in the /support/pages/*page.rb files ONLY, and NOT in the /step_definitions/*steps.rb files.