page-object-lds 0.0.1

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 (281) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -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 +799 -0
  8. data/Gemfile +13 -0
  9. data/Guardfile +20 -0
  10. data/LICENSE +20 -0
  11. data/README.md +111 -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/bold.feature +21 -0
  18. data/features/button.feature +88 -0
  19. data/features/canvas.feature +37 -0
  20. data/features/check_box.feature +55 -0
  21. data/features/div.feature +45 -0
  22. data/features/element.feature +322 -0
  23. data/features/file_field.feature +40 -0
  24. data/features/form.feature +43 -0
  25. data/features/frames.feature +75 -0
  26. data/features/generic_elements.feature +29 -0
  27. data/features/gxt_table_extension.feature +24 -0
  28. data/features/headings.feature +97 -0
  29. data/features/hidden_field.feature +45 -0
  30. data/features/html/04-Death_Becomes_Fur.mp4 +0 -0
  31. data/features/html/04-Death_Becomes_Fur.oga +0 -0
  32. data/features/html/async.html +36 -0
  33. data/features/html/double_click.html +13 -0
  34. data/features/html/failure.html +8 -0
  35. data/features/html/frame_1.html +18 -0
  36. data/features/html/frame_2.html +16 -0
  37. data/features/html/frame_3.html +14 -0
  38. data/features/html/frames.html +12 -0
  39. data/features/html/hover.html +12 -0
  40. data/features/html/iframes.html +12 -0
  41. data/features/html/images/circle.png +0 -0
  42. data/features/html/images/img_pulpit.jpg +0 -0
  43. data/features/html/images/submit.gif +0 -0
  44. data/features/html/indexed_property.html +52 -0
  45. data/features/html/modal.html +17 -0
  46. data/features/html/modal_1.html +38 -0
  47. data/features/html/modal_2.html +27 -0
  48. data/features/html/movie.mp4 +0 -0
  49. data/features/html/movie.ogg +0 -0
  50. data/features/html/multi_elements.html +144 -0
  51. data/features/html/nested_elements.html +77 -0
  52. data/features/html/nested_frame_1.html +1 -0
  53. data/features/html/nested_frame_2.html +11 -0
  54. data/features/html/nested_frame_3.html +14 -0
  55. data/features/html/nested_frames.html +10 -0
  56. data/features/html/planets.gif +0 -0
  57. data/features/html/static_elements.html +205 -0
  58. data/features/html/success.html +8 -0
  59. data/features/html/sun.gif +0 -0
  60. data/features/html/sun.html +7 -0
  61. data/features/image.feature +50 -0
  62. data/features/indexed_property.feature +98 -0
  63. data/features/javascript.feature +28 -0
  64. data/features/label.feature +46 -0
  65. data/features/link.feature +52 -0
  66. data/features/list_item.feature +36 -0
  67. data/features/modal_dialog.feature +15 -0
  68. data/features/multi_elements.feature +492 -0
  69. data/features/nested_elements.feature +117 -0
  70. data/features/ordered_list.feature +56 -0
  71. data/features/page_level_actions.feature +90 -0
  72. data/features/paragraph.feature +35 -0
  73. data/features/radio_button.feature +58 -0
  74. data/features/radio_button_group.feature +29 -0
  75. data/features/sample-app/public/jquery-1.3.2.js +4376 -0
  76. data/features/sample-app/public/jquery.html +30 -0
  77. data/features/sample-app/public/prototype-1.6.0.3.js +4320 -0
  78. data/features/sample-app/public/prototype.html +35 -0
  79. data/features/sample-app/sample_app.rb +35 -0
  80. data/features/select_list.feature +86 -0
  81. data/features/span.feature +37 -0
  82. data/features/step_definitions/accessor_steps.rb +60 -0
  83. data/features/step_definitions/area_steps.rb +19 -0
  84. data/features/step_definitions/async_steps.rb +83 -0
  85. data/features/step_definitions/audio_steps.rb +27 -0
  86. data/features/step_definitions/bold_steps.rb +12 -0
  87. data/features/step_definitions/button_steps.rb +43 -0
  88. data/features/step_definitions/canvas_steps.rb +15 -0
  89. data/features/step_definitions/check_box_steps.rb +35 -0
  90. data/features/step_definitions/div_steps.rb +19 -0
  91. data/features/step_definitions/element_steps.rb +266 -0
  92. data/features/step_definitions/file_field_steps.rb +19 -0
  93. data/features/step_definitions/form_steps.rb +19 -0
  94. data/features/step_definitions/frames_steps.rb +159 -0
  95. data/features/step_definitions/generic_element_steps.rb +31 -0
  96. data/features/step_definitions/gxt_table_steps.rb +58 -0
  97. data/features/step_definitions/headings_steps.rb +12 -0
  98. data/features/step_definitions/hidden_field_steps.rb +27 -0
  99. data/features/step_definitions/image_steps.rb +27 -0
  100. data/features/step_definitions/indexed_property_steps.rb +129 -0
  101. data/features/step_definitions/javascript_steps.rb +53 -0
  102. data/features/step_definitions/label_steps.rb +19 -0
  103. data/features/step_definitions/link_steps.rb +40 -0
  104. data/features/step_definitions/list_item_steps.rb +19 -0
  105. data/features/step_definitions/modal_dialog_steps.rb +62 -0
  106. data/features/step_definitions/multi_elements_steps.rb +541 -0
  107. data/features/step_definitions/nested_elements_steps.rb +212 -0
  108. data/features/step_definitions/ordered_list_steps.rb +23 -0
  109. data/features/step_definitions/page_level_actions_steps.rb +135 -0
  110. data/features/step_definitions/page_traversal_steps.rb +4 -0
  111. data/features/step_definitions/paragraph_steps.rb +28 -0
  112. data/features/step_definitions/radio_button_group_steps.rb +36 -0
  113. data/features/step_definitions/radio_button_steps.rb +27 -0
  114. data/features/step_definitions/select_list_steps.rb +65 -0
  115. data/features/step_definitions/span_steps.rb +19 -0
  116. data/features/step_definitions/table_cell_steps.rb +15 -0
  117. data/features/step_definitions/table_steps.rb +70 -0
  118. data/features/step_definitions/text_area_steps.rb +35 -0
  119. data/features/step_definitions/text_field_steps.rb +35 -0
  120. data/features/step_definitions/unordered_list_steps.rb +23 -0
  121. data/features/step_definitions/video_steps.rb +45 -0
  122. data/features/support/ajax_text_environment.rb +26 -0
  123. data/features/support/env.rb +8 -0
  124. data/features/support/hooks.rb +8 -0
  125. data/features/support/page.rb +373 -0
  126. data/features/support/persistent_browser.rb +70 -0
  127. data/features/support/targets/firefox14_osx.rb +6 -0
  128. data/features/support/targets/firefox14_windows7.rb +6 -0
  129. data/features/support/url_helper.rb +57 -0
  130. data/features/table.feature +122 -0
  131. data/features/table_cell.feature +45 -0
  132. data/features/text_area.feature +51 -0
  133. data/features/text_field.feature +70 -0
  134. data/features/unordered_list.feature +56 -0
  135. data/features/video.feature +73 -0
  136. data/lib/page-object-lds.rb +421 -0
  137. data/lib/page-object/accessors.rb +1334 -0
  138. data/lib/page-object/core_ext/string.rb +5 -0
  139. data/lib/page-object/element_locators.rb +21 -0
  140. data/lib/page-object/elements/area.rb +31 -0
  141. data/lib/page-object/elements/audio.rb +9 -0
  142. data/lib/page-object/elements/bold.rb +11 -0
  143. data/lib/page-object/elements/button.rb +35 -0
  144. data/lib/page-object/elements/canvas.rb +23 -0
  145. data/lib/page-object/elements/check_box.rb +40 -0
  146. data/lib/page-object/elements/div.rb +19 -0
  147. data/lib/page-object/elements/element.rb +225 -0
  148. data/lib/page-object/elements/file_field.rb +41 -0
  149. data/lib/page-object/elements/form.rb +39 -0
  150. data/lib/page-object/elements/heading.rb +15 -0
  151. data/lib/page-object/elements/hidden_field.rb +22 -0
  152. data/lib/page-object/elements/image.rb +39 -0
  153. data/lib/page-object/elements/label.rb +19 -0
  154. data/lib/page-object/elements/link.rb +49 -0
  155. data/lib/page-object/elements/list_item.rb +19 -0
  156. data/lib/page-object/elements/media.rb +45 -0
  157. data/lib/page-object/elements/option.rb +10 -0
  158. data/lib/page-object/elements/ordered_list.rb +53 -0
  159. data/lib/page-object/elements/paragraph.rb +9 -0
  160. data/lib/page-object/elements/radio_button.rb +40 -0
  161. data/lib/page-object/elements/select_list.rb +45 -0
  162. data/lib/page-object/elements/span.rb +19 -0
  163. data/lib/page-object/elements/table.rb +82 -0
  164. data/lib/page-object/elements/table_cell.rb +28 -0
  165. data/lib/page-object/elements/table_row.rb +53 -0
  166. data/lib/page-object/elements/text_area.rb +41 -0
  167. data/lib/page-object/elements/text_field.rb +45 -0
  168. data/lib/page-object/elements/unordered_list.rb +54 -0
  169. data/lib/page-object/elements/video.rb +18 -0
  170. data/lib/page-object/indexed_properties.rb +36 -0
  171. data/lib/page-object/javascript/angularjs.rb +14 -0
  172. data/lib/page-object/javascript/jquery.rb +14 -0
  173. data/lib/page-object/javascript/prototype.rb +14 -0
  174. data/lib/page-object/javascript/yui.rb +19 -0
  175. data/lib/page-object/javascript_framework_facade.rb +80 -0
  176. data/lib/page-object/loads_platform.rb +26 -0
  177. data/lib/page-object/locator_generator.rb +130 -0
  178. data/lib/page-object/nested_elements.rb +17 -0
  179. data/lib/page-object/page_factory.rb +108 -0
  180. data/lib/page-object/page_populator.rb +83 -0
  181. data/lib/page-object/platforms.rb +19 -0
  182. data/lib/page-object/platforms/lds_watir_webdriver.rb +17 -0
  183. data/lib/page-object/platforms/lds_watir_webdriver/check_box.rb +29 -0
  184. data/lib/page-object/platforms/lds_watir_webdriver/element.rb +249 -0
  185. data/lib/page-object/platforms/lds_watir_webdriver/file_field.rb +16 -0
  186. data/lib/page-object/platforms/lds_watir_webdriver/form.rb +16 -0
  187. data/lib/page-object/platforms/lds_watir_webdriver/image.rb +22 -0
  188. data/lib/page-object/platforms/lds_watir_webdriver/link.rb +15 -0
  189. data/lib/page-object/platforms/lds_watir_webdriver/ordered_list.rb +35 -0
  190. data/lib/page-object/platforms/lds_watir_webdriver/page_object.rb +1044 -0
  191. data/lib/page-object/platforms/lds_watir_webdriver/radio_button.rb +22 -0
  192. data/lib/page-object/platforms/lds_watir_webdriver/select_list.rb +74 -0
  193. data/lib/page-object/platforms/lds_watir_webdriver/table.rb +38 -0
  194. data/lib/page-object/platforms/lds_watir_webdriver/table_row.rb +37 -0
  195. data/lib/page-object/platforms/lds_watir_webdriver/text_area.rb +23 -0
  196. data/lib/page-object/platforms/lds_watir_webdriver/text_field.rb +16 -0
  197. data/lib/page-object/platforms/lds_watir_webdriver/unordered_list.rb +36 -0
  198. data/lib/page-object/platforms/selenium_webdriver.rb +17 -0
  199. data/lib/page-object/platforms/selenium_webdriver/button.rb +15 -0
  200. data/lib/page-object/platforms/selenium_webdriver/check_box.rb +29 -0
  201. data/lib/page-object/platforms/selenium_webdriver/element.rb +291 -0
  202. data/lib/page-object/platforms/selenium_webdriver/file_field.rb +16 -0
  203. data/lib/page-object/platforms/selenium_webdriver/form.rb +16 -0
  204. data/lib/page-object/platforms/selenium_webdriver/image.rb +28 -0
  205. data/lib/page-object/platforms/selenium_webdriver/link.rb +23 -0
  206. data/lib/page-object/platforms/selenium_webdriver/ordered_list.rb +39 -0
  207. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +1162 -0
  208. data/lib/page-object/platforms/selenium_webdriver/radio_button.rb +22 -0
  209. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +93 -0
  210. data/lib/page-object/platforms/selenium_webdriver/surrogate_selenium_element.rb +42 -0
  211. data/lib/page-object/platforms/selenium_webdriver/table.rb +42 -0
  212. data/lib/page-object/platforms/selenium_webdriver/table_row.rb +43 -0
  213. data/lib/page-object/platforms/selenium_webdriver/text_area.rb +17 -0
  214. data/lib/page-object/platforms/selenium_webdriver/text_field.rb +17 -0
  215. data/lib/page-object/platforms/selenium_webdriver/unordered_list.rb +39 -0
  216. data/lib/page-object/platforms/watir_webdriver.rb +17 -0
  217. data/lib/page-object/platforms/watir_webdriver/check_box.rb +29 -0
  218. data/lib/page-object/platforms/watir_webdriver/element.rb +249 -0
  219. data/lib/page-object/platforms/watir_webdriver/file_field.rb +16 -0
  220. data/lib/page-object/platforms/watir_webdriver/form.rb +16 -0
  221. data/lib/page-object/platforms/watir_webdriver/image.rb +22 -0
  222. data/lib/page-object/platforms/watir_webdriver/link.rb +15 -0
  223. data/lib/page-object/platforms/watir_webdriver/ordered_list.rb +35 -0
  224. data/lib/page-object/platforms/watir_webdriver/page_object.rb +1044 -0
  225. data/lib/page-object/platforms/watir_webdriver/radio_button.rb +22 -0
  226. data/lib/page-object/platforms/watir_webdriver/select_list.rb +74 -0
  227. data/lib/page-object/platforms/watir_webdriver/table.rb +38 -0
  228. data/lib/page-object/platforms/watir_webdriver/table_row.rb +37 -0
  229. data/lib/page-object/platforms/watir_webdriver/text_area.rb +23 -0
  230. data/lib/page-object/platforms/watir_webdriver/text_field.rb +16 -0
  231. data/lib/page-object/platforms/watir_webdriver/unordered_list.rb +36 -0
  232. data/lib/page-object/version.rb +4 -0
  233. data/lib/page-object/widgets.rb +134 -0
  234. data/page-object-lds.gemspec +33 -0
  235. data/pageobject.gems +1 -0
  236. data/spec/page-object/accessors_spec.rb +40 -0
  237. data/spec/page-object/element_locators_spec.rb +1100 -0
  238. data/spec/page-object/elements/area_spec.rb +45 -0
  239. data/spec/page-object/elements/bold_spec.rb +29 -0
  240. data/spec/page-object/elements/button_spec.rb +50 -0
  241. data/spec/page-object/elements/canvas_spec.rb +40 -0
  242. data/spec/page-object/elements/check_box_spec.rb +49 -0
  243. data/spec/page-object/elements/div_spec.rb +28 -0
  244. data/spec/page-object/elements/element_spec.rb +114 -0
  245. data/spec/page-object/elements/file_field_spec.rb +39 -0
  246. data/spec/page-object/elements/form_spec.rb +28 -0
  247. data/spec/page-object/elements/heading_spec.rb +48 -0
  248. data/spec/page-object/elements/hidden_field_spec.rb +28 -0
  249. data/spec/page-object/elements/image_spec.rb +66 -0
  250. data/spec/page-object/elements/label_spec.rb +29 -0
  251. data/spec/page-object/elements/link_spec.rb +49 -0
  252. data/spec/page-object/elements/list_item_spec.rb +29 -0
  253. data/spec/page-object/elements/nested_element_spec.rb +254 -0
  254. data/spec/page-object/elements/option_spec.rb +11 -0
  255. data/spec/page-object/elements/ordered_list_spec.rb +94 -0
  256. data/spec/page-object/elements/paragraph_spec.rb +27 -0
  257. data/spec/page-object/elements/select_list_spec.rb +142 -0
  258. data/spec/page-object/elements/selenium/radio_button_spec.rb +44 -0
  259. data/spec/page-object/elements/selenium/text_field_spec.rb +49 -0
  260. data/spec/page-object/elements/selenium_element_spec.rb +172 -0
  261. data/spec/page-object/elements/span_spec.rb +26 -0
  262. data/spec/page-object/elements/table_cell_spec.rb +21 -0
  263. data/spec/page-object/elements/table_row_spec.rb +70 -0
  264. data/spec/page-object/elements/table_spec.rb +98 -0
  265. data/spec/page-object/elements/text_area_spec.rb +39 -0
  266. data/spec/page-object/elements/unordered_list_spec.rb +94 -0
  267. data/spec/page-object/elements/watir_element_spec.rb +141 -0
  268. data/spec/page-object/javascript_framework_facade_spec.rb +61 -0
  269. data/spec/page-object/loads_platform_spec.rb +53 -0
  270. data/spec/page-object/page-object_spec.rb +413 -0
  271. data/spec/page-object/page_factory_spec.rb +238 -0
  272. data/spec/page-object/page_populator_spec.rb +122 -0
  273. data/spec/page-object/platforms/selenium_webdriver/selenium_page_object_spec.rb +68 -0
  274. data/spec/page-object/platforms/selenium_webdriver_spec.rb +29 -0
  275. data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +29 -0
  276. data/spec/page-object/platforms/watir_webdriver_spec.rb +9 -0
  277. data/spec/page-object/selenium_accessors_spec.rb +609 -0
  278. data/spec/page-object/watir_accessors_spec.rb +1134 -0
  279. data/spec/page-object/widget_spec.rb +226 -0
  280. data/spec/spec_helper.rb +44 -0
  281. metadata +430 -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,4 @@
