page-object 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/ChangeLog +39 -0
  2. data/Gemfile +1 -0
  3. data/Rakefile +2 -2
  4. data/cucumber.yml +4 -4
  5. data/features/element.feature +5 -0
  6. data/features/{sample-app/public → html}/04-Death_Becomes_Fur.mp4 +0 -0
  7. data/features/{sample-app/public → html}/04-Death_Becomes_Fur.oga +0 -0
  8. data/features/{sample-app/public → html}/movie.mp4 +0 -0
  9. data/features/{sample-app/public → html}/movie.ogg +0 -0
  10. data/features/html/static_elements.html +7 -7
  11. data/features/sample-app/sample_app.rb +1 -1
  12. data/features/step_definitions/element_steps.rb +7 -0
  13. data/features/step_definitions/image_steps.rb +1 -1
  14. data/features/step_definitions/javascript_steps.rb +8 -2
  15. data/features/support/persistent_browser.rb +56 -3
  16. data/features/support/targets/firefox14_osx.rb +6 -0
  17. data/features/support/targets/firefox14_windows7.rb +6 -0
  18. data/features/support/url_helper.rb +3 -1
  19. data/lib/page-object/accessors.rb +131 -1003
  20. data/lib/page-object/element_locators.rb +9 -1008
  21. data/lib/page-object/locator_generator.rb +77 -0
  22. data/lib/page-object/nested_elements.rb +7 -230
  23. data/lib/page-object/page_factory.rb +10 -6
  24. data/lib/page-object/platforms/selenium_webdriver/element.rb +7 -0
  25. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +2 -2
  26. data/lib/page-object/platforms/watir_webdriver/element.rb +7 -0
  27. data/lib/page-object/platforms/watir_webdriver/page_object.rb +2 -2
  28. data/lib/page-object/version.rb +1 -1
  29. data/spec/page-object/elements/selenium_element_spec.rb +5 -0
  30. data/spec/page-object/elements/watir_element_spec.rb +6 -0
  31. data/spec/page-object/page_factory_spec.rb +9 -0
  32. data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +29 -0
  33. data/spec/page-object/platforms/watir_webdriver_spec.rb +0 -24
  34. data/spec/page-object/selenium_accessors_spec.rb +14 -0
  35. data/spec/page-object/watir_accessors_spec.rb +16 -17
  36. metadata +19 -12
@@ -0,0 +1,77 @@
1
+ module PageObject
2
+ module LocatorGenerator
3
+
4
+ def self.generate_locators(target)
5
+ [:text_field,
6
+ :hidden_field,
7
+ :text_area,
8
+ :select_list,
9
+ :link,
10
+ :checkbox,
11
+ :radio_button,
12
+ :button,
13
+ :div,
14
+ :span,
15
+ :table,
16
+ :cell,
17
+ :image,
18
+ :form,
19
+ :list_item,
20
+ :ordered_list,
21
+ :unordered_list,
22
+ :h1,
23
+ :h2,
24
+ :h3,
25
+ :h4,
26
+ :h5,
27
+ :h6,
28
+ :paragraph,
29
+ :label,
30
+ :file_field,
31
+ :area,
32
+ :canvas,
33
+ :audio,
34
+ :video,
35
+ :abbr,
36
+ :address,
37
+ :article,
38
+ :aside,
39
+ :bdi,
40
+ :bdo,
41
+ :cite,
42
+ :code,
43
+ :dd,
44
+ :dfn,
45
+ :dt,
46
+ :em,
47
+ :figcaption,
48
+ :figure,
49
+ :footer,
50
+ :header,
51
+ :hgroup,
52
+ :kbd,
53
+ :mark,
54
+ :nav,
55
+ :noscript,
56
+ :rp,
57
+ :rt,
58
+ :ruby,
59
+ :samp,
60
+ :section,
61
+ :sub,
62
+ :summary,
63
+ :sup,
64
+ :var,
65
+ :wbr].each do |tag|
66
+ target.send(:define_method, "#{tag.to_s}_element") do |*identifier|
67
+ @platform.send "#{tag.to_s}_for", locator(identifier)
68
+ end
69
+
70
+ target.send(:define_method, "#{tag.to_s}_elements") do |*identifier|
71
+ @platform.send("#{tag.to_s}s_for", identifier[0] ? identifier[0] : {})
72
+ end
73
+ end
74
+ end
75
+
76
+ end
77
+ end
@@ -1,240 +1,17 @@
1
+ require 'page-object/locator_generator'
2
+
1
3
  module PageObject
