lib/watirloo.rb in marekj-watirloo-0.0.3 vs lib/watirloo.rb in marekj-watirloo-0.0.5

- old
+ new

@@ -1,169 +1,16 @@ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) -require 'watirloo/watir_ducktape' -require 'watirloo/reflector' +require 'watirloo/extension/object' +require 'watirloo/extension/watir_ducktape' +require 'watirloo/extension/watir_reflector' +require 'watirloo/browsers' +require 'watirloo/desktop' +require 'watirloo/locker' +require 'watirloo/page' module Watirloo + VERSION = '0.0.5' # Jul2009 - VERSION = '0.0.3' # Jan2009 - - # browser. we return IE or Firefox. Safari? Other Browser? - class BrowserHerd - - @@target = :ie - #targets = [:ie, :firefox] - - class << self - - def target=(indicator) - @@target = indicator - end - - def target - @@target - end - - # provides browser instance to client. - # attaches to the existing browser on the desktop - # By convention the mental model here is that we are working - # with one browser on the desktop. This is how a person would typically work - # We are not doing any fancy - # - def browser - case @@target - when :ie - Watir::IE.attach :url, // #this attach is a crutch - when :firefox - require 'watirloo/firewatir_ducktape' - # this is a cruch for quick work with pages. - # in reality you want to create a browser and pass it as argument to initialize Page class - FireWatir::Firefox.attach #this attach is a crutch - else - raise ::Watir::Exception::WatirException, "Browser target not supported" - end - end - end - end - - # Semantic Page Objects Container - # Page containes interfaces to Objects of Interest on the Web Page - # Each object defined by key, value pair, - # Keys is a friendly name, recognizable name given by the domain object model. - # Some name that is meaningful to the customer. - # The value of the interface definiton is a Watir object address in the dom container. - # The Page class acts as an Adapter between the Business Domain naming of things and Document Object Model naming of elments. - # It strives to adapt Human Readable tests to Machine Executable code - class Page - - ## Page Eigenclass - class << self - - # hash key value pairs, - # each interface definition is a key as symbol pointing to some code to - # exeucte later. - def interfaces - @interfaces ||= {} - end - - # Declares Semantic Interface to the DOM elements on the Page - # face :friendlyname => [watirelement, how, what] - # Each interface or face is an object of interest that we want to access by its interface name - # example: - # class GoogleSearch < Watirloo::Page - # face :query => [:text_field, :name, 'q] - # face :search => [:button, :name, 'btnG'] - # end - # each face is a key declared by a semantic symbol that has human meaning in the context of a usecase - # each value is an array defining access to Watir [:elementType, how, what] - def interface(definition) - if definition.kind_of? Hash - self.interfaces.update definition - else - raise ::Watir::Exception::WatirException, "Wrong arguments for Page Object definition" - end - end - alias face interface - - def inherited(subpage) - #puts "#{subpage} inherited #{interfaces.inspect} from #{self}" - subpage.interfaces.update self.interfaces #supply parent's interfaces to subclasses in eigenclass - end - end - - attr_accessor :b, :interfaces - - def browser - @b - end - - - def create_interfaces - @interfaces = self.class.interfaces.dup # do not pass reference, only values - end - - # by convention the Page just attaches to the first available browser. - # the smart thing to do is to manage browsers existence on the desktop separately - # and supply Page class with the instance of browser you want for your tests. - # &block is the convenience at creation time to do some work. - # example: - # browser = Watir::start("http://mysitetotest") - # page = Page.new(browser) # specify browser instance to work with or - # page = Page.new # just let the page do lazy thing and attach itself to browser. - # part of this page initialization is to provide a convenience while developing tests where - # we may have only one browser open and that's the one browser were we want to talk to. - # this provides simplicity for those who are just starting with Watirloo - def initialize(browser = Watirloo::BrowserHerd.browser , &blk) - @b = browser - create_interfaces - instance_eval(blk) if block_given? # allows the shortcut to do some work at page creation - end - - - # enter values on controls idenfied by keys on the page. - # data map is a hash, key represents the page object, - # value represents its value to be set, either text, array or boolean - def spray(dataMap) - dataMap.each_pair do |facename, value| - get_face(facename).set value #make every element in the dom respond to set to set its value - end - end - - # set values on the page given the interface keys - alias set spray - - # return Watir object given by its semantic face symbol name - def get_face(facename) - if self.respond_to? facename # if there is a defined wrapper method for page element provided - return self.send(facename) - elsif interfaces.member?(facename) # pull element from @interfaces and send to browser - method, *args = self.interfaces[facename] # return definition for face consumable by browser - return browser.send(method, *args) #returns Watir Element class - else - raise ::Watir::Exception::WatirException, 'Unknown Semantic Facename' - end - end - - # add face definition to page - def interface(definitions) - if definitions.kind_of?(Hash) - interfaces.update definitions - else - raise ::Watir::Exception::WatirException, "Wrong arguments for Page Object definition" - end - end - alias face interface - - # Delegate execution to browser if no method or face defined on page class - def method_missing method, *args - if browser.respond_to?(method.to_sym) - return browser.send(method.to_sym, *args) - elsif interfaces.member?(method.to_sym) - return get_face(method.to_sym) - else - raise ::Watir::Exception::WatirException, 'I ran out of ideas in Watirloo' - end - end - end +end -end \ No newline at end of file