meeane-page-object 0.1.8

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 (262) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +10 -0
  7. data/ChangeLog +790 -0
  8. data/Gemfile +13 -0
  9. data/Guardfile +20 -0
  10. data/LICENSE +20 -0
  11. data/README.md +141 -0
  12. data/Rakefile +35 -0
  13. data/cucumber.yml +10 -0
  14. data/features/area.feature +35 -0
  15. data/features/async.feature +30 -0
  16. data/features/audio.feature +68 -0
  17. data/features/button.feature +87 -0
  18. data/features/canvas.feature +37 -0
  19. data/features/check_box.feature +55 -0
  20. data/features/div.feature +45 -0
  21. data/features/element.feature +322 -0
  22. data/features/file_field.feature +40 -0
  23. data/features/form.feature +43 -0
  24. data/features/frames.feature +75 -0
  25. data/features/generic_elements.feature +29 -0
  26. data/features/gxt_table_extension.feature +24 -0
  27. data/features/headings.feature +97 -0
  28. data/features/hidden_field.feature +45 -0
  29. data/features/html/04-Death_Becomes_Fur.mp4 +0 -0
  30. data/features/html/04-Death_Becomes_Fur.oga +0 -0
  31. data/features/html/async.html +36 -0
  32. data/features/html/double_click.html +13 -0
  33. data/features/html/failure.html +8 -0
  34. data/features/html/frame_1.html +18 -0
  35. data/features/html/frame_2.html +16 -0
  36. data/features/html/frame_3.html +14 -0
  37. data/features/html/frames.html +12 -0
  38. data/features/html/hover.html +12 -0
  39. data/features/html/iframes.html +12 -0
  40. data/features/html/images/circle.png +0 -0
  41. data/features/html/images/img_pulpit.jpg +0 -0
  42. data/features/html/images/submit.gif +0 -0
  43. data/features/html/indexed_property.html +52 -0
  44. data/features/html/modal.html +17 -0
  45. data/features/html/modal_1.html +38 -0
  46. data/features/html/modal_2.html +27 -0
  47. data/features/html/movie.mp4 +0 -0
  48. data/features/html/movie.ogg +0 -0
  49. data/features/html/multi_elements.html +144 -0
  50. data/features/html/nested_elements.html +77 -0
  51. data/features/html/nested_frame_1.html +1 -0
  52. data/features/html/nested_frame_2.html +11 -0
  53. data/features/html/nested_frame_3.html +14 -0
  54. data/features/html/nested_frames.html +10 -0
  55. data/features/html/planets.gif +0 -0
  56. data/features/html/static_elements.html +206 -0
  57. data/features/html/success.html +8 -0
  58. data/features/html/sun.gif +0 -0
  59. data/features/html/sun.html +7 -0
  60. data/features/image.feature +50 -0
  61. data/features/indexed_property.feature +98 -0
  62. data/features/javascript.feature +28 -0
  63. data/features/label.feature +46 -0
  64. data/features/link.feature +52 -0
  65. data/features/list_item.feature +36 -0
  66. data/features/modal_dialog.feature +15 -0
  67. data/features/multi_elements.feature +486 -0
  68. data/features/nested_elements.feature +117 -0
  69. data/features/ordered_list.feature +56 -0
  70. data/features/page_level_actions.feature +90 -0
  71. data/features/paragraph.feature +35 -0
  72. data/features/radio_button.feature +58 -0
  73. data/features/radio_button_group.feature +29 -0
  74. data/features/sample-app/public/jquery-1.3.2.js +4376 -0
  75. data/features/sample-app/public/jquery.html +30 -0
  76. data/features/sample-app/public/prototype-1.6.0.3.js +4320 -0
  77. data/features/sample-app/public/prototype.html +35 -0
  78. data/features/sample-app/sample_app.rb +35 -0
  79. data/features/select_list.feature +86 -0
  80. data/features/span.feature +37 -0
  81. data/features/step_definitions/accessor_steps.rb +60 -0
  82. data/features/step_definitions/area_steps.rb +19 -0
  83. data/features/step_definitions/async_steps.rb +83 -0
  84. data/features/step_definitions/audio_steps.rb +27 -0
  85. data/features/step_definitions/button_steps.rb +43 -0
  86. data/features/step_definitions/canvas_steps.rb +15 -0
  87. data/features/step_definitions/check_box_steps.rb +35 -0
  88. data/features/step_definitions/div_steps.rb +19 -0
  89. data/features/step_definitions/element_steps.rb +266 -0
  90. data/features/step_definitions/file_field_steps.rb +19 -0
  91. data/features/step_definitions/form_steps.rb +19 -0
  92. data/features/step_definitions/frames_steps.rb +159 -0
  93. data/features/step_definitions/generic_element_steps.rb +31 -0
  94. data/features/step_definitions/gxt_table_steps.rb +58 -0
  95. data/features/step_definitions/headings_steps.rb +12 -0
  96. data/features/step_definitions/hidden_field_steps.rb +27 -0
  97. data/features/step_definitions/image_steps.rb +27 -0
  98. data/features/step_definitions/indexed_property_steps.rb +129 -0
  99. data/features/step_definitions/javascript_steps.rb +53 -0
  100. data/features/step_definitions/label_steps.rb +19 -0
  101. data/features/step_definitions/link_steps.rb +40 -0
  102. data/features/step_definitions/list_item_steps.rb +19 -0
  103. data/features/step_definitions/modal_dialog_steps.rb +62 -0
  104. data/features/step_definitions/multi_elements_steps.rb +528 -0
  105. data/features/step_definitions/nested_elements_steps.rb +212 -0
  106. data/features/step_definitions/ordered_list_steps.rb +23 -0
  107. data/features/step_definitions/page_level_actions_steps.rb +135 -0
  108. data/features/step_definitions/page_traversal_steps.rb +4 -0
  109. data/features/step_definitions/paragraph_steps.rb +28 -0
  110. data/features/step_definitions/radio_button_group_steps.rb +36 -0
  111. data/features/step_definitions/radio_button_steps.rb +27 -0
  112. data/features/step_definitions/select_list_steps.rb +65 -0
  113. data/features/step_definitions/span_steps.rb +19 -0
  114. data/features/step_definitions/table_cell_steps.rb +15 -0
  115. data/features/step_definitions/table_steps.rb +66 -0
  116. data/features/step_definitions/text_area_steps.rb +35 -0
  117. data/features/step_definitions/text_field_steps.rb +35 -0
  118. data/features/step_definitions/unordered_list_steps.rb +23 -0
  119. data/features/step_definitions/video_steps.rb +45 -0
  120. data/features/support/ajax_text_environment.rb +26 -0
  121. data/features/support/env.rb +8 -0
  122. data/features/support/hooks.rb +8 -0
  123. data/features/support/page.rb +364 -0
  124. data/features/support/persistent_browser.rb +70 -0
  125. data/features/support/targets/firefox14_osx.rb +6 -0
  126. data/features/support/targets/firefox14_windows7.rb +6 -0
  127. data/features/support/url_helper.rb +57 -0
  128. data/features/table.feature +114 -0
  129. data/features/table_cell.feature +45 -0
  130. data/features/text_area.feature +51 -0
  131. data/features/text_field.feature +70 -0
  132. data/features/unordered_list.feature +56 -0
  133. data/features/video.feature +73 -0
  134. data/lib/page-object/accessors.rb +1313 -0
  135. data/lib/page-object/core_ext/string.rb +5 -0
  136. data/lib/page-object/element_locators.rb +21 -0
  137. data/lib/page-object/elements/area.rb +31 -0
  138. data/lib/page-object/elements/audio.rb +9 -0
  139. data/lib/page-object/elements/button.rb +35 -0
  140. data/lib/page-object/elements/canvas.rb +23 -0
  141. data/lib/page-object/elements/check_box.rb +37 -0
  142. data/lib/page-object/elements/div.rb +19 -0
  143. data/lib/page-object/elements/element.rb +226 -0
  144. data/lib/page-object/elements/file_field.rb +38 -0
  145. data/lib/page-object/elements/form.rb +36 -0
  146. data/lib/page-object/elements/heading.rb +15 -0
  147. data/lib/page-object/elements/hidden_field.rb +22 -0
  148. data/lib/page-object/elements/image.rb +36 -0
  149. data/lib/page-object/elements/label.rb +36 -0
  150. data/lib/page-object/elements/link.rb +46 -0
  151. data/lib/page-object/elements/list_item.rb +19 -0
  152. data/lib/page-object/elements/media.rb +45 -0
  153. data/lib/page-object/elements/option.rb +10 -0
  154. data/lib/page-object/elements/ordered_list.rb +50 -0
  155. data/lib/page-object/elements/paragraph.rb +9 -0
  156. data/lib/page-object/elements/radio_button.rb +37 -0
  157. data/lib/page-object/elements/select_list.rb +42 -0
  158. data/lib/page-object/elements/span.rb +19 -0
  159. data/lib/page-object/elements/table.rb +68 -0
  160. data/lib/page-object/elements/table_cell.rb +28 -0
  161. data/lib/page-object/elements/table_row.rb +50 -0
  162. data/lib/page-object/elements/text_area.rb +38 -0
  163. data/lib/page-object/elements/text_field.rb +42 -0
  164. data/lib/page-object/elements/unordered_list.rb +51 -0
  165. data/lib/page-object/elements/video.rb +18 -0
  166. data/lib/page-object/elements.rb +59 -0
  167. data/lib/page-object/indexed_properties.rb +36 -0
  168. data/lib/page-object/javascript/jquery.rb +14 -0
  169. data/lib/page-object/javascript/prototype.rb +14 -0
  170. data/lib/page-object/javascript/yui.rb +19 -0
  171. data/lib/page-object/javascript_framework_facade.rb +78 -0
  172. data/lib/page-object/loads_platform.rb +26 -0
  173. data/lib/page-object/locator_generator.rb +129 -0
  174. data/lib/page-object/nested_elements.rb +17 -0
  175. data/lib/page-object/page_factory.rb +108 -0
  176. data/lib/page-object/page_populator.rb +92 -0
  177. data/lib/page-object/platforms/selenium_webdriver/button.rb +15 -0
  178. data/lib/page-object/platforms/selenium_webdriver/check_box.rb +29 -0
  179. data/lib/page-object/platforms/selenium_webdriver/element.rb +291 -0
  180. data/lib/page-object/platforms/selenium_webdriver/file_field.rb +16 -0
  181. data/lib/page-object/platforms/selenium_webdriver/form.rb +16 -0
  182. data/lib/page-object/platforms/selenium_webdriver/image.rb +28 -0
  183. data/lib/page-object/platforms/selenium_webdriver/label.rb +17 -0
  184. data/lib/page-object/platforms/selenium_webdriver/link.rb +23 -0
  185. data/lib/page-object/platforms/selenium_webdriver/ordered_list.rb +39 -0
  186. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +1136 -0
  187. data/lib/page-object/platforms/selenium_webdriver/radio_button.rb +22 -0
  188. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +93 -0
  189. data/lib/page-object/platforms/selenium_webdriver/surrogate_selenium_element.rb +42 -0
  190. data/lib/page-object/platforms/selenium_webdriver/table.rb +42 -0
  191. data/lib/page-object/platforms/selenium_webdriver/table_row.rb +43 -0
  192. data/lib/page-object/platforms/selenium_webdriver/text_area.rb +17 -0
  193. data/lib/page-object/platforms/selenium_webdriver/text_field.rb +17 -0
  194. data/lib/page-object/platforms/selenium_webdriver/unordered_list.rb +39 -0
  195. data/lib/page-object/platforms/selenium_webdriver.rb +18 -0
  196. data/lib/page-object/platforms/watir_webdriver/check_box.rb +29 -0
  197. data/lib/page-object/platforms/watir_webdriver/element.rb +249 -0
  198. data/lib/page-object/platforms/watir_webdriver/file_field.rb +16 -0
  199. data/lib/page-object/platforms/watir_webdriver/form.rb +16 -0
  200. data/lib/page-object/platforms/watir_webdriver/image.rb +22 -0
  201. data/lib/page-object/platforms/watir_webdriver/label.rb +17 -0
  202. data/lib/page-object/platforms/watir_webdriver/link.rb +15 -0
  203. data/lib/page-object/platforms/watir_webdriver/ordered_list.rb +35 -0
  204. data/lib/page-object/platforms/watir_webdriver/page_object.rb +1029 -0
  205. data/lib/page-object/platforms/watir_webdriver/radio_button.rb +22 -0
  206. data/lib/page-object/platforms/watir_webdriver/select_list.rb +74 -0
  207. data/lib/page-object/platforms/watir_webdriver/table.rb +38 -0
  208. data/lib/page-object/platforms/watir_webdriver/table_row.rb +37 -0
  209. data/lib/page-object/platforms/watir_webdriver/text_area.rb +23 -0
  210. data/lib/page-object/platforms/watir_webdriver/text_field.rb +16 -0
  211. data/lib/page-object/platforms/watir_webdriver/unordered_list.rb +36 -0
  212. data/lib/page-object/platforms/watir_webdriver.rb +18 -0
  213. data/lib/page-object/platforms.rb +18 -0
  214. data/lib/page-object/version.rb +4 -0
  215. data/lib/page-object/widgets.rb +133 -0
  216. data/lib/page-object.rb +408 -0
  217. data/meeane-page-object.gemspec +32 -0
  218. data/pageobject.gems +1 -0
  219. data/spec/page-object/element_locators_spec.rb +1065 -0
  220. data/spec/page-object/elements/area_spec.rb +45 -0
  221. data/spec/page-object/elements/button_spec.rb +50 -0
  222. data/spec/page-object/elements/canvas_spec.rb +40 -0
  223. data/spec/page-object/elements/check_box_spec.rb +49 -0
  224. data/spec/page-object/elements/div_spec.rb +28 -0
  225. data/spec/page-object/elements/element_spec.rb +114 -0
  226. data/spec/page-object/elements/file_field_spec.rb +39 -0
  227. data/spec/page-object/elements/form_spec.rb +28 -0
  228. data/spec/page-object/elements/heading_spec.rb +48 -0
  229. data/spec/page-object/elements/hidden_field_spec.rb +28 -0
  230. data/spec/page-object/elements/image_spec.rb +66 -0
  231. data/spec/page-object/elements/label_spec.rb +29 -0
  232. data/spec/page-object/elements/link_spec.rb +49 -0
  233. data/spec/page-object/elements/list_item_spec.rb +28 -0
  234. data/spec/page-object/elements/nested_element_spec.rb +254 -0
  235. data/spec/page-object/elements/option_spec.rb +11 -0
  236. data/spec/page-object/elements/ordered_list_spec.rb +94 -0
  237. data/spec/page-object/elements/paragraph_spec.rb +28 -0
  238. data/spec/page-object/elements/select_list_spec.rb +142 -0
  239. data/spec/page-object/elements/selenium/radio_button_spec.rb +44 -0
  240. data/spec/page-object/elements/selenium/text_field_spec.rb +49 -0
  241. data/spec/page-object/elements/selenium_element_spec.rb +172 -0
  242. data/spec/page-object/elements/span_spec.rb +26 -0
  243. data/spec/page-object/elements/table_cell_spec.rb +21 -0
  244. data/spec/page-object/elements/table_row_spec.rb +70 -0
  245. data/spec/page-object/elements/table_spec.rb +98 -0
  246. data/spec/page-object/elements/text_area_spec.rb +39 -0
  247. data/spec/page-object/elements/unordered_list_spec.rb +95 -0
  248. data/spec/page-object/elements/watir_element_spec.rb +142 -0
  249. data/spec/page-object/javascript_framework_facade_spec.rb +61 -0
  250. data/spec/page-object/loads_platform_spec.rb +53 -0
  251. data/spec/page-object/page-object_spec.rb +405 -0
  252. data/spec/page-object/page_factory_spec.rb +256 -0
  253. data/spec/page-object/page_populator_spec.rb +122 -0
  254. data/spec/page-object/platforms/selenium_webdriver/selenium_page_object_spec.rb +68 -0
  255. data/spec/page-object/platforms/selenium_webdriver_spec.rb +29 -0
  256. data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +29 -0
  257. data/spec/page-object/platforms/watir_webdriver_spec.rb +9 -0
  258. data/spec/page-object/selenium_accessors_spec.rb +589 -0
  259. data/spec/page-object/watir_accessors_spec.rb +1107 -0
  260. data/spec/page-object/widget_spec.rb +226 -0
  261. data/spec/spec_helper.rb +44 -0
  262. metadata +404 -0