2
4
  module NestedElements
3
5
 
4
- def link_element(identifier={:index => 0})
5
- @platform.link_for(identifier)
6
- end
7
-
8
- def link_elements(identifier={:index => 0})
9
- @platform.links_for(identifier)
10
- end
11
-
12
- def button_element(identifier={:index => 0})
13
- @platform.button_for(identifier)
14
- end
15
-
16
- def button_elements(identifier={:index => 0})
17
- @platform.buttons_for(identifier)
6
+ def self.included(cls)
7
+ ::PageObject::LocatorGenerator.generate_locators(cls)
18
8
  end
19
9
 
20
- def text_field_element(identifier={:index => 0})
21
- @platform.text_field_for(identifier)
22
- end
10
+ private
23
11
 
24
- def text_field_elements(identifier={:index => 0})
25
- @platform.text_fields_for(identifier)
26
- end
27
-
28
- def hidden_field_element(identifier={:index => 0})
29
- @platform.hidden_field_for(identifier)
30
- end
31
-
32
- def hidden_field_elements(identifier={:index => 0})
33
- @platform.hidden_fields_for(identifier)
34
- end
35
-
36
- def text_area_element(identifier={:index => 0})
37
- @platform.text_area_for(identifier)
38
- end
39
-
40
- def text_area_elements(identifier={:index => 0})
41
- @platform.text_areas_for(identifier)
42
- end
43
-
44
- def select_list_element(identifier={:index => 0})
45
- @platform.select_list_for(identifier)
46
- end
47
-
48
- def select_list_elements(identifier={:index => 0})
49
- @platform.select_lists_for(identifier)
50
- end
51
-
52
- def checkbox_element(identifier={:index => 0})
53
- @platform.checkbox_for(identifier)
54
- end
55
-
56
- def checkbox_elements(identifier={:index => 0})
57
- @platform.checkboxes_for(identifier)
58
- end
59
-
60
- def radio_button_element(identifier={:index => 0})
61
- @platform.radio_button_for(identifier)
62
- end
63
-
64
- def radio_button_elements(identifier={:index => 0})
65
- @platform.radio_buttons_for(identifier)
66
- end
67
-
68
- def div_element(identifier={:index => 0})
69
- @platform.div_for(identifier)
70
- end
71
-
72
- def div_elements(identifier={:index => 0})
73
- @platform.divs_for(identifier)
74
- end
75
-
76
- def span_element(identifier={:index => 0})
77
- @platform.span_for(identifier)
78
- end
79
-
80
- def span_elements(identifier={:index => 0})
81
- @platform.spans_for(identifier)
82
- end
83
-
84
- def table_element(identifier={:index => 0})
85
- @platform.table_for(identifier)
86
- end
87
-
88
- def table_elements(identifier={:index => 0})
89
- @platform.tables_for(identifier)
90
- end
91
-
92
- def cell_element(identifier={:index => 0})
93
- @platform.cell_for(identifier)
94
- end
95
-
96
- def cell_elements(identifier={:index => 0})
97
- @platform.cells_for(identifier)
98
- end
99
-
100
- def image_element(identifier={:index => 0})
101
- @platform.image_for(identifier)
102
- end
103
-
104
- def image_elements(identifier={:index => 0})
105
- @platform.images_for(identifier)
106
- end
107
-
108
- def form_element(identifier={:index => 0})
109
- @platform.form_for(identifier)
12
+ def locator(identifier)
13
+ identifier[0] ? identifier[0] : {:index => 0}
110
14
  end
111
15
 
