site_prism 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -25,4 +25,5 @@ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25
25
  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26
26
  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27
27
  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
data/lib/site_prism.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  module SitePrism
2
-
2
+
3
3
  end
4
4
 
5
5
  require 'site_prism/exceptions'
6
6
  require 'site_prism/element_container'
7
+ require 'site_prism/element_checker'
7
8
  require 'site_prism/page'
8
- require 'site_prism/section'
9
+ require 'site_prism/section'
10
+
@@ -0,0 +1,6 @@
1
+ module SitePrism::ElementChecker
2
+ def all_there?
3
+ !self.class.element_names.map {|element| self.send "has_#{element}?" }.include? false
4
+ end
5
+ end
6
+
@@ -1,7 +1,7 @@
1
1
  # Contains methods applicable to both {SitePrism::Page}s and {SitePrism::Section}s. Note that they are mixed into the {SitePrism::Page}
2
2
  # and {SitePrism::Section} classes so the methods below are used as class methods.
3
3
  module SitePrism::ElementContainer
4
-
4
+
5
5
  # Creates two methods; the first method has the same name as the element_name parameter and returns the capybara element
6
6
  # located by the element_locator parameter when the method is called. The second method generated has a name with a format
7
7
  # of: 'has_#\{element_name}?' which returns true if the element as located by the element_locator parameter exists, false
@@ -13,22 +13,23 @@ module SitePrism::ElementContainer
13
13
  # element :search_link, 'div.search > a'
14
14
  # end
15
15
  # home = HomePage.new
16
- #
16
+ #
17
17
  # #the element method created 2 methods...
18
18
  # home.search_link #=> returns the capybara element located by the element_locator parameter
19
19
  # home.has_search_link? #=> returns true if the capybara element as located by the element_locator exists, false if it doesn't
20
- #
20
+ #
21
21
  # #The has_search_link? method allows use of magic matchers in rspec/cucumber:
22
22
  # home.should have_search_link
23
23
  # home.should_not have_search_link
24
24
  def element element_name, element_locator
25
+ add_element_name element_name
25
26
  create_existence_checker element_name, element_locator
26
27
  create_waiter element_name, element_locator
27
28
  define_method element_name.to_s do
28
29
  find_one element_locator
29
30
  end
30
31
  end
31
-
32
+
32
33
  # Works in the same way as {SitePrism::Page.element} in that it will generate two methods; one to check existence of
33
34
  # the element (in the format 'has_#\{element_name}?'), and another to return not a single element, but an array of elements
34
35
  # found by the css locator
@@ -39,11 +40,12 @@ module SitePrism::ElementContainer
39
40
  # elements :app_links, '.title-links > a'
40
41
  # end
41
42
  # home = HomePage.new
42
- #
43
+ #
43
44
  # home.should have_app_links
44
45
  # home.app_links #=> [#<Capybara::Element tag="a">, #<Capybara::Element tag="a">, #<Capybara::Element tag="a">]
45
46
  # home.app_links.map {|link| link.text}.should == ['Finance', 'Maps', 'Blogs']
46
47
  def elements collection_name, collection_locator
48
+ add_element_name collection_name
47
49
  create_existence_checker collection_name, collection_locator
48
50
  create_waiter collection_name, collection_locator
49
51
  define_method collection_name.to_s do
@@ -61,32 +63,34 @@ module SitePrism::ElementContainer
61
63
  # element :search_field, '.q'
62
64
  # element :search_button, '.btnK'
63
65
  # end
64
- #
66
+ #
65
67
  # ...then that section could be added to any page as follows:
66
- #
68
+ #
67
69
  # class SearchPage < SitePrism::Page
68
70
  # section :search_area, SearchArea, '.tsf-p'
69
71
  # end
70
- #
72
+ #
71
73
  # class SearchResultsPage < SitePrism::Page
72
74
  # section :search_again, SearchArea, '.tsf-p table'
73
75
  # end
74
- #
76
+ #
75
77
  # The SearchArea section appears on both pages, but can be invoked by methods specific to the page (eg: 'search_area' and 'search_again')
