Creating and using page objects

cheezy edited this page Mar 31, 2013 · 10 revisions

Alister Scott blogged about an idea for creating a factory to create instances of page objects. In the past I have blogged about page objects returning page objects. After a lot of contemplation, I am completely in the Alister camp. page-object now supports this approach as well.

PageFactory

A module named PageFactory provides this ability. This module has two methods.

  def visit(page_class, params={:using_params => {}}, &block)
  def on(page_class, params={:using_params => {}}, visit=false, &block)

Let's take a look at how you would use these method in your cucumber scripts.

    Given /^I am on the registration page$/ do
      visit RegistrationPage
    end

This call will cause the browser to open the page specified by the call to page_url in the class.

class RegistrationPage
  include PageObject

  page_url "http://mysite.com/registration"
  ...
end

If you wish to perform some activity on that page when you navigate to it you can pass a block to the method.

    When /^I register on the registration page$/ do
      visit RegistrationPage do |page|
        page.register_user
        page.do_something_else
      end
    end

If you are already on a page and wish to interact with it you can use the on_page method.

    Then /^I should be able to cancel my order$/ do
      on CheckoutPage do |page|
        page.cancel_order
        page.do_something_else
      end
    end

Both methods also support a shortened version to do only one item on the page.

    Then /^I should be able to cancel my order$/ do
      on(CheckoutPage).cancel_order
    end

If you wish to interact with the current page conditionally, you can use the 'if_page' method.

    Then /^I should be able to view my cart$/ do
      @current_page.check_nav_cart_exists
      if_page CheckoutPage do |page|
        #enters iff @current_page is of Page CheckoutPage
        page.check_product_list_exists
        page.do_something_else
      end
    end

Note: You need some plumbing in your env.rb file under hooks to make these methods available to use

require 'page-object/page_factory'
World(PageObject::PageFactory)

You will also need to make available an '@browser' variable for the driver you wish to use.

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.