module Druid::PageFactory

Module to facilitate to creating of page objects in step definitions. You can make the methods below available to all of your step definitions by adding this module to World. This idea was first discussed in Alister Scott's blog entry watirmelon.com/2011/06/07/removing-local-page-references-from-cucumber-steps/.

@example Making the PageFactory available to your step definitions

World Druid::PageFactory

@example Visiting a page for the first time in a Scenario

visit_page MyPageObject do |page|
  page.name = 'Tim'
end

@example using a page that has already been visited in a Scenario

on_page MyPageObject do |page|
  page.name.should == 'Tim'
end

If you plan to use the navigate_to method you will need to ensure you setup the possible routes ahead of time. You must always have a default route in order for this to work. Here is an example of how you define routes:

@example Example routes defined in env.rb

Druid::PageFactory.routes = {
  :default => [[PageOne,:method1], [PageTwoA,:method2], [PageThree,:method3],
  :another_route => [[PageOne,:method1,"arg1"], [PageTwoB,:method2b], [PageThree,:method3]]
 }

Notice the first entry of :another_route is passing an argument to the method You must also call the navigation_method on each page.

Public Instance Methods

if(page_class, params={:using_params => {}}, &block)

support 'if' for readability of usage

Alias for: if_page
if_page(page_class, params={:using_params => {}}, &block) click to toggle source

Create a page object if and only if the current page is the same page to be created

@example

original:
 on_page(NewProduct).save if @current_page.class == NewProduct
 on_page(EditProduct).save if @current_page.class == EditProduct
new:
 if_page NewProduct do |page|
    page.save
 end
 if_page EditProduct do |page|
    page.update
 end

@param [PageObject, String] a class that has included the Druid module or a string containing the name of the class @param Hash values that is pass through to page class a available in the @params instance variable @param [block] an optional block to be called @return [PageObject] the newly created page object

# File lib/druid/page_factory.rb, line 97
def if_page(page_class, params={:using_params => {}}, &block)
  page_class = class_from_string(page_class) if page_class.is_a? String
  return @current_page unless @current_page.class == page_class
  on_page(page_class, params, false, &block)
end
Also aliased as: if
on(page_class, params={:using_params => {}}, visit=false, &block)

Support 'on' for readability of usage

Alias for: on_page
on_page(page_class, params={:using_params => {}}, visit=false, &block) click to toggle source

Create a page object.

@param [PageObject, String] a class that has included the Druid module or a string containing the name of the class @param Hash values that is pass through to page class a available in the @params instance variable. @param [Bool] should the page be visited? default is false. @param an optional block to be called @return [PageObject] the newly created page object

Calls superclass method
# File lib/druid/page_factory.rb, line 65
def on_page(page_class, params={:using_params => {}}, visit=false, &block)
  page_class = class_from_string(page_class) if page_class.is_a? String
  return super(page_class, params, visit, &block) unless page_class.ancestors.include? Druid
  merged = page_class.params.merge(params[:using_params])
  page_class.instance_variable_set("@merged_params", merged) unless merged.empty?
  @current_page = page_class.new(@driver, visit)
  block.call @current_page if block
  @current_page
end
Also aliased as: on
visit(page_class, params={:using_params => {}}, &block)

Support 'visit' for readability of usage

Alias for: visit_page
visit_page(page_class, params={:using_params => {}}, &block) click to toggle source

attr_accessor :page

Create and navigate to a page object. The navigation will only work if the 'page_url' method was call on the page object.

@param [PageObject, String] a class that has included the Druid module or a string containing the name of the class @param Hash values that is pass through to page class a available in the @params instance variable @param an optional block to be called @return [PageObject] the newly created page object

# File lib/druid/page_factory.rb, line 49
def visit_page(page_class, params={:using_params => {}}, &block)
  on_page page_class, params, true, &block
end
Also aliased as: visit

Private Instance Methods

class_from_string(str) click to toggle source
# File lib/druid/page_factory.rb, line 108
def class_from_string(str)
  str.split('::').inject(Object) do |mod, class_name|
    mod.const_get(class_name)
  end
end