76
78
  # and the root element for the section can be different on the page (eg: '.tsf-p' and '.tsf-p table').
77
79
  # @param [Symbol] the method name to be called against this page or section to return an instance of the {SitePrism::Section} class
78
80
  # @param [Class] the class that models this area of the page
79
81
  # @param [String] the CSS locator for the root element of the section on this page/section
80
82
  def section section_name, section_class, section_locator
83
+ add_element_name section_name
81
84
  create_existence_checker section_name, section_locator
82
85
  create_waiter section_name, section_locator
83
86
  define_method section_name do
84
87
  section_class.new find_one section_locator
85
88
  end
86
89
  end
87
-
90
+
88
91
  # Works in the same way as {SitePrism::Page.section} but instead of it returning one section, it returns an array of them.
89
92
  def sections section_collection_name, section_class, section_collection_locator
93
+ add_element_name section_collection_name
90
94
  create_existence_checker section_collection_name, section_collection_locator
91
95
  create_waiter section_collection_name, section_collection_locator
92
96
  define_method section_collection_name do
@@ -95,9 +99,9 @@ module SitePrism::ElementContainer
95
99
  end
96
100
  end
97
101
  end
98
-
102
+
99
103
  private
100
-
104
+
101
105
  # Creates a method used to check for the existence of the element whose details are passed to it
102
106
  # @param
103
107
  def create_existence_checker element_name, element_locator
@@ -105,11 +109,12 @@ module SitePrism::ElementContainer
105
109
  element_exists? element_locator
106
110
  end
107
111
  end
108
-
112
+
109
113
  # Creates a method used to wait for an element to appear - uses the default capybara wait time
110
114
  def create_waiter element_name, element_locator
111
115
  define_method "wait_for_#{element_name.to_s}" do
112
116
  element_waiter element_locator
113
117
  end
114
118
  end
115
- end
119
+ end
120
+
@@ -4,4 +4,5 @@ module SitePrism
4
4
  class NoUrlForPage < StandardError; end
5
5
  # Raised if you check to see if a page is displayed but it hasn't had its url matcher set
6
6
  class NoUrlMatcherForPage < StandardError; end
7
- end
7
+ end
8
+
@@ -2,7 +2,7 @@ module SitePrism
2
2
  # Subclasses of {SitePrism::Page} represent pages in your app.
3
3
  # class Home < SitePrism::Page
4
4
  # end
5
- #
5
+ #
6
6
  # The above is an example of how to make a class representing the home page. There are a number of properties that can be
7
7
  # set on a page - here is an example of a more fully spec'ed out page:
8
8
  # class Home < SitePrism::Page
@@ -11,15 +11,16 @@ module SitePrism
11
11
  # end
12
12
  class Page
13
13
  include Capybara::DSL
14
+ include ElementChecker
14
15
  extend ElementContainer
15
-
16
+
16
17
  # Visits the url associated with this page
17
18
  # @raise [SitePrism::NoUrlForPage] To load a page the url must be set using {.set_url}
18
19
  def load
19
20
  raise SitePrism::NoUrlForPage if url.nil?
20
21
  visit url
21
22
  end
22
-
23
+
23
24
  # Checks to see if we're on this page or not
24
25
  # @return true if the browser's current url matches the {.url_matcher} that has been set, false if it doesn't
25
26
  # @raise [SitePrism::NoUrlMatcherForPage] To check whether we're on this page or not the url matcher must be set using {.set_url_matcher}
@@ -35,7 +36,7 @@ module SitePrism
35
36
  raise SitePrism::NoUrlMatcherForPage if url_matcher.nil?
36
37
  !(page.current_url =~ url_matcher).nil?
37
38
  end
38
-
39
+
39
40
  # Set the url associated with this page
40
41
  # @param [String] page_url the portion of the url that identifies this page when appended onto Capybara's app_host. Calling {SitePrism::Page#load} causes Capybara to visit this page.
41
42
  # @example
@@ -45,7 +46,7 @@ module SitePrism
45
46
  def self.set_url page_url
46
47
  @url = page_url
47
48
  end
48
-
49
+
49
50
  # Set the url matcher associated with this page
