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 LdsWatirWebDriver
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 LdsWatirWebDriver
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 => :lds_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 LdsWatirWebDriver
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 => :lds_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 LdsWatirWebDriver
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 => :lds_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 LdsWatirWebDriver
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 LdsWatirWebDriver
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 LdsWatirWebDriver
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 => :lds_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,17 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumWebDriver
4
+
5
+ def self.create_page_object(browser)
6
+ SeleniumWebDriver::PageObject.new(browser)
7
+ end
8
+
9
+ def self.is_for?(browser)
10
+ require 'selenium-webdriver'
11
+ browser.is_a? ::Selenium::WebDriver::Driver
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ PageObject::Platforms.register(:selenium_webdriver, PageObject::Platforms::SeleniumWebDriver)
@@ -0,0 +1,15 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumWebDriver
4
+ module Button
5
+ #
6
+ # Override PageObject::PLatforms::SeleniumElement#text because
7
+ # #text does not reliably return a value in Selenium
8
+ #
9
+ def text
10
+ raise "text is not available on button element in Selenium"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumWebDriver
4
+ module CheckBox
5
+
6
+ #
7
+ # check the checkbox
8
+ #
9
+ def check
10
+ element.click unless element.selected?
11
+ end
12
+
13
+ #
14
+ # uncheck the checkbox
15
+ #
16
+ def uncheck
17
+ element.click if element.selected?
18
+ end
19
+
20
+ #
21
+ # return true if it is checked
22
+ #
23
+ def checked?
24
+ element.selected?
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,291 @@
1
+ require 'watir-webdriver/atoms'
2
+
3
+ module PageObject
4
+ module Platforms
5
+ #
6
+ # Selenium implementation of the common functionality found across all elements
7
+ #
8
+ module SeleniumWebDriver
9
+ module Element
10
+ include Watir::Atoms
11
+
12
+ #
13
+ # return true if an element is visible
14
+ #
15
+ def visible?
16
+ element.displayed?
17
+ end
18
+
19
+ #
20
+ # return true if an element exists
21
+ #
22
+ def exists?
23
+ not element.nil?
24
+ end
25
+
26
+ #
27
+ # flash the element by temporarily changing the background color
28
+ #
29
+ def flash
30
+ original_color = attribute('backgroundColor')
31
+ the_bridge = bridge
32
+ 10.times do |n|
33
+ color = (n % 2 == 0) ? 'red' : original_color
34
+ the_bridge.executeScript("arguments[0].style.backgroundColor = '#{color}'", element)
35
+ end
36
+ end
37
+
38
+ #
39
+ # Get the text for the element
40
+ #
41
+ # @return [String]
42
+ #
43
+ def text
44
+ element.text
45
+ end
46
+
47
+ #
48
+ # Get the html for the element
49
+ #
50
+ # @return [String]
51
+ #
52
+ def html
53
+ script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:getOuterHtml)
54
+ bridge.executeScript(script, element).strip
55
+ end
56
+
57
+ #
58
+ # Get the value of this element
59
+ #
60
+ # @return [String]
61
+ #
62
+ def value
63
+ element.attribute('value')
64
+ end
65
+
66
+ #
67
+ # compare this element to another to determine if they are equal
68
+ #
69
+ def ==(other)
70
+ element == other.element
71
+ end
72
+
73
+ #
74
+ # Get the tag name of this element
75
+ #
76
+ # @return [String]
77
+ #
78
+ def tag_name
79
+ element.tag_name
80
+ end
81
+
82
+ #
83
+ # Get the value of a the given attribute of the element. Will
84
+ # return the current value, even if this has been modified
85
+ # after the page has been loaded. More exactly, this method
86
+ # will return the value of the given attribute, unless that
87
+ # attribute is not present, in which case the value of the
88
+ # property with the same name is returned. If neither value is
89
+ # set, nil is returned. The "style" attribute is converted as
90
+ # best can be to a text representation with a trailing
91
+ # semi-colon. The following are deemed to be "boolean"
92
+ # attributes, and will return either "true" or "false":
93
+ #
94
+ # async, autofocus, autoplay, checked, compact, complete,
95
+ # controls, declare, defaultchecked, defaultselected, defer,
96
+ # disabled, draggable, ended, formnovalidate, hidden, indeterminate,
97
+ # iscontenteditable, ismap, itemscope, loop, multiple, muted,
98
+ # nohref, noresize, noshade, novalidate, nowrap, open, paused,
99
+ # pubdate, readonly, required, reversed, scoped, seamless, seeking,
100
+ # selected, spellcheck, truespeed, willvalidate
101
+ #
102
+ # Finally, the following commonly mis-capitalized
103
+ # attribute/property names are evaluated as expected:
104
+ #
105
+ # class, readonly
106
+ #
107
+ # @param [String]
108
+ # attribute name
109
+ # @return [String,nil]
110
+ # attribute value
111
+ #
112
+ def attribute(attribute_name)
113
+ element.attribute attribute_name
114
+ end
115
+
116
+ #
117
+ # Fire the provided event on the current element
118
+ #
119
+ def fire_event(event_name)
120
+ event_name = event_name.to_s.sub(/^on/, '').downcase
121
+ script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:fireEvent)
122
+ bridge.executeScript(script, element, event_name)
123
+ end
124
+
125
+ #
126
+ # hover over the element
127
+ #
128
+ def hover
129
+ mouse = Selenium::WebDriver::Mouse.new(bridge)
130
+ mouse.move_to(element)
131
+ end
132
+
133
+ #
134
+ # hover over the element
135
+ #
136
+ def double_click
137
+ mouse = Selenium::WebDriver::Mouse.new(bridge)
138
+ mouse.double_click(element)
139
+ end
140
+
141
+ #
142
+ # find the parent element
143
+ #
144
+ def parent
145
+ script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:getParentElement)
146
+ parent = bridge.executeScript(script, element)
147
+ type = element.attribute(:type).to_s.downcase if parent.tag_name.to_sym == :input
148
+ cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
149
+ cls.new(parent, :platform => :selenium_webdriver)
150
+ end
151
+
152
+ #
153
+ # Set the focus to the current element
154
+ #
155
+ def focus
156
+ bridge.executeScript("return arguments[0].focus()", element)
157
+ end
158
+
159
+ #
160
+ # Select the provided text
161
+ #
162
+ def select_text(text)
163
+ Watir::Atoms.load(:selectText)
164
+ script = "return (%s).apply(null, arguments)" % ATOMS.fetch(:selectText)
165
+ bridge.executeScript(script, element, text)
166
+ end
167
+
168
+ #
169
+ # Click this element
170
+ #
171
+ def right_click
172
+ element.context_click
173
+ end
174
+
175
+ #
176
+ # Waits until the element is present
177
+ #
178
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
179
+ #
180
+ def when_present(timeout=::PageObject.default_element_wait)
181
+ wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Element not present in #{timeout} seconds"})
182
+ wait.until do
183
+ self.exists?
184
+ end
185
+ self
186
+ end
187
+
188
+ #
189
+ # Waits until the element is not present
190
+ #
191
+ # @param [Integer] (defaults to: 5) seconds to wait before
192
+ # timing out
193
+ #
194
+ def when_not_present(timeout=::PageObject.default_element_wait)
195
+ wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Element still present in #{timeout} seconds"})
196
+ wait.until do
197
+ not_present = false
198
+ begin
199
+ not_present = false if element and element.displayed?
200
+ rescue Selenium::WebDriver::Error::ObsoleteElementError
201
+ not_present = true
202
+ end
203
+ not_present
204
+ end
205
+ end
206
+
207
+ #
208
+ # Waits until the element is visible
209
+ #
210
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
211
+ #
212
+ def when_visible(timeout=::PageObject.default_element_wait)
213
+ wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Element not visible in #{timeout} seconds"})
214
+ wait.until do
215
+ self.visible?
216
+ end
217
+ self
218
+ end
219
+
220
+ #
221
+ # Waits until the element is not visible
222
+ #
223
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
224
+ #
225
+ def when_not_visible(timeout=::PageObject.default_element_wait)
226
+ wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Element still visible in #{timeout} seconds"})
227
+ wait.until do
228
+ not self.visible?
229
+ end
230
+ self
231
+ end
232
+
233
+ #
234
+ # Waits until the block returns true
235
+ #
236
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
237
+ # @param [String] the message to display if the event timeouts
238
+ # @param the block to execute when the event occurs
239
+ #
240
+ def wait_until(timeout=::PageObject.default_element_wait, message=nil, &block)
241
+ wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => message})
242
+ wait.until &block
243
+ end
244
+
245
+ #
246
+ # Send keystrokes to this element
247
+ #
248
+ # @param [String, Symbol, Array]
249
+ #
250
+ # Examples:
251
+ #
252
+ # element.send_keys "foo" #=> value: 'foo'
253
+ # element.send_keys "tet", :arrow_left, "s" #=> value: 'test'
254
+ # element.send_keys [:control, 'a'], :space #=> value: ' '
255
+ #
256
+ # @see Selenium::WebDriver::Keys::KEYS
257
+ #
258
+ def send_keys(*args)
259
+ element.send_keys(*args)
260
+ end
261
+
262
+ #
263
+ # clear the contents of the element
264
+ #
265
+ def clear
266
+ element.clear
267
+ end
268
+
269
+ #
270
+ # get the id of the element
271
+ #
272
+ def id
273
+ attribute(:id)
274
+ end
275
+
276
+ #
277
+ # Scroll until the element is viewable
278
+ #
279
+ def scroll_into_view
280
+ element.location_once_scrolled_into_view
281
+ end
282
+
283
+ private
284
+
285
+ def bridge
286
+ bridge = element.instance_variable_get(:@bridge)
287
+ end
288
+ end
289
+ end
290
+ end
291
+ end