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,256 @@
1
+ require 'spec_helper'
2
+ require 'page-object/page_factory'
3
+
4
+ class FactoryTestPage
5
+ include PageObject
6
+ page_url "http://google.com"
7
+ end
8
+
9
+ class TestPageWithDirectUrl
10
+ include PageObject
11
+ direct_url "http//google.com"
12
+ end
13
+
14
+ class AnotherPage
15
+ include PageObject
16
+ end
17
+
18
+ class YetAnotherPage
19
+ include PageObject
20
+ end
21
+
22
+ module ContainingModule
23
+ class PageInsideModule
24
+ include PageObject
25
+ page_url "http://google.co.uk"
26
+ end
27
+ end
28
+
29
+ class WorldSuper
30
+ attr_reader :super_called
31
+ def on_page(cls, params={}, visit=false, &block)
32
+ @super_called = true
33
+ end
34
+ end
35
+
36
+
37
+ class TestWorld < WorldSuper
38
+ include PageObject::PageFactory
39
+ attr_accessor :browser
40
+ attr_accessor :current_page
41
+ end
42
+
43
+ describe PageObject::PageFactory do
44
+ before(:each) do
45
+ @world = TestWorld.new
46
+ @world.browser = mock_watir_browser
47
+ end
48
+
49
+ it "should call super when non page-object class passed " do
50
+ class NoPO
51
+ end
52
+ @world.on(NoPO)
53
+ @world.super_called.should be true
54
+ end
55
+
56
+ it "should create a new page object and execute a block" do
57
+ @world.browser.should_not_receive(:goto)
58
+ @world.on_page FactoryTestPage do |page|
59
+ page.should be_instance_of FactoryTestPage
60
+ end
61
+ @world.on_page "FactoryTestPage" do |page|
62
+ page.should be_instance_of FactoryTestPage
63
+ end
64
+ @world.on_page "ContainingModule::PageInsideModule" do |page|
65
+ page.should be_instance_of ContainingModule::PageInsideModule
66
+ end
67
+ end
68
+
69
+ it "should create a new page object and execute a block using 'on'" do
70
+ @world.browser.should_not_receive(:goto)
71
+ @world.on FactoryTestPage do |page|
72
+ page.should be_instance_of FactoryTestPage
73
+ end
74
+ @world.on "FactoryTestPage" do |page|
75
+ page.should be_instance_of FactoryTestPage
76
+ end
77
+ @world.on "ContainingModule::PageInsideModule" do |page|
78
+ page.should be_instance_of ContainingModule::PageInsideModule
79
+ end
80
+ end
81
+
82
+ it "should create and visit a new page" do
83
+ @world.browser.should_receive(:goto).exactly(3).times
84
+ @world.visit_page FactoryTestPage do |page|
85
+ page.should be_instance_of FactoryTestPage
86
+ end
87
+ @world.visit_page "FactoryTestPage" do |page|
88
+ page.should be_instance_of FactoryTestPage
89
+ end
90
+ @world.visit_page "ContainingModule::PageInsideModule" do |page|
91
+ page.should be_instance_of ContainingModule::PageInsideModule
92
+ end
93
+ end
94
+
95
+ it "should merge params with the class level params if provided when visiting" do
96
+ @world.browser.should_receive(:goto)
97
+ FactoryTestPage.params = {:initial => :value}
98
+ @world.visit_page(FactoryTestPage, :using_params => {:new_value => :merged})
99
+ merged = FactoryTestPage.instance_variable_get("@merged_params")
100
+ merged[:initial].should == :value
101
+ merged[:new_value].should == :merged
102
+ end
103
+
104
+ it "should use the params in the url when they are provided" do
105
+ class PageUsingParams
106
+ include PageObject
107
+ page_url "http://google.com/<%=params[:value]%>"
108
+ end
109
+ @world.browser.should_receive(:goto).with("http://google.com/PageObject")
110
+ @world.visit_page(PageUsingParams, :using_params => {:value => 'PageObject'})
111
+ end
112
+
113
+ it "should use the params as well as interpolated values" do
114
+ class PageUsingParmsAndInterpolated
115
+ include PageObject
116
+ page_url "http://google.com/#{1+2}/<%=params[:value]%>"
117
+ end
118
+ @world.browser.should_receive(:goto).with("http://google.com/3/PageObject")
119
+ @world.visit_page(PageUsingParmsAndInterpolated, :using_params => {:value => 'PageObject'})
120
+ end
121
+
122
+ it "should create and visit a new page using 'visit'" do
123
+ @world.browser.should_receive(:goto).exactly(3).times
124
+ @world.visit FactoryTestPage do |page|
125
+ page.should be_instance_of FactoryTestPage
126
+ end
127
+ @world.visit "FactoryTestPage" do |page|
128
+ page.should be_instance_of FactoryTestPage
129
+ end
130
+ @world.visit "ContainingModule::PageInsideModule" do |page|
131
+ page.should be_instance_of ContainingModule::PageInsideModule
132
+ end
133
+ end
134
+
135
+ it "should create and visit a new page when url is defined as 'direct_url'" do
136
+ @world.browser.should_receive(:goto)
137
+ @world.visit TestPageWithDirectUrl do |page|
138
+ page.should be_instance_of TestPageWithDirectUrl
139
+ end
140
+ end
141
+
142
+ it "should set an instance variable that can be used outside of the block" do
143
+ page = @world.on_page FactoryTestPage
144
+ current_page = @world.instance_variable_get "@current_page"
145
+ current_page.should === page
146
+ end
147
+
148
+ it "should not execute block if page is not @current_page" do
149
+ @world.instance_variable_set "@current_page", TestPageWithDirectUrl.new(@world.browser)
150
+ @world.if_page(FactoryTestPage) do |page|
151
+ fail
152
+ end
153
+ @world.if_page("FactoryTestPage") do |page|
154
+ fail
155
+ end
156
+ @world.if_page("ContainingModule::PageInsideModule") do |page|
157
+ fail
158
+ end
159
+ end
160
+
161
+ it "should return the @current_page if asking for another page" do
162
+ expected = TestPageWithDirectUrl.new(@world.browser)
163
+ @world.instance_variable_set "@current_page", expected
164
+ @world.if_page(FactoryTestPage).should == expected
165
+ @world.if_page("FactoryTestPage").should == expected
166
+ @world.if_page("ContainingModule::PageInsideModule").should == expected
167
+ end
168
+
169
+ it "should execute the block when we ask if it is the correct page" do
170
+ @world.instance_variable_set "@current_page", FactoryTestPage.new(@world.browser)
171
+
172
+ done = false
173
+ @world.if_page(FactoryTestPage) do |page|
174
+ page.should be_instance_of FactoryTestPage
175
+ done = true
176
+ end
177
+ done.should be true
178
+
179
+ done = false
180
+ @world.if_page("FactoryTestPage") do |page|
181
+ page.should be_instance_of FactoryTestPage
182
+ done = true
183
+ end
184
+ done.should be true
185
+
186
+ done = false
187
+ @world.instance_variable_set "@current_page", ContainingModule::PageInsideModule.new(@world.browser)
188
+ @world.if_page("ContainingModule::PageInsideModule") do |page|
189
+ page.should be_instance_of ContainingModule::PageInsideModule
190
+ done = true
191
+ end
192
+ done.should be true
193
+ end
194
+
195
+ it "should raise an error when you do not provide a default route" do
196
+ expect { PageObject::PageFactory.routes = {:another => []} }.to raise_error
197
+ end
198
+
199
+ it "should store the routes" do
200
+ routes = ['a', 'b', 'c']
201
+ PageObject::PageFactory.routes = {:default => routes}
202
+ PageObject::PageFactory.routes[:default].should == routes
203
+ end
204
+
205
+ it "should navigate to a page calling the default methods" do
206
+ pages = [[FactoryTestPage, :a_method], [AnotherPage, :b_method]]
207
+ PageObject::PageFactory.routes = {:default => pages}
208
+ fake_page = double('a_page')
209
+ FactoryTestPage.should_receive(:new).and_return(fake_page)
210
+ fake_page.should_receive(:a_method)
211
+ @world.navigate_to(AnotherPage).class.should == AnotherPage
212
+ end
213
+
214
+ it "should pass parameters to methods when navigating" do
215
+ pages = [[FactoryTestPage, :a_method, 'blah'], [AnotherPage, :b_method]]
216
+ PageObject::PageFactory.routes = {:default => pages}
217
+ fake_page = double('a_page')
218
+ FactoryTestPage.should_receive(:new).and_return(fake_page)
219
+ fake_page.should_receive(:a_method).with('blah')
220
+ @world.navigate_to(AnotherPage).class.should == AnotherPage
221
+ end
222
+
223
+ it "should fail when it does not find a proper route" do
224
+ PageObject::PageFactory.routes = {:default => ['a'], :another => ['b']}
225
+ expect { @world.navigate_to(AnotherPage, :using => :no_route) }.to raise_error
226
+ end
227
+
228
+ it "should fail when no default method specified" do
229
+ PageObject::PageFactory.routes = {
230
+ :default => [[FactoryTestPage, :a_method], [AnotherPage, :b_method]]
231
+ }
232
+ fake_page = double('a_page')
233
+ FactoryTestPage.should_receive(:new).and_return(fake_page)
234
+ fake_page.should_receive(:respond_to?).with(:a_method).and_return(false)
235
+ expect { @world.navigate_to(AnotherPage) }.to raise_error
236
+ end
237
+
238
+ it "should know how to continue routing from a location" do
239
+ PageObject::PageFactory.routes = {
240
+ :default => [[FactoryTestPage, :a_method],
241
+ [AnotherPage, :b_method],
242
+ [YetAnotherPage, :c_method]]
243
+ }
244
+
245
+ @world.current_page = FactoryTestPage.new(@world.browser)
246
+ f_page = FactoryTestPage.new(@world.browser)
247
+ FactoryTestPage.should_receive(:new).and_return(f_page)
248
+ f_page.should_receive(:respond_to?).with(:a_method).and_return(true)
249
+ f_page.should_receive(:a_method)
250
+ a_page = AnotherPage.new(@world.browser)
251
+ AnotherPage.should_receive(:new).and_return(a_page)
252
+ a_page.should_receive(:respond_to?).with(:b_method).and_return(true)
253
+ a_page.should_receive(:b_method)
254
+ @world.continue_navigation_to(YetAnotherPage).class.should == YetAnotherPage
255
+ end
256
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ class PageObjectTestPageObject
4
+ include PageObject
5
+
6
+ text_field(:tf, :id => 'id')
7
+ text_area(:ta, :id => 'id')
8
+ select_list(:sl, :id => 'id')
9
+ file_field(:ff, :id => 'id')
10
+ checkbox(:cb, :id => 'id')
11
+ radio_button(:rb, :id => 'id')
12
+ radio_button_group(:rbg, :id => 'id')
13
+ end
14
+
15
+ describe PageObject::PagePopulator do
16
+ let(:browser) { mock_watir_browser }
17
+ let(:page_object) { PageObjectTestPageObject.new(browser) }
18
+
19
+ it "should set a value in a text field" do
20
+ page_object.should_receive(:tf=).with('value')
21
+ page_object.stub(:is_enabled?).and_return(true)
22
+ page_object.populate_page_with('tf' => 'value')
23
+ end
24
+
25
+ it "should not set a value in a text field if it is not found on the page" do
26
+ browser.should_not_receive(:text_field)
27
+ page_object.populate_page_with('coffee' => 'value')
28
+ end
29
+
30
+ it "should not populate a text field when it is disabled" do
31
+ page_object.should_not_receive(:tf=)
32
+ page_object.should_receive(:tf_element).twice.and_return(browser)
33
+ browser.should_receive(:enabled?).and_return(false)
34
+ browser.should_receive(:tag_name).and_return('input')
35
+ page_object.populate_page_with('tf' => true)
36
+ end
37
+
38
+ it "should not populate a text field when it is not visible" do
39
+ page_object.should_not_receive(:tf=)
40
+ page_object.should_receive(:tf_element).twice.and_return(browser)
41
+ browser.should_receive(:enabled?).and_return(true)
42
+ browser.should_receive(:visible?).and_return(false)
43
+ browser.should_receive(:tag_name).and_return('input')
44
+ page_object.populate_page_with('tf' => true)
45
+ end
46
+
47
+ it "should set a value in a text area" do
48
+ page_object.should_receive(:ta=).with('value')
49
+ page_object.should_receive(:ta_element).and_return(browser)
50
+ browser.should_receive(:tag_name).and_return('textarea')
51
+ page_object.populate_page_with('ta' => 'value')
52
+ end
53
+
54
+ it "should set a value in a select list" do
55
+ page_object.should_receive(:sl=).with('value')
56
+ page_object.stub(:is_enabled?).and_return(true)
57
+ page_object.populate_page_with('sl' => 'value')
58
+ end
59
+
60
+ it "should set a value in a file field" do
61
+ page_object.should_receive(:ff=).with('value')
62
+ page_object.stub(:is_enabled?).and_return(true)
63
+ page_object.populate_page_with('ff' => 'value')
64
+ end
65
+
66
+ it "should check a checkbox to true is specified" do
67
+ page_object.should_receive(:check_cb)
68
+ page_object.stub(:is_enabled?).and_return(true)
69
+ page_object.populate_page_with('cb' => true)
70
+ end
71
+
72
+ it "should uncheck a checkbox to false is specified" do
73
+ page_object.should_receive(:uncheck_cb)
74
+ page_object.stub(:is_enabled?).and_return(true)
75
+ page_object.populate_page_with('cb' => false)
76
+ end
77
+
78
+ it "should select a radio button when true is specified" do
79
+ page_object.should_receive(:select_rb)
80
+ page_object.stub(:is_enabled?).and_return(true)
81
+ page_object.populate_page_with('rb' => true)
82
+ end
83
+
84
+ it "should select the correct element from a radio button group" do
85
+ page_object.should_receive(:select_rbg).with('blah')
86
+ page_object.populate_page_with('rbg' => 'blah')
87
+ end
88
+
89
+ it "should not populate a checkbox if it is disabled" do
90
+ page_object.should_not_receive(:check_cb)
91
+ page_object.should_receive(:cb_element).twice.and_return(browser)
92
+ browser.should_receive(:enabled?).and_return(false)
93
+ browser.should_receive(:tag_name).and_return('input')
94
+ page_object.populate_page_with('cb' => true)
95
+ end
96
+
97
+ it "should not populate a checkbox if it is not visible" do
98
+ page_object.should_not_receive(:check_cb)
99
+ page_object.should_receive(:cb_element).twice.and_return(browser)
100
+ browser.should_receive(:enabled?).and_return(true)
101
+ browser.should_receive(:visible?).and_return(false)
102
+ browser.should_receive(:tag_name).and_return('input')
103
+ page_object.populate_page_with('cb' => true)
104
+ end
105
+
106
+ it "should not populate a radio button when it is disabled" do
107
+ page_object.should_not_receive(:select_rb)
108
+ page_object.should_receive(:rb_element).twice.and_return(browser)
109
+ browser.should_receive(:enabled?).and_return(false)
110
+ browser.should_receive(:tag_name).and_return('input')
111
+ page_object.populate_page_with('rb' => true)
112
+ end
113
+
114
+ it "should not populate a radio button when it is not visible" do
115
+ page_object.should_not_receive(:select_rb)
116
+ page_object.should_receive(:rb_element).twice.and_return(browser)
117
+ browser.should_receive(:enabled?).and_return(true)
118
+ browser.should_receive(:visible?).and_return(false)
119
+ browser.should_receive(:tag_name).and_return('input')
120
+ page_object.populate_page_with('rb' => true)
121
+ end
122
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+ require 'page-object/platforms/selenium_webdriver/page_object'
3
+ require 'page-object/elements'
4
+
5
+ class SeleniumTestPageObject
6
+ include PageObject
7
+ end
8
+
9
+ describe PageObject::Platforms::SeleniumWebDriver::PageObject do
10
+ let(:selenium_browser) { mock_selenium_browser }
11
+ let(:selenium_page_object) { SeleniumTestPageObject.new(selenium_browser) }
12
+
13
+ before(:each) do
14
+ selenium_browser.stub(:switch_to).and_return(selenium_browser)
15
+ selenium_browser.stub(:default_content)
16
+ end
17
+
18
+ context "when building identifiers hash" do
19
+ it "should add tag_name when identifying by text for hidden_field" do
20
+ expected_identifier = {:text => 'foo', :tag_name => 'input', :type => 'hidden'}
21
+ PageObject::Elements::HiddenField.should_receive(:selenium_identifier_for).with(expected_identifier)
22
+ selenium_browser.should_receive(:find_element)
23
+ selenium_page_object.platform.hidden_field_for(:text => 'foo')
24
+ end
25
+
26
+ it "should add tag_name when identifying by href for anchor" do
27
+ expected_identifier = {:href => 'foo', :tag_name => 'a'}
28
+ PageObject::Elements::Link.should_receive(:selenium_identifier_for).with(expected_identifier)
29
+ selenium_browser.should_receive(:find_element)
30
+ selenium_page_object.platform.link_for(:href => 'foo')
31
+ end
32
+
33
+ it "should add tag_name when identifying by text for div" do
34
+ expected_identifier = {:text => 'foo', :tag_name => 'div'}
35
+ PageObject::Elements::Div.should_receive(:selenium_identifier_for).with(expected_identifier)
36
+ selenium_browser.should_receive(:find_element)
37
+ selenium_page_object.platform.div_for(:text => 'foo')
38
+ end
39
+ end
40
+
41
+ context "when trying to find an element that does not exist" do
42
+ it "should return a surogate selenium object" do
43
+ selenium_browser.should_receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
44
+ page = SeleniumTestPageObject.new(selenium_browser)
45
+ element = page.link_element(:text => 'blah')
46
+ element.element.should be_instance_of PageObject::Platforms::SeleniumWebDriver::SurrogateSeleniumElement
47
+ end
48
+
49
+ it "should know it is not exist" do
50
+ selenium_browser.should_receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
51
+ page = SeleniumTestPageObject.new(selenium_browser)
52
+ page.link_element(:text => 'blah').element.exists?.should be false
53
+ end
54
+
55
+ it "should know it is not visible" do
56
+ selenium_browser.should_receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
57
+ page = SeleniumTestPageObject.new(selenium_browser)
58
+ page.link_element(:text => 'blah').element.should_not be_visible
59
+ end
60
+
61
+ it "should raise an error when actions are requested" do
62
+ selenium_browser.should_receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
63
+ page = SeleniumTestPageObject.new(selenium_browser)
64
+ element = page.link_element(:text => 'blah')
65
+ expect { element.text }.to raise_error
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe PageObject::Platforms::SeleniumWebDriver do
5
+
6
+ it "should be registered as an adapter" do
7
+ PageObject::Platforms.get[:selenium_webdriver].should be PageObject::Platforms::SeleniumWebDriver
8
+
9
+ end
10
+ describe 'create page object' do
11
+ let(:browser) { double('browser') }
12
+ let(:subject) { PageObject::Platforms::SeleniumWebDriver.create_page_object(browser) }
13
+
14
+ it "should create a SeleniumPageObject" do
15
+ subject.should be_kind_of PageObject::Platforms::SeleniumWebDriver::PageObject
16
+ end
17
+ end
18
+
19
+ describe "is for?" do
20
+ it "should be true when the browser is a selenium driver" do
21
+ browser = mock_selenium_browser()
22
+ PageObject::Platforms::SeleniumWebDriver.is_for?(browser).should == true
23
+ end
24
+
25
+ it "should be false when the browser is anything else" do
26
+ PageObject::Platforms::SeleniumWebDriver.is_for?("asdf").should == false
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe PageObject::Platforms::WatirWebDriver do
4
+ describe "create page object" do
5
+ let(:browser) { double('browser') }
6
+ let(:subject) { PageObject::Platforms::WatirWebDriver.create_page_object(browser) }
7
+
8
+ it "should create a WatirPageObject" do
9
+ subject.should be_kind_of PageObject::Platforms::WatirWebDriver::PageObject
10
+ end
11
+
12
+ it "should give the watir page object the browser" do
13
+ subject.browser.should be browser
14
+ end
15
+ end
16
+
17
+ describe "is for?" do
18
+ it "should be true when the browser is Watir::Browser" do
19
+ browser = mock_watir_browser()
20
+ PageObject::Platforms::WatirWebDriver.is_for?(browser).should be true
21
+ end
22
+
23
+ it "should be false at any other point" do
24
+ browser = 'asdf'
25
+ PageObject::Platforms::WatirWebDriver.is_for?('asdf').should be false
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe PageObject::Platforms::WatirWebDriver do
4
+
5
+ it "should be in the PageObjects Adapters list" do
6
+ PageObject::Platforms.get[:watir_webdriver].should be PageObject::Platforms::WatirWebDriver
7
+ end
8
+
9
+ end