lib/page-object/page_factory.rb in page-object-0.5.5 vs lib/page-object/page_factory.rb in page-object-0.6
- old
+ new
@@ -16,10 +16,21 @@
# @example using a page that has already been visited in a Scenario
# on_page MyPageObject do |page|
# page.name.should == 'Cheezy'
# 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
+ # PageObject::PageFactory.routes = {
+ # :default => [[PageOne,:method1], [PageTwoA,:method2], [PageThree,:method3]],
+ # :another_route => [[PageOne,:method1], [PageTwoB,:method2b], [PageThree,:method3]]
+ # }
+ #
module PageFactory
#
# Create and navigate to a page object. The navigation will only work if the
# 'page_url' method was call on the page object.
@@ -44,7 +55,84 @@
@current_page = page_class.new(@browser, visit)
block.call @current_page if block
@current_page
end
+ #
+ # Navigate to a specific page following a predefined path.
+ #
+ # This method requires a lot of setup. See the documentation for
+ # this class. Once the setup is complete you can navigate to a
+ # page traversing through all other pages along the way. It will
+ # call the method you specified in the routes for each
+ # page as it navigates. Using the example setup defined in the
+ # documentation above you can call the method two ways:
+ #
+ # @example
+ # page.navigate_to(PageThree) # will use the default path
+ # page.navigate_to(PageThree, :using => :another_route)
+ #
+ # @param [PageObject] a class that has included the PageObject
+ # module and which has the navigation_method defined
+ # @param [Hash] a hash that contains an element with the key
+ # :using. This will be used to lookup the route. It has a
+ # default value of :default.
+ # @param [block] an optional block to be called
+ # @return [PageObject] the page you are navigating to
+ #
+ def navigate_to(page_cls, how = {:using => :default}, &block)
+ path = path_for how
+ to_index = find_index_for(path, page_cls)-1
+ navigate_through_pages(path[0..to_index])
+ on_page(page_cls, &block)
+ end
+
+ #
+ # Same as navigate_to except it will start at the @current_page
+ # instead the beginning of the path.
+ #
+ # @param [PageObject] a class that has included the PageObject
+ # module and which has the navigation_method defined
+ # @param [Hash] a hash that contains an element with the key
+ # :using. This will be used to lookup the route. It has a
+ # default value of :default.
+ # @param [block] an optional block to be called
+ # @return [PageObject] the page you are navigating to
+ #
+ def continue_navigation_to(page_cls, how = {:using => :default}, &block)
+ path = path_for how
+ from_index = find_index_for(path, @current_page.class)+1
+ to_index = find_index_for(path, page_cls)-1
+ navigate_through_pages(path[from_index..to_index])
+ on_page(page_cls, &block)
+ end
+
+ private
+
+ def path_for(how)
+ path = PageObject::PageFactory.page_object_routes[how[:using]]
+ fail("PageFactory route :#{how[:using].to_s} not found") unless path
+ path
+ end
+
+ def navigate_through_pages(pages)
+ pages.each do |cls, method|
+ page = on_page(cls)
+ fail("Navigation method not specified on #{cls}. Please call the ") unless page.respond_to? method
+ page.send method
+ end
+ end
+
+ def find_index_for(path, item)
+ path.each_with_index { |each, index| return index if each[0] == item}
+ end
+
+ class << self
+ attr_accessor :page_object_routes
+
+ def routes=(routes)
+ raise("You must provide a :default route for PageFactory routes") unless routes[:default]
+ @page_object_routes = routes
+ end
+ end
end
-end
\ No newline at end of file
+end