112
- def form_elements(identifier={:index => 0})
113
- @platform.forms_for(identifier)
114
- end
115
-
116
- def ordered_list_element(identifier={:index => 0})
117
- @platform.ordered_list_for(identifier)
118
- end
119
-
120
- def ordered_list_elements(identifier={:index => 0})
121
- @platform.ordered_lists_for(identifier)
122
- end
123
-
124
- def unordered_list_element(identifier={:index => 0})
125
- @platform.unordered_list_for(identifier)
126
- end
127
-
128
- def unordered_list_elements(identifier={:index => 0})
129
- @platform.unordered_lists_for(identifier)
130
- end
131
-
132
- def list_item_element(identifier={:index => 0})
133
- @platform.list_item_for(identifier)
134
- end
135
-
136
- def list_item_elements(identifier={:index => 0})
137
- @platform.list_items_for(identifier)
138
- end
139
-
140
- def h1_element(identifier={:index => 0})
141
- @platform.h1_for(identifier)
142
- end
143
-
144
- def h1_elements(identifier={:index => 0})
145
- @platform.h1s_for(identifier)
146
- end
147
-
148
- def h2_element(identifier={:index => 0})
149
- @platform.h2_for(identifier)
150
- end
151
-
152
- def h2_elements(identifier={:index => 0})
153
- @platform.h2s_for(identifier)
154
- end
155
-
156
- def h3_element(identifier={:index => 0})
157
- @platform.h3_for(identifier)
158
- end
159
-
160
- def h3_elements(identifier={:index => 0})
161
- @platform.h3s_for(identifier)
162
- end
163
-
164
- def h4_element(identifier={:index => 0})
165
- @platform.h4_for(identifier)
166
- end
167
-
168
- def h4_elements(identifier={:index => 0})
169
- @platform.h4s_for(identifier)
170
- end
171
-
172
- def h5_element(identifier={:index => 0})
173
- @platform.h5_for(identifier)
174
- end
175
-
176
- def h5_elements(identifier={:index => 0})
177
- @platform.h5s_for(identifier)
178
- end
179
-
180
- def h6_element(identifier={:index => 0})
181
- @platform.h6_for(identifier)
182
- end
183
-
184
- def h6_elements(identifier={:index => 0})
185
- @platform.h6s_for(identifier)
186
- end
187
-
188
- def paragraph_element(identifier={:index => 0})
189
- @platform.paragraph_for(identifier)
190
- end
191
-
192
- def paragraph_elements(identifier={:index => 0})
193
- @platform.paragraphs_for(identifier)
194
- end
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
-
204
- def file_field_element(identifier={:index => 0})
205
- @platform.file_field_for(identifier)
206
- end
207
-
208
- def area_element(identifier={:index => 0})
209
- @platform.area_for(identifier)
210
- end
211
-
212
- def area_elements(identifier={:index => 0})
213
- @platform.areas_for(identifier)
214
- end
215
-
216
- def canvas_element(identifier={:index => 0})
217
- @platform.canvas_for(identifier)
218
- end
219
-
220
- def canvas_elements(identifier={:index => 0})
221
- @platform.canvases_for(identifier)
222
- end
223
-
224
- def audio_element(identifier={:index => 0})
225
- @platform.audio_for(identifier)
226
- end
227
-
228
- def audio_elements(identifier={:index => 0})
229
- @platform.audios_for(identifier)
230
- end
231
-
232
- def video_element(identifier={:index => 0})
233
- @platform.video_for(identifier)
234
- end
235
-
236
- def video_elements(identifier={:index => 0})
237
- @platform.video_for(identifier)
238
- end
239
16
  end
240
17
  end
@@ -26,9 +26,12 @@ module PageObject
26
26
  # @example Example routes defined in env.rb
27
27
  # PageObject::PageFactory.routes = {
28
28
  # :default => [[PageOne,:method1], [PageTwoA,:method2], [PageThree,:method3]],
29
- # :another_route => [[PageOne,:method1], [PageTwoB,:method2b], [PageThree,:method3]]
29
+ # :another_route => [[PageOne,:method1, "arg1"], [PageTwoB,:method2b], [PageThree,:method3]]
30
30
  # }
