page-object 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. data/ChangeLog +15 -0
  2. data/features/button.feature +1 -0
  3. data/features/element.feature +60 -56
  4. data/features/frames.feature +1 -0
  5. data/features/generic_elements.feature +24 -0
  6. data/features/html/multi_elements.html +4 -0
  7. data/features/html/nested_elements.html +4 -1
  8. data/features/html/static_elements.html +15 -1
  9. data/features/label.feature +44 -0
  10. data/features/link.feature +1 -0
  11. data/features/sample-app/public/prototype.html +1 -0
  12. data/features/step_definitions/element_steps.rb +22 -6
  13. data/features/step_definitions/frames_steps.rb +4 -0
  14. data/features/step_definitions/generic_element_steps.rb +19 -0
  15. data/features/step_definitions/label_steps.rb +19 -0
  16. data/features/support/page.rb +17 -0
  17. data/lib/page-object.rb +7 -0
  18. data/lib/page-object/accessors.rb +73 -1
  19. data/lib/page-object/element_locators.rb +36 -0
  20. data/lib/page-object/elements.rb +2 -1
  21. data/lib/page-object/elements/button.rb +2 -2
  22. data/lib/page-object/elements/element.rb +6 -6
  23. data/lib/page-object/elements/label.rb +19 -0
  24. data/lib/page-object/elements/link.rb +2 -2
  25. data/lib/page-object/elements/text_field.rb +1 -1
  26. data/lib/page-object/nested_elements.rb +8 -0
  27. data/lib/page-object/page_factory.rb +6 -0
  28. data/lib/page-object/platforms/selenium_webdriver/element.rb +17 -17
  29. data/lib/page-object/platforms/selenium_webdriver/form.rb +2 -2
  30. data/lib/page-object/platforms/selenium_webdriver/image.rb +2 -2
  31. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +54 -1
  32. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +2 -2
  33. data/lib/page-object/platforms/selenium_webdriver/table.rb +2 -2
  34. data/lib/page-object/platforms/watir_webdriver/element.rb +14 -14
  35. data/lib/page-object/platforms/watir_webdriver/form.rb +2 -2
  36. data/lib/page-object/platforms/watir_webdriver/image.rb +2 -2
  37. data/lib/page-object/platforms/watir_webdriver/page_object.rb +72 -9
  38. data/lib/page-object/platforms/watir_webdriver/select_list.rb +5 -5
  39. data/lib/page-object/platforms/watir_webdriver/table.rb +2 -2
  40. data/lib/page-object/version.rb +1 -1
  41. data/page-object.gemspec +1 -1
  42. data/spec/page-object/accessors_spec.rb +15 -3
  43. data/spec/page-object/element_locators_spec.rb +24 -0
  44. data/spec/page-object/elements/button_spec.rb +2 -2
  45. data/spec/page-object/elements/label_spec.rb +29 -0
  46. data/spec/page-object/elements/link_spec.rb +2 -2
  47. data/spec/page-object/page-object_spec.rb +7 -1
  48. data/spec/page-object/page_factory_spec.rb +26 -0
  49. data/spec/page-object/platforms/watir_webdriver_spec.rb +1 -0
  50. metadata +26 -15
@@ -11,7 +11,7 @@ module PageObject
11
11
  protected
12
12
 
13
13
  def self.watir_finders
14
- super + [:href, :text]
14
+ super + [:href, :text, :css]
15
15
  end
16
16
 
17
17
  def self.watir_mapping
@@ -19,7 +19,7 @@ module PageObject
19
19
  end
20
20
 
21
21
  def self.selenium_finders
22
- super + [:link, :link_text]
22
+ super + [:link, :link_text, :css]
23
23
  end
24
24
 
25
25
  def self.selenium_mapping
@@ -9,7 +9,7 @@ module PageObject
9
9
  end
10
10
 
11
11
  def append(text)
12
- @element.send_keys text
12
+ element.send_keys text
13
13
  end
14
14
 
15
15
  protected
@@ -193,6 +193,14 @@ module PageObject
193
193
  @platform.paragraphs_for(identifier)
194
194
  end
195
195
 
