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,78 @@
1
+ require 'page-object/javascript/jquery'
2
+ require 'page-object/javascript/prototype'
3
+ require 'page-object/javascript/yui'
4
+
5
+
6
+ module PageObject
7
+ #
8
+ # Provide hooks into different common Javascript Frameworks.
9
+ # Currently this module only supports jQuery and Prototype but it
10
+ # has the ability for you to plug your own framework into it and
11
+ # therefore have it work with this gem. You do this by calling the
12
+ # #add_framework method. The module you provide must implement the
13
+ # necessary methods. Please look at the jQuery or Prototype
14
+ # implementations to determine the necessary methods
15
+ #
16
+ module JavascriptFrameworkFacade
17
+
18
+ class << self
19
+ #
20
+ # Set the framework to use.
21
+ #
22
+ # @param[Symbol] the framework to use. :jquery and :prototype
23
+ # are supported
24
+ #
25
+ def framework=(framework)
26
+ initialize_script_builder unless @builder
27
+ raise unknown_framework(framework) unless @builder[framework]
28
+ @framework = framework
29
+ end
30
+
31
+ #
32
+ # Get the framework that will be used
33
+ #
34
+ def framework
35
+ @framework
36
+ end
37
+
38
+ #
39
+ # Add a framework and make it available to the system.
40
+ #
41
+ def add_framework(key, value)
42
+ raise invalid_framework unless value.respond_to? :pending_requests
43
+ initialize_script_builder unless @builder
44
+ @builder[key] = value
45
+ end
46
+
47
+ #
48
+ # get the javascript to determine number of pending requests
49
+ #
50
+ def pending_requests
51
+ script_builder.pending_requests
52
+ end
53
+
54
+ def script_builder
55
+ initialize_script_builder unless @builder
56
+ @builder[@framework]
57
+ end
58
+
59
+ private
60
+
61
+ def initialize_script_builder
62
+ @builder = {
63
+ :jquery => ::PageObject::Javascript::JQuery,
64
+ :prototype => ::PageObject::Javascript::Prototype,
65
+ :yui => ::PageObject::Javascript::YUI,
66
+ }
67
+ end
68
+
69
+ def unknown_framework(framework)
70
+ "You specified the Javascript framework #{framework} and it is unknow to the system"
71
+ end
72
+
73
+ def invalid_framework
74
+ "The Javascript framework you provided does not implement the necessary methods"
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,26 @@
1
+ module PageObject
2
+ #
3
+ # module which provides a function for determining
4
+ # which platform to provide to the page object
5
+ #
6
+ module LoadsPlatform
7
+ #
8
+ # Determines which platform the Page Object should use based upon browser
9
+ #
10
+ # @example
11
+ # platform = load_platform(watir_webdriver_browser, PageObject.Adapters.list).send(:new, watir_webdriver_browser)
12
+ #
13
+ # @param [Object] A browser driver that has a supported adapter
14
+ # @param [adapters] a list of adapters that are currently supported
15
+ # @returns [PageObject]
16
+ #
17
+ def load_platform(browser, adapters)
18
+ adapters.each_value { |adapter|
19
+ return adapter.create_page_object(browser) if adapter.is_for?(browser)
20
+ }
21
+ message = 'Unable to pick a platform for the provided browser.'
22
+ message += "\nnil was passed to the PageObject constructor instead of a valid browser object." if browser.nil?
23
+ raise message
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,129 @@
1
+ module PageObject
2
+ module LocatorGenerator
3
+
4
+ BASIC_ELEMENTS = [:abbr,
5
+ :address,
6
+ :article,
7
+ :as,
8
+ :aside,
9
+ :bdi,
10
+ :bdo,
11
+ :blockquote,
12
+ :body,
13
+ :br,
14
+ :caption,
15
+ :cite,
16
+ :code,
17
+ :col,
18
+ :colgroup,
19
+ :command,
20
+ :data,
21
+ :datalist,
22
+ :dd,
23
+ :del,
24
+ :details,
25
+ :dfn,
26
+ :dialog,
27
+ :dl,
28
+ :dt,
29
+ :em,
30
+ :embed,
31
+ :fieldset,
32
+ :figcaption,
33
+ :figure,
34
+ :footer,
35
+ :head,
36
+ :header,
37
+ :hgroup,
38
+ :hr,
39
+ :ins,
40
+ :kbd,
41
+ :keygen,
42
+ :legend,
43
+ :map,
44
+ :mark,
45
+ :menu,
46
+ :meta,
47
+ :meter,
48
+ :nav,
49
+ :noscript,
50
+ :object,
51
+ :optgroup,
52
+ :output,
53
+ :param,
54
+ :pre,
55
+ :progress,
56
+ :rp,
57
+ :rt,
58
+ :ruby,
59
+ :samp,
60
+ :section,
61
+ :small,
62
+ :strong,
63
+ :style,
64
+ :sub,
65
+ :summary,
66
+ :sup,
67
+ :time,
68
+ :title,
69
+ :track,
70
+ :var,
71
+ :wbr]
72
+
73
+
74
+ ADVANCED_ELEMENTS = [:text_field,
75
+ :hidden_field,
76
+ :text_area,
77
+ :select_list,
78
+ :link,
79
+ :checkbox,
80
+ :radio_button,
81
+ :button,
82
+ :div,
83
+ :span,
84
+ :table,
85
+ :cell,
86
+ :image,
87
+ :form,
88
+ :list_item,
89
+ :ordered_list,
90
+ :unordered_list,
91
+ :h1,
92
+ :h2,
93
+ :h3,
94
+ :h4,
95
+ :h5,
96
+ :h6,
97
+ :paragraph,
98
+ :label,
99
+ :file_field,
100
+ :area,
101
+ :canvas,
102
+ :audio,
103
+ :video,
104
+ :svg]
105
+
106
+ def self.generate_locators(target)
107
+ ADVANCED_ELEMENTS.each do |tag|
108
+ target.send(:define_method, "#{tag.to_s}_element") do |*identifier|
109
+ @platform.send "#{tag.to_s}_for", locator(identifier)
110
+ end
111
+
112
+ target.send(:define_method, "#{tag.to_s}_elements") do |*identifier|
113
+ @platform.send("#{tag.to_s}s_for", identifier[0] ? identifier[0] : {})
114
+ end
115
+ end
116
+
117
+ BASIC_ELEMENTS.each do |tag|
118
+ target.send(:define_method, "#{tag.to_s}_element") do |*identifier|
119
+ @platform.send :element_for, tag, locator(identifier)
120
+ end
121
+
122
+ target.send(:define_method, "#{tag.to_s}_elements") do |*identifier|
123
+ @platform.send(:elements_for, tag, identifier[0] ? identifier[0] : {})
124
+ end
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,17 @@
1
+ require 'page-object/locator_generator'
2
+
3
+ module PageObject
4
+ module NestedElements
5
+
6
+ def self.included(cls)
7
+ ::PageObject::LocatorGenerator.generate_locators(cls)
8
+ end
9
+
10
+ private
11
+
12
+ def locator(identifier)
13
+ identifier[0] ? identifier[0] : {:index => 0}
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,108 @@
1
+ require 'page_navigation'
2
+
3
+ module PageObject
4
+ #
5
+ # Module to facilitate to creating of page objects in step definitions. You
6
+ # can make the methods below available to all of your step definitions by adding
7
+ # this module to World. This idea was first discussed in Alister Scott's blog
8
+ # entry http://watirmelon.com/2011/06/07/removing-local-page-references-from-cucumber-steps/.
9
+ #
10
+ # @example Making the PageFactory available to your step definitions
11
+ # World PageObject::PageFactory
12
+ #
13
+ # @example Visiting a page for the first time in a Scenario
14
+ # visit_page MyPageObject do |page|
15
+ # page.name = 'Cheezy'
16
+ # end
17
+ #
18
+ # @example using a page that has already been visited in a Scenario
19
+ # on_page MyPageObject do |page|
20
+ # page.name.should == 'Cheezy'
21
+ # end
22
+ #
23
+ # If you plan to use the navigate_to method you will need to ensure
24
+ # you setup the possible routes ahead of time. You must always have
25
+ # a default route in order for this to work. Here is an example of
26
+ # how you define routes:
27
+ #
28
+ # @example Example routes defined in env.rb
29
+ # PageObject::PageFactory.routes = {
30
+ # :default => [[PageOne,:method1], [PageTwoA,:method2], [PageThree,:method3]],
31
+ # :another_route => [[PageOne,:method1, "arg1"], [PageTwoB,:method2b], [PageThree,:method3]]
32
+ # }
33
+ #
34
+ # Notice the first entry of :another_route is passing an argument
35
+ # to the method.
36
+ #
37
+ module PageFactory
38
+ include PageNavigation
39
+
40
+
41
+ #
42
+ # Create and navigate to a page object. The navigation will only work if the
43
+ # 'page_url' method was call on the page object.
44
+ #
45
+ # @param [PageObject, String] a class that has included the
46
+ # PageObject module or a string containing the name of the class
47
+ # @param Hash values that is pass through to page class a
48
+ # available in the @params instance variable.
49
+ # @param an optional block to be called
50
+ # @return [PageObject] the newly created page object
51
+ #
52
+ def visit_page(page_class, params={:using_params => {}}, &block)
53
+ on_page page_class, params, true, &block
54
+ end
55
+
56
+ # Support 'visit' for readability of usage
57
+ alias_method :visit, :visit_page
58
+
59
+ #
60
+ # Create a page object.
61
+ #
62
+ # @param [PageObject, String] a class that has included the PageObject module or a string containing the name of the class
63
+ # @param Hash values that is pass through to page class a
64
+ # available in the @params instance variable.
65
+ # @param [Boolean] a boolean indicating if the page should be visited? default is false.
66
+ # @param [block] an optional block to be called
67
+ # @return [PageObject] the newly created page object
68
+ #
69
+ def on_page(page_class, params={:using_params => {}}, visit=false, &block)
70
+ page_class = class_from_string(page_class) if page_class.is_a? String
71
+ return super(page_class, params, visit, &block) unless page_class.ancestors.include? PageObject
72
+ merged = page_class.params.merge(params[:using_params])
73
+ page_class.instance_variable_set("@merged_params", merged) unless merged.empty?
74
+ @current_page = page_class.new(@browser, visit)
75
+ block.call @current_page if block
76
+ @current_page
77
+ end
78
+
79
+ # Support 'on' for readability of usage
80
+ alias_method :on, :on_page
81
+
82
+ #
83
+ # Create a page object if and only if the current page is the same page to be created
84
+ #
85
+ # @param [PageObject, String] a class that has included the PageObject module or a string containing the name of the class
86
+ # @param Hash values that is pass through to page class a
87
+ # available in the @params instance variable.
88
+ # @param [block] an optional block to be called
89
+ # @return [PageObject] the newly created page object
90
+ #
91
+ def if_page(page_class, params={:using_params => {}},&block)
92
+ page_class = class_from_string(page_class) if page_class.is_a? String
93
+ return @current_page unless @current_page.class == page_class
94
+ on_page(page_class, params, false, &block)
95
+ end
96
+
97
+ # Support 'if' for readability of usage
98
+ alias_method :if, :if_page
99
+
100
+ private
101
+
102
+ def class_from_string(str)
103
+ str.split('::').inject(Object) do |mod, class_name|
104
+ mod.const_get(class_name)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,92 @@
1
+ module PageObject
2
+ module PagePopulator
3
+
4
+ #
5
+ # This method will populate all matched page TextFields,
6
+ # TextAreas, SelectLists, FileFields, Checkboxes, and Radio Buttons from the
7
+ # Hash passed as an argument. The way it find an element is by
8
+ # matching the Hash key to the name you provided when declaring
9
+ # the element on your page.
10
+ #
11
+ # Checkboxes and Radio Button values must be true or false.
12
+ #
13
+ # @example
14
+ # class ExamplePage
15
+ # include PageObject
16
+ #
17
+ # text_field(:username, :id => 'username_id')
18
+ # checkbox(:active, :id => 'active_id')
19
+ # end
20
+ #
21
+ # ...
22
+ #
23
+ # @browser = Watir::Browser.new :firefox
24
+ # example_page = ExamplePage.new(@browser)
25
+ # example_page.populate_page_with :username => 'a name', :active => true
26
+ #
27
+ # @param [Hash] the data to use to populate this page. The key
28
+ # can be either a string or a symbol. The value must be a string
29
+ # for TextField, TextArea, SelectList, and FileField and must be true or
30
+ # false for a Checkbox or RadioButton.
31
+ #
32
+ def populate_page_with(data)
33
+ data.each do |key, value|
34
+ populate_checkbox(key, value) if is_checkbox?(key) and is_enabled?(key)
35
+ populate_radiobuttongroup(key, value) if is_radiobuttongroup?(key)
36
+ populate_radiobutton(key, value) if is_radiobutton?(key) and is_enabled?(key)
37
+ populate_text(key, value) if is_text?(key) and is_enabled?(key)
38
+ populate_label(key, value) if is_label?(key)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def populate_text(key, value)
45
+ self.send "#{key}=", value
46
+ end
47
+
48
+ def populate_checkbox(key, value)
49
+ return self.send "check_#{key}" if value
50
+ return self.send "uncheck_#{key}"
51
+ end
52
+
53
+ def populate_radiobutton(key, value)
54
+ return self.send "select_#{key}" if value
55
+ end
56
+
57
+ def populate_radiobuttongroup(key, value)
58
+ return self.send("select_#{key}", value)
59
+ end
60
+
61
+ def populate_label(key, value)
62
+ return self.send "choose_#{key}"
63
+ end
64
+
65
+ def is_text?(key)
66
+ respond_to?("#{key}=".to_sym)
67
+ end
68
+
69
+ def is_checkbox?(key)
70
+ respond_to?("check_#{key}".to_sym)
71
+ end
72
+
73
+ def is_radiobutton?(key)
74
+ respond_to?("select_#{key}".to_sym)
75
+ end
76
+
77
+ def is_radiobuttongroup?(key)
78
+ respond_to?("select_#{key}".to_sym) and respond_to?("#{key}_values")
79
+ end
80
+
81
+ def is_label?(key)
82
+ respond_to?("choose_#{key}".to_sym)
83
+ end
84
+
85
+ def is_enabled?(key)
86
+ return false if is_radiobuttongroup?(key)
87
+ return true if (self.send "#{key}_element").tag_name == "textarea"
88
+ element = self.send("#{key}_element")
89
+ element.enabled? and element.visible?
90
+ end
91
+ end
92
+ end
@@ -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