50
51
  # @param [Regexp] page_url_matcher a regular expression that when compared to the current browser url will match if we're on this page or not match if we're not on this page
51
52
  # @example
@@ -55,60 +56,70 @@ module SitePrism
55
56
  def self.set_url_matcher page_url_matcher
56
57
  @url_matcher = page_url_matcher
57
58
  end
58
-
59
+
59
60
  # Get the url associated with this page
60
61
  # @see SitePrism::Page#url
61
62
  # @return [String] the url originally set in {.set_url}
62
63
  def self.url
63
64
  @url
64
65
  end
65
-
66
+
66
67
  # Get the url matcher associated with this page
67
68
  # @see SitePrism::Page#url_matcher
68
69
  # @return [Regexp] the url matcher originally set in {.set_url_matcher}
69
70
  def self.url_matcher
70
71
  @url_matcher
71
72
  end
72
-
73
+
73
74
  # Get the url associated with this page
74
75
  # @see SitePrism::Page.url
75
76
  def url
76
77
  self.class.url
77
78
  end
78
-
79
+
79
80
  # Get the url matcher associated with this page
80
81
  # @see SitePrism::Page.url_matcher
81
82
  def url_matcher
82
83
  self.class.url_matcher
83
84
  end
84
-
85
+
85
86
  # Gets the title of the current page
86
87
  # @return [String, nil] the text value of the title element within the page's head block
87
88
  def title
88
89
  title_selector = 'html > head > title'
89
90
  using_wait_time(0) { page.find(title_selector).text if page.has_selector?(title_selector) }
90
91
  end
91
-
92
+
92
93
  private
93
-
94
+
94
95
  # Page specific element finder
95
96
  def find_one locator
96
97
  find locator
97
98
  end
98
-
99
+
99
100
  # Page specific elements finder
100
101
  def find_all locator
101
102
  all locator
102
103
  end
103
-
104
+
104
105
  # Page specific element existence check
105
106
  def element_exists? locator
106
107
  has_selector? locator
107
108
  end
108
-
109
+
109
110
  # Page specific element waiter
110
111
  def element_waiter locator
111
112
  wait_until { element_exists? locator }
112
113
  end
114
+
115
+ def self.add_element_name element_name
116
+ @element_names ||= []
117
+ @element_names << element_name
118
+ end
119
+
120
+ def self.element_names
121
+ @element_names
122
+ end
113
123
  end
114
- end
124
+ end
125
+
@@ -1,9 +1,10 @@
1
1
  module SitePrism
2
2
  class Section
3
+ include ElementChecker
3
4
  extend ElementContainer
4
-
5
+
5
6
  attr_reader :root_element
6
-
7
+
7
8
  def initialize root_element
8
9
  @root_element = root_element
9
10
  end
@@ -11,14 +12,14 @@ module SitePrism
11
12
  def visible?
12
13
  @root_element.visible?
13
14
  end
14
-
15
+
15
16
  private
16
-
17
+
17
18
  # Section specific element finder
18
19
  def find_one locator
19
20
  @root_element.find locator
20
21
  end
21
-
22
+
22
23
  # Section specific elements finder
23
24
  def find_all locator
24
25
  @root_element.all locator
@@ -33,5 +34,15 @@ module SitePrism
33
34
  def element_waiter locator
34
35
  wait_until { element_exists? locator }
35
36
  end
37
+
38
+ def self.add_element_name element_name
39
+ @element_names ||= []
40
+ @element_names << element_name
41
+ end
42
+
43
+ def self.element_names
44
+ @element_names
45
+ end
36
46
  end
37
47
  end
48
+
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: site_prism
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.3
5
+ version: 0.9.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nat Ritmeyer
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-02-11 00:00:00 Z
13
+ date: 2012-03-01 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: capybara
@@ -44,6 +44,7 @@ extensions: []
44
44
  extra_rdoc_files: []
45
45
 
46
46
  files:
47
+ - lib/site_prism/element_checker.rb
47
48
  - lib/site_prism/element_container.rb
48
49
  - lib/site_prism/exceptions.rb
49
50
  - lib/site_prism/page.rb