1
+ module PageObject
2
+ # @private
3
+ VERSION = "0.0.1"
4
+ end
@@ -0,0 +1,134 @@
1
+ require 'page-object/elements'
2
+ require 'page-object/platforms/selenium_webdriver/page_object'
3
+ require 'page-object/platforms/watir_webdriver/page_object'
4
+ require 'page-object/platforms/lds_watir_webdriver/page_object'
5
+
6
+ module PageObject
7
+ module Widgets
8
+
9
+ #
10
+ # Module that allows for the registration of widget classes which extend the functionality of PageObject
11
+ # Allows any classes which extend PageObject::Element to be used as PageObject elements.
12
+ # This allows such widgets to be created using the defined tags.
13
+ #
14
+ # @param [Symbol] defines the symbol which will be used as an accessor name.
15
+ # @param [Class] the widget class extending PageObject::Elements::Element
16
+ # @param [Symbol] the symbol of the html element used when searching for this widget.
17
+ #
18
+ #
19
+ def self.register_widget(widget_tag, widget_class, base_element_tag)
20
+ if widget_class.ancestors.include? Elements::Element
21
+ define_accessors(Accessors, widget_tag, widget_class)
22
+ define_nested_elements(Elements::Element, widget_tag)
23
+ define_locators(PageObject, widget_tag)
24
+ define_selenium_accessors(Platforms::SeleniumWebDriver::PageObject, widget_tag, widget_class, base_element_tag)
25
+ define_watir_accessors(Platforms::WatirWebDriver::PageObject, widget_tag, widget_class, base_element_tag)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def self.define_accessors(base, widget_tag, widget_class)
32
+ accessors_module = Module.new do
33
+ define_method widget_tag do |name, *identifier_args, &block|
34
+
35
+ identifier = identifier_args.first
36
+ identifier = {:index => 0} if identifier.nil?
37
+
38
+ define_method("#{name}_element") do
39
+ return call_block(&block) if block
40
+ platform.send("#{widget_tag}_for", identifier.clone)
41
+ end
42
+ define_method("#{name}?") do
43
+ return call_block(&block).exists? if block
44
+ platform.send("#{widget_tag}_for", identifier.clone).exists?
45
+ end
46
+ if widget_class.respond_to? :accessor_methods
47
+ widget_class.accessor_methods(self, name)
48
+ end
49
+ end
50
+ define_method widget_class.plural_form do |name, *identifier_args, &block|
51
+ define_method("#{name}_elements") do
52
+ return call_block(&block) unless block.nil?
53
+ platform_method = "#{widget_tag.to_s}s_for"
54
+ platform.send platform_method, (identifier_args.first ? identifier_args.first.clone : {})
55
+ end
56
+ end
57
+ end
58
+
59
+ base.send(:include, accessors_module)
60
+ end
61
+
62
+ def self.define_watir_accessors(base, widget_tag, widget_class, base_element_tag)
63
+ define_singular_watir_accessor(base, base_element_tag, widget_class, widget_tag)
64
+ define_multiple_watir_accessor(base, base_element_tag, widget_class, widget_tag)
65
+ end
66
+
67
+ def self.define_multiple_watir_accessor(base, base_element_tag, widget_class, widget_tag)
68
+ base.send(:define_method, "#{widget_tag}s_for") do |identifier|
69
+ find_watir_elements("#{base_element_tag}s(identifier)", widget_class, identifier, base_element_tag)
70
+ end
71
+ end
72
+
73
+ def self.define_singular_watir_accessor(base, base_element_tag, widget_class, widget_tag)
74
+ base.send(:define_method, "#{widget_tag}_for") do |identifier|
75
+ find_watir_element("#{base_element_tag}(identifier)", widget_class, identifier, base_element_tag)
76
+ end
77
+ end
78
+
79
+ def self.define_selenium_accessors(base, widget_tag, widget_class, base_element_tag)
80
+ define_singular_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
81
+ define_multiple_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
82
+ end
83
+
84
+ def self.define_multiple_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
85
+ base.send(:define_method, "#{widget_tag}s_for") do |identifier|
86
+ find_selenium_elements(identifier, widget_class, base_element_tag)
87
+ end
88
+ end
89
+
90
+ def self.define_singular_selenium_accessor(base, base_element_tag, widget_class, widget_tag)
91
+ base.send(:define_method, "#{widget_tag}_for") do |identifier|
92
+ find_selenium_element(identifier, widget_class, base_element_tag)
93
+ end
94
+ end
95
+
96
+ def self.define_nested_elements(base, widget_tag)
97
+ define_singular_nested_accessor(base, widget_tag)
98
+ define_multiple_nested_accessor(base, widget_tag)
99
+ end
100
+
101
+ def self.define_multiple_nested_accessor(base, widget_tag)
102
+ base.send(:define_method, "#{widget_tag}_elements") do |*args|
103
+ identifier = args[0] ? args[0] : {:index => 0}
104
+ @platform.send("#{widget_tag}s_for", identifier.clone)
105
+ end
106
+ end
107
+
108
+ def self.define_singular_nested_accessor(base, widget_tag)
109
+ base.send(:define_method, "#{widget_tag}_element") do |*args|
110
+ identifier = args[0] ? args[0] : {:index => 0}
111
+ @platform.send("#{widget_tag}_for", identifier.clone)
112
+ end
113
+ end
114
+
115
+ def self.define_locators(base, widget_tag)
116
+ define_singular_locator(base, widget_tag)
117
+ define_multiple_locator(base, widget_tag)
118
+ end
119
+
120
+ def self.define_multiple_locator(base, widget_tag)
121
+ base.send(:define_method, "#{widget_tag}_elements") do |*args|
122
+ identifier = args[0] ? args[0] : {}
123
+ platform.send("#{widget_tag}s_for", identifier.clone)
124
+ end
125
+ end
126
+
127
+ def self.define_singular_locator(base, widget_tag)
128
+ base.send(:define_method, "#{widget_tag}_element") do |*args|
129
+ identifier = args[0] ? args[0] : {:index => 0}
130
+ platform.send("#{widget_tag}_for", identifier.clone)
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "page-object/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "page-object-lds"
7
+ s.version = PageObject::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Mehdi Taoufik Chaouachi"]
10
+ s.date = '2015-03-23'
11
+ s.email = ["mehditch@gmail.com"]
12
+ s.license = 'MIT'
13
+ s.homepage = "https://github.com/mehdic/page-object-lds"
14
+ s.summary = %q{Page Object DSL for browser testing}
15
+ s.description = %q{Page Object DSL that works with both Watir , Selenium and FWK360 LDS platform}
16
+
17
+ s.rubyforge_project = "page-object-lds"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+
24
+ s.add_dependency 'watir-webdriver', '>= 0.6.11'
25
+ s.add_dependency 'selenium-webdriver', '>= 2.44.0'
26
+ s.add_dependency 'page_navigation', '>= 0.9'
27
+
28
+ s.add_development_dependency 'rspec', '~> 3.1.0'
29
+ s.add_development_dependency 'cucumber', '>= 1.3.0'
30
+ s.add_development_dependency 'yard', '>= 0.7.2'
31
+ s.add_development_dependency 'rack', '>= 1.0'
32
+
33
+ end
data/pageobject.gems ADDED
@@ -0,0 +1 @@
1
+ bundler
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ class GenericPage
4
+ include PageObject
5
+
6
+ wait_for_expected_title 'expected title'
7
+ end
8
+
9
+ describe 'accessors' do
10
+ let(:browser) { mock_watir_browser }
11
+ let(:page) { GenericPage.new browser }
12
+
13
+ context '#wait_for_expected_title' do
14
+ before(:each) do
15
+ allow(browser).to receive(:wait_until).and_yield
16
+ end
17
+
18
+ it 'true if already there' do
19
+ allow(browser).to receive(:title).and_return 'expected title'
20
+ expect(page.wait_for_expected_title?).to be_truthy
21
+ end
22
+
23
+ it 'does not wait if it already is there' do
24
+ allow(browser).to receive(:title).and_return 'expected title'
25
+ expect(browser).to_not receive(:wait_until)
26
+
27
+ expect(page.wait_for_expected_title?).to be_truthy
28
+ end
29
+
30
+ it 'errors when it does not match' do
31
+ allow(browser).to receive(:title).and_return 'wrong title'
32
+ expect { page.wait_for_expected_title? }.to raise_error "Expected title 'expected title' instead of 'wrong title'"
33
+ end
34
+
35
+ it 'picks up when the title changes' do
36
+ allow(browser).to receive(:title).and_return 'wrong title', 'expected title'
37
+ expect(page.wait_for_expected_title?).to be_truthy
38
+ end
39
+ end
40
+ end