31
- #
31
+ #
32
+ # Notice the first entry of :anouther_route is passing an argument
33
+ # to the method.
34
+ #
32
35
  module PageFactory
33
36
 
34
37
  #
@@ -147,15 +150,16 @@ module PageObject
147
150
  end
148
151
 
149
152
  def navigate_through_pages(pages)
150
- pages.each do |cls, method|
153
+ pages.each do |cls, method, *args|
151
154
  page = on_page(cls)
152
- fail("Navigation method not specified on #{cls}. Please call the ") unless page.respond_to? method
153
- page.send method
155
+ fail("Navigation method not specified on #{cls}.") unless page.respond_to? method
156
+ page.send method unless args
157
+ page.send method, *args if args
154
158
  end
155
159
  end
156
160
 
157
161
  def find_index_for(path, item)
158
- path.each_with_index { |each, index| return index if each[0] == item}
162
+ path.find_index { |each| each[0] == item}
159
163
  end
160
164
 
161
165
  class << self
@@ -264,6 +264,13 @@ module PageObject
264
264
  attribute(:id)
265
265
  end
266
266
 
267
+ #
268
+ # Scroll until the element is viewable
269
+ #
270
+ def scroll_into_view
271
+ element.location_once_scrolled_into_view
272
+ end
273
+
267
274
  private
268
275
 
269
276
  def bridge
@@ -401,7 +401,7 @@ module PageObject
401
401
  #
402
402
  # platform method to retrieve all checkbox elements
403
403
  #
404
- def checkboxes_for(identifier)
404
+ def checkboxs_for(identifier)
405
405
  find_selenium_elements(identifier, Elements::CheckBox, 'input', :type => 'checkbox')
406
406
  end
407
407
 
@@ -940,7 +940,7 @@ module PageObject
940
940
  #
941
941
  # platform method to return an array of canvas elements
942
942
  #
943
- def canvases_for(identifier)
943
+ def canvass_for(identifier)
944
944
  find_selenium_elements(identifier, Elements::Canvas, 'canvas')
945
945
  end
946
946
 
@@ -227,6 +227,13 @@ module PageObject
227
227
  def id
228
228
  element.id
229
229
  end
230
+
231
+ #
232
+ # Scroll until the element is viewable
233
+ #
234
+ def scroll_into_view
235
+ element.wd.location_once_scrolled_into_view
236
+ end
230
237
  end
231
238
  end
232
239
  end
@@ -366,7 +366,7 @@ module PageObject
366
366
  #
367
367
  # platform method to retrieve an array of checkbox elements
368
368
  #
369
- def checkboxes_for(identifier)
369
+ def checkboxs_for(identifier)
370
370
  find_watir_elements("checkboxes(identifier)", Elements::CheckBox, identifier)
371
371
  end
372
372
 
@@ -867,7 +867,7 @@ module PageObject
867
867
  #
868
868
  # platform method to retrieve an array of canvas elements
869
869
  #
870
- def canvases_for(identifier)
870
+ def canvass_for(identifier)
871
871
  find_watir_elements("canvases(identifier)", Elements::Canvas, identifier, 'canvas')
872
872
  end
873
873
 
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.8.1"
3
+ VERSION = "0.8.2"
4
4
  end
@@ -164,4 +164,9 @@ describe "Element for Selenium" do
164
164
  @selenium_driver.should_receive(:executeScript)
165
165
  @selenium_element.focus
166
166
  end
167
+
168
+ it "should scroll into view" do
169
+ @selenium_driver.should_receive(:location_once_scrolled_into_view)
170
+ @selenium_element.scroll_into_view
171
+ end
167
172
  end
@@ -133,4 +133,10 @@ describe "Element for Watir" do
133
133
  watir_driver.should_receive(:clear)
134
134
  watir_element.clear
135
135
  end
136
+
137
+ it "should scroll into view" do
138
+ watir_driver.stub(:wd).and_return(watir_driver)
139
+ watir_driver.should_receive(:location_once_scrolled_into_view)
140
+ watir_element.scroll_into_view
141
+ end
136
142
  end