196
+ def label_element(identifier={:index => 0})
197
+ @platform.label_for(identifier)
198
+ end
199
+
200
+ def label_elements(identifier={:index => 0})
201
+ @platform.labels_for(identifier)
202
+ end
203
+
196
204
  def file_field_element(identifier={:index => 0})
197
205
  @platform.file_field_for(identifier)
198
206
  end
@@ -43,6 +43,9 @@ module PageObject
43
43
  on_page page_class, true, &block
44
44
  end
45
45
 
46
+ # Support 'visit' for readability of usage
47
+ alias_method :visit, :visit_page
48
+
46
49
  #
47
50
  # Create a page object.
48
51
  #
@@ -57,6 +60,9 @@ module PageObject
57
60
  @current_page
58
61
  end
59
62
 
63
+ # Support 'on' for readability of usage
64
+ alias_method :on, :on_page
65
+
60
66
  #
61
67
  # Navigate to a specific page following a predefined path.
62
68
  #
@@ -13,14 +13,14 @@ module PageObject
13
13
  # return true if an element is visible
14
14
  #
15
15
  def visible?
16
- @element.displayed?
16
+ element.displayed?
17
17
  end
18
18
 
19
19
  #
20
20
  # return true if an element exists
21
21
  #
22
22
  def exists?
23
- not @element.nil?
23
+ not element.nil?
24
24
  end
25
25
 
26
26
  #
@@ -29,7 +29,7 @@ module PageObject
29
29
  # @return [String]
30
30
  #
31
31
  def text
32
- @element.text
32
+ element.text
33
33
  end
34
34
 
35
35
  #
@@ -38,14 +38,14 @@ module PageObject
38
38
  # @return [String]
39
39
  #
40
40
  def value
41
- @element.attribute('value')
41
+ element.attribute('value')
42
42
  end
43
43
 
44
44
  #
45
45
  # compare this element to another to determine if they are equal
46
46
  #
47
47
  def ==(other)
48
- @element == other.element
48
+ element == other.element
49
49
  end
50
50
 
51
51
  #
@@ -54,7 +54,7 @@ module PageObject
54
54
  # @return [String]
55
55
  #
56
56
  def tag_name
57
- @element.tag_name
57
+ element.tag_name
58
58
  end
59
59
 
60
60
  #
@@ -88,7 +88,7 @@ module PageObject
88
88
  # attribute value
89
89
  #
90
90
  def attribute(attribute_name)
91
- @element.attribute attribute_name
91
+ element.attribute attribute_name
92
92
  end
93
93
 
94
94
  #
@@ -97,8 +97,8 @@ module PageObject
97
97
  def fire_event(event_name)
98
98
  event_name = event_name.to_s.sub(/^on/, '').downcase
99
99
  script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:fireEvent)
100
- bridge = @element.instance_variable_get(:@bridge)
101
- bridge.executeScript(script, @element, event_name)
100
+ bridge = element.instance_variable_get(:@bridge)
101
+ bridge.executeScript(script, element, event_name)
102
102
  end
103
103
 
104
104
  #
@@ -106,9 +106,9 @@ module PageObject
106
106
  #
107
107
  def parent
108
108
  script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:getParentElement)
109
- bridge = @element.instance_variable_get(:@bridge)
110
- parent = bridge.executeScript(script, @element)
111
- type = @element.type if parent.tag_name.to_sym == :input
109
+ bridge = element.instance_variable_get(:@bridge)
110
+ parent = bridge.executeScript(script, element)
111
+ type = element.attribute(:type).to_s.downcase if parent.tag_name.to_sym == :input
112
112
  cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
113
113
  cls.new(parent, :platform => :selenium_webdriver)
114
114
  end
@@ -117,15 +117,15 @@ module PageObject
117
117
  # Set the focus to the current element
118
118
  #
119
119
  def focus
120
- bridge = @element.instance_variable_get(:@bridge)
121
- bridge.executeScript("return arguments[0].focus()", @element)
120
+ bridge = element.instance_variable_get(:@bridge)
121
+ bridge.executeScript("return arguments[0].focus()", element)
122
122
  end
123
123
 
124
124
  #
125
125
  # Click this element
126
126
  #
127
127
  def right_click
128
- @element.context_click
128
+ element.context_click
129
129
  end
130
130
 
131
131
  #
