lib/page-object/page_factory.rb in page-object-0.8.3 vs lib/page-object/page_factory.rb in page-object-0.8.4

- old
+ new

@@ -1,5 +1,7 @@ +require 'page_navigation' + module PageObject # # 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 @@ -31,11 +33,13 @@ # # Notice the first entry of :anouther_route is passing an argument # to the method. # module PageFactory + include PageNavigation + # # 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 @@ -90,91 +94,14 @@ end # Support 'if' for readability of usage alias_method :if, :if_page - # - # 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 class_from_string(str) str.split('::').inject(Object) do |mod, class_name| mod.const_get(class_name) - end - end - - 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, *args| - page = on_page(cls) - fail("Navigation method not specified on #{cls}.") unless page.respond_to? method - page.send method unless args - page.send method, *args if args - end - end - - def find_index_for(path, item) - path.find_index { |each| 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