@@ -0,0 +1,22 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+ module RadioButton
5
+
6
+ #
7
+ # select the radiobutton
8
+ #
9
+ def select
10
+ element.set
11
+ end
12
+
13
+ #
14
+ # return if it is selected
15
+ #
16
+ def selected?
17
+ element.set?
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,74 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+ module SelectList
5
+
6
+ #
7
+ # Return the PageObject::Elements::Option for the index provided. Index
8
+ # is zero based.
9
+ #
10
+ # @return [PageObject::Elements::Option]
11
+ #
12
+ def [](idx)
13
+ options[idx]
14
+ end
15
+
16
+ #
17
+ # Select a value from the list
18
+ #
19
+ def select(value)
20
+ element.select(value)
21
+ end
22
+
23
+ #
24
+ # Select the option(s) whose value attribute matches the given
25
+ # string
26
+ #
27
+ def select_value(value)
28
+ element.select_value(value)
29
+ end
30
+
31
+ #
32
+ # Return an array of Options contained in the select list.
33
+ #
34
+ # @return [array of PageObject::Elements::Option]
35
+ #
36
+ def options
37
+ element.options.map { |e| ::PageObject::Elements::Option.new(e, :platform => :watir_webdriver) }
38
+ end
39
+
40
+ #
41
+ # @return [Array<String>] An array of strings representing the text of the currently selected options.
42
+ #
43
+ def selected_options
44
+ element.selected_options.map { |e| e.text }.compact
45
+ end
46
+
47
+ #
48
+ # @return [Array<String>] An array of strings representing the value of the currently selected options.
49
+ #
50
+ def selected_values
51
+ element.selected_options.map { |e| e.value }.compact
52
+ end
53
+
54
+ #
55
+ # Returns true if the select list has one or more options where text or label matches the given value.
56
+ #
57
+ # @param [String, Regexp] value A value.
58
+ # @return [Boolean]
59
+ def include?(value)
60
+ element.include? value
61
+ end
62
+
63
+ #
64
+ # Returns true if any of the selected options' text or label match the given value.
65
+ #
66
+ # @param [String, Regexp] value A value.
67
+ # @return [Boolean]
68
+ def selected?(value)
69
+ element.selected? value
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,38 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+
5
+ module Table
6
+
7
+ #
8
+ # Return the PageObject::Elements::TableRow for the index provided. Index
9
+ # is zero based. If the index provided is a String then it
10
+ # will be matched with the text from any column. The text can be a substring of the full column text.
11
+ #
12
+ # @return [PageObject::Elements::TableRow]
13
+ #
14
+ def [](idx)
15
+ idx = find_index_by_title(idx) if idx.kind_of?(String)
16
+ return nil unless idx
17
+ initialize_row(element[idx], :platform => :watir_webdriver)
18
+ end
19
+
20
+ #
21
+ # Returns the number of rows in the table.
22
+ #
23
+ def rows
24
+ element.wd.find_elements(:xpath, child_xpath).size
25
+ end
26
+
27
+ private
28
+
29
+ def find_index_by_title(row_title)
30
+ element.rows.find_index do |row|
31
+ row.cells.any? { |col| col.text.include? row_title }
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+ module TableRow
5
+
6
+ #
7
+ # Return the PageObject::Elements::TableCell for the index provided. Index
8
+ # is zero based. If the index provided is a String then it
9
+ # will be matched with the text from the columns in the first row.
10
+ # The text can be a substring of the full column text.
11
+ #
12
+ def [](idx)
13
+ idx = find_index_by_title(idx) if idx.kind_of?(String)
14
+ return nil unless idx && columns >= idx + 1
15
+ initialize_cell(element[idx], :platform => :watir_webdriver)
16
+ end
17
+
18
+ #
19
+ # Returns the number of columns in the table.
20
+ #
21
+ def columns
22
+ element.wd.find_elements(:xpath, child_xpath).size
23
+ end
24
+
25
+ private
26
+
27
+ def find_index_by_title(title)
28
+ table = element.parent
29
+ table = table.parent if table.tag_name == 'tbody'
30
+ first_row = table[0]
31
+ first_row.cells.find_index {|column| column.text.include? title }
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,23 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+
5
+ module TextArea
6
+
7
+ #
8
+ # Set the value of the TextArea
9
+ #
10
+ def value=(new_value)
11
+ element.set(new_value)
12
+ end
13
+
14
+ #
15
+ # Clear the TextArea
16
+ #
17
+ def clear
18
+ element.wd.clear
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+
5
+ module TextField
6
+
7
+ #
8
+ # Set the value of the TextField
9
+ #
10
+ def value=(new_value)
11
+ element.set(new_value)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+ module UnorderedList
5
+
6
+ #
7
+ # Return the PageObject::Elements::ListItem for the index provided. Index
8
+ # is zero based.
9
+ #
10
+ # @return [PageObject::Elements::ListItem]
11
+ #
12
+ def [](idx)
13
+ Object::PageObject::Elements::ListItem.new(children[idx], :platform => :watir_webdriver)
14
+ end
15
+
16
+ #
17
+ # Return the number of items contained in the unordered list
18
+ #
19
+ def items
20
+ children.size
21
+ end
22
+
23
+ private
24
+
25
+ def children
26
+ list_items.find_all { |item| item.parent == element }
27
+ end
28
+
29
+ def list_items
30
+ element.uls(:xpath => child_xpath)
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ module PageObject
2
+ module Platforms
3
+ module WatirWebDriver
4
+
5
+ def self.create_page_object(browser)
6
+ require 'page-object/platforms/watir_webdriver/page_object'
7
+ return WatirWebDriver::PageObject.new(browser)
8
+ end
9
+
10
+ def self.is_for?(browser)
11
+ require 'watir-webdriver'
12
+ browser.is_a?(::Watir::Browser)
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ PageObject::Platforms.register(:watir_webdriver, PageObject::Platforms::WatirWebDriver)
@@ -0,0 +1,18 @@
1
+ require 'page-object/loads_platform'
2
+
3
+ module PageObject
4
+ module Platforms
5
+ @@adapters = {}
6
+
7
+ def self.get
8
+ @@adapters
9
+ end
10
+
11
+ def self.register(key, adapter)
12
+ @@adapters[key] = adapter
13
+ end
14
+ end
15
+ end
16
+ require 'page-object/platforms/watir_webdriver'
17
+ require 'page-object/platforms/selenium_webdriver'
18
+
@@ -0,0 +1,4 @@
1
+ module PageObject
2
+ # @private
3
+ VERSION = "0.1.8"
4
+ end
@@ -0,0 +1,133 @@
1
+ require 'page-object/elements'
2
+ require 'page-object/platforms/selenium_webdriver/page_object'
3
+ require 'page-object/platforms/watir_webdriver/page_object'
4
+
5
+ module PageObject
6
+ module Widgets
7
+
8
+ #
9
+ # Module that allows for the registration of widget classes which extend the functionality of PageObject
10
+ # Allows any classes which extend PageObject::Element to be used as PageObject elements.
11
+ # This allows such widgets to be created using the defined tags.
12
+ #
13
+ # @param [Symbol] defines the symbol which will be used as an accessor name.
14
+ # @param [Class] the widget class extending PageObject::Elements::Element
15
+ # @param [Symbol] the symbol of the html element used when searching for this widget.
16
+ #
17
+ #
18
+ def self.register_widget(widget_tag, widget_class, base_element_tag)
19
+ if widget_class.ancestors.include? Elements::Element
20
+ define_accessors(Accessors, widget_tag, widget_class)
21
+ define_nested_elements(Elements::Element, widget_tag)
22
+ define_locators(PageObject, widget_tag)
23
+ define_selenium_accessors(Platforms::SeleniumWebDriver::PageObject, widget_tag, widget_class, base_element_tag)
24
+ define_watir_accessors(Platforms::WatirWebDriver::PageObject, widget_tag, widget_class, base_element_tag)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def self.define_accessors(base, widget_tag, widget_class)
31
+ accessors_module = Module.new do
32
+ define_method widget_tag do |name, *identifier_args, &block|
33
+
34
+ identifier = identifier_args.first
35
+ identifier = {:index => 0} if identifier.nil?
36
+
37
+ define_method("#{name}_element") do
38
+ return call_block(&block) if block
39
+ platform.send("#{widget_tag}_for", identifier.clone)
40
+ end
41
+ define_method("#{name}?") do
42
+ return call_block(&block).exists? if block
43
+ platform.send("#{widget_tag}_for", identifier.clone).exists?
44
+ end
45
+ if widget_class.respond_to? :accessor_methods
46
+ widget_class.accessor_methods(self, name)
47
+ end
48
+ end
49
+ define_method widget_class.plural_form do |name, *identifier_args, &block|
50
+ define_method("#{name}_elements") do
51
+ return call_block(&block) unless block.nil?
52
+ platform_method = "#{widget_tag.to_s}s_for"
53
+ platform.send platform_method, (identifier_args.first ? identifier_args.first.clone : {})
54
+ end
55
+ end
56
+ end
57
+
58
+ base.send(:include, accessors_module)
59
+ end
60
+
61
+ def self.define_watir_accessors(base, widget_tag, widget_class, base_element_tag)
62
+ define_singular_watir_accessor(base, base_element_tag, widget_class, widget_tag)
63
+ define_multiple_watir_accessor(base, base_element_tag, widget_class, widget_tag)
64
+ end
65
+
66
+ def self.define_multiple_watir_accessor(base, base_element_tag, widget_class, widget_tag)
67
+ base.send(:define_method, "#{widget_tag}s_for") do |identifier|
68
+ find_watir_elements("#{base_element_tag}s(identifier)", widget_class, identifier, base_element_tag)
69
+ end
70
+ end
71
+
72
+ def self.define_singular_watir_accessor(base, base_element_tag, widget_class, widget_tag)
73
+ base.send(:define_method, "#{widget_tag}_for") do |identifier|
74
+ find_watir_element("#{base_element_tag}(identifier)", widget_class, identifier, base_element_tag)
75
+ end
76
+ end
77
+
78
+ def self.define_selenium_accessors(base, widget_tag, widget_class, base_element_tag)
79
+ define_singular_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
80
+ define_multiple_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
81
+ end
82
+
83
+ def self.define_multiple_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
84
+ base.send(:define_method, "#{widget_tag}s_for") do |identifier|
85
+ find_selenium_elements(identifier, widget_class, base_element_tag)
86
+ end
87
+ end
88
+
89
+ def self.define_singular_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
90
+ base.send(:define_method, "#{widget_tag}_for") do |identifier|
91
+ find_selenium_element(identifier, widget_class, base_element_tag)
92
+ end
93
+ end
94
+
95
+ def self.define_nested_elements(base, widget_tag)
96
+ define_singular_nested_accessor(base, widget_tag)
97
+ define_multiple_nested_accessor(base, widget_tag)
98
+ end
99
+
100
+ def self.define_multiple_nested_accessor(base, widget_tag)
101
+ base.send(:define_method, "#{widget_tag}_elements") do |*args|
102
+ identifier = args[0] ? args[0] : {:index => 0}
103
+ @platform.send("#{widget_tag}s_for", identifier.clone)
104
+ end
105
+ end
106
+
107
+ def self.define_singular_nested_accessor(base, widget_tag)
108
+ base.send(:define_method, "#{widget_tag}_element") do |*args|
109
+ identifier = args[0] ? args[0] : {:index => 0}
110
+ @platform.send("#{widget_tag}_for", identifier.clone)
111
+ end
112
+ end
113
+
114
+ def self.define_locators(base, widget_tag)
115
+ define_singular_locator(base, widget_tag)
116
+ define_multiple_locator(base, widget_tag)
117
+ end
118
+
119
+ def self.define_multiple_locator(base, widget_tag)
120
+ base.send(:define_method, "#{widget_tag}_elements") do |*args|
121
+ identifier = args[0] ? args[0] : {}
122
+ platform.send("#{widget_tag}s_for", identifier.clone)
123
+ end
124
+ end
125
+
126
+ def self.define_singular_locator(base, widget_tag)
127
+ base.send(:define_method, "#{widget_tag}_element") do |*args|
128
+ identifier = args[0] ? args[0] : {:index => 0}
129
+ platform.send("#{widget_tag}_for", identifier.clone)
130
+ end
131
+ end
132
+ end
133
+ end