@@ -193,14 +193,14 @@ module PageObject
193
193
  # @see Selenium::WebDriver::Keys::KEYS
194
194
  #
195
195
  def send_keys(*args)
196
- @element.send_keys(*args)
196
+ element.send_keys(*args)
197
197
  end
198
198
 
199
199
  #
200
200
  # clear the contents of the element
201
201
  #
202
202
  def clear
203
- @element.clear
203
+ element.clear
204
204
  end
205
205
  end
206
206
  end
@@ -7,10 +7,10 @@ module PageObject
7
7
  # Submit the form.
8
8
  #
9
9
  def submit
10
- @element.submit
10
+ element.submit
11
11
  end
12
12
 
13
13
  end
14
14
  end
15
15
  end
16
- end
16
+ end
@@ -20,9 +20,9 @@ module PageObject
20
20
  private
21
21
 
22
22
  def dimension
23
- @element.size
23
+ element.size
24
24
  end
25
25
  end
26
26
  end
27
27
  end
28
- end
28
+ end
@@ -121,6 +121,16 @@ module PageObject
121
121
  end
122
122
  end
123
123
 
124
+ #
125
+ # find the element that has focus
126
+ #
127
+ def element_with_focus
128
+ element = @browser.execute_script("return document.activeElement")
129
+ type = element.attribute(:type).to_s.downcase if element.tag_name.to_sym == :input
130
+ cls = ::PageObject::Elements.element_class_for(element.tag_name, type)
131
+ cls.new(element, :platform => :selenium_webdriver)
132
+ end
133
+
124
134
  #
125
135
  # platform method to switch to a frame and execute a block
126
136
  # See PageObject#in_frame
@@ -795,6 +805,33 @@ module PageObject
795
805
  find_selenium_elements(identifier, Elements::Paragraph, 'p')
796
806
  end
797
807
 
808
+ #
809
+ # platform method to return the text for a label
810
+ # See PageObject::Accessors#label
811
+ #
812
+ def label_text_for(identifier)
813
+ process_selenium_call(identifier, Elements::Label, 'label') do |how, what|
814
+ @browser.find_element(how, what).text
815
+ end
816
+ end
817
+
818
+
819
+ #
820
+ # platform method to return a PageObject::Elements::Label element
821
+ # See PageObject::Accessors#label
822
+ #
823
+ def label_for(identifier)
824
+ find_selenium_element(identifier, Elements::Label, 'label')
825
+ end
826
+
827
+
828
+ #
829
+ # platform method to retrieve all label elements
830
+ #
831
+ def labels_for(identifier)
832
+ find_selenium_elements(identifier, Elements::Label, 'label')
833
+ end
834
+
798
835
  #
799
836
  # platform method to set the file on a file_field element
800
837
  # See PageObject::Accessors#file_field
@@ -813,6 +850,22 @@ module PageObject
813
850
  find_selenium_element(identifier, Elements::FileField, 'input', :type => 'file')
814
851
  end
815
852
 
853
+ #
854
+ # platform method to retrieve a generic element
855
+ # See PageObject::Accessors#element
856
+ #
857
+ def element_for(tag, identifier)
858
+ find_selenium_element(identifier, Elements::FileField, tag.to_s)
859
+ end
860
+
861
+ #
862
+ # platform method to retrieve a collection of generic elements
863
+ # See PageObject::Accessors#elements
864
+ #
865
+ def elements_for(tag, identifier)
866
+ find_selenium_elements(identifier, Elements::FileField, tag.to_s)
867
+ end
868
+
816
869
  private
817
870
 
818
871
  def process_selenium_call(identifier, type, tag, other=nil)
@@ -868,7 +921,7 @@ module PageObject
868
921
  ['submit', 'image', 'button', 'reset'].include? additional[:type]
869
922
  return false if identifier[:src] and tag == 'img'
870
923
  return false if identifier[:text] and tag == 'input' and additional[:type] == 'hidden'
871
- return false if identifier[:text] and ['div', 'span', 'td'].include? tag
924
+ return false if identifier[:text] and ['div', 'span', 'td', 'label'].include? tag
872
925
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'text'
873
926
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'file'
874
927
  return false if identifier[:value] and tag == 'input' and
@@ -17,7 +17,7 @@ module PageObject
17
17
  # Select a value from the list
18
18
  #
19
19
  def select(value)
20
- @element.send_keys(value)
20
+ element.send_keys(value)
21
21
  end
22
22
 
23
23
  #
@@ -57,7 +57,7 @@ module PageObject
57
57
  private
58
58
 
59
59
  def find_options
60
- @element.find_elements(:xpath, child_xpath)
60
+ element.find_elements(:xpath, child_xpath)
61
61
  end
62
62
  end
63
63
  end
@@ -32,9 +32,9 @@ module PageObject
32
32
  private
33
33
 
34
34
  def table_rows
35
- @element.find_elements(:xpath, child_xpath)
35
+ element.find_elements(:xpath, child_xpath)
36
36
  end
37
37
  end
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -10,14 +10,14 @@ module PageObject
10
10
  # return true if an element is visible
11
11
  #
12
12
  def visible?
13
- @element.present?
13
+ element.present?
14
14
  end
15
15
 
16
16
  #
17
17
  # return true if an element exists
18
18
  #
19
19
  def exists?
20
- @element.exists?
20
+ element.exists?
21
21
  end
22
22
 
23
23
  #
@@ -26,7 +26,7 @@ module PageObject
26
26
  # @return [String]
27
27
  #
28
28
  def text
29
- @element.text
29
+ element.text
30
30
  end
31
31
 
32
32
  #
@@ -35,14 +35,14 @@ module PageObject
35
35
  # @return [String]
36
36
  #
37
37
  def value
38
- @element.value
38
+ element.value
39
39
  end
40
40
 
41
41
  #
42
42
  # compare this element to another to determine if they are equal
43
43
  #
44
44
  def ==(other)
45
- @element == other.element
45
+ element == other.element
46
46
  end
47
47
 
48
48
  #
@@ -51,7 +51,7 @@ module PageObject
51
51
  # @return [String]
52
52
  #
53
53
  def tag_name
54
- @element.tag_name
54
+ element.tag_name
55
55
  end
56
56
 
57
57
  #
@@ -85,22 +85,22 @@ module PageObject
85
85
  # attribute value
86
86
  #
87
87
  def attribute(attribute_name)
88
- @element.attribute_value attribute_name
88
+ element.attribute_value attribute_name
89
89
  end
90
90
 
91
91
  #
92
92
  # Fire the provided event on the current element
93
93
  #
94
94
  def fire_event(event_name)
95
- @element.fire_event(event_name)
95
+ element.fire_event(event_name)
96
96
  end
97
97
 
98
98
  #
99
99
  # find the parent element
100
100
  #
101
101
  def parent
102
- parent = @element.parent
103
- type = @element.type if parent.tag_name.to_sym == :input
102
+ parent = element.parent
103
+ type = element.type if parent.tag_name.to_sym == :input
104
104
  cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
105
105
  cls.new(parent, :platform => :watir_webdriver)
106
106
  end
@@ -109,7 +109,7 @@ module PageObject
109
109
  # Set the focus to the current element
110
110
  #
111
111
  def focus
112
- @element.focus
112
+ element.focus
113
113
  end
114
114
 
115
115
  #
@@ -118,7 +118,7 @@ module PageObject
118
118
  # @param [Integer] (defaults to: 5) seconds to wait before timing out
119
119
  #
120
120
  def when_present(timeout=5)
121
- @element.wait_until_present(timeout)
121
+ element.wait_until_present(timeout)
122
122
  self
123
123
  end
124
124
 
@@ -171,14 +171,14 @@ module PageObject
171
171
  # @see Selenium::WebDriver::Keys::KEYS
172
172
  #
173
173
  def send_keys(*args)
174
- @element.send_keys(*args)
174
+ element.send_keys(*args)
175
175
  end
176
176
 
177
177
  #
178
178
  # clear the contents of the element
179
179
  #
180
180
  def clear
181
- @element.clear
181
+ element.clear
182
182
  end
183
183
  end
184
184
  end
@@ -7,10 +7,10 @@ module PageObject
7
7
  # Submit the form.
8
8
  #
9
9
  def submit
10
- @element.submit
10
+ element.submit
11
11
  end
12
12
 
13
13
  end
14
14
  end
15
15
  end
16
- end
16
+ end