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,61 @@
1
+ require 'spec_helper'
2
+
3
+ class TestClass
4
+ include PageObject::JavascriptFrameworkFacade
5
+ end
6
+
7
+
8
+ describe PageObject::JavascriptFrameworkFacade do
9
+ let(:facade) { PageObject::JavascriptFrameworkFacade }
10
+
11
+ it "should allow the selection of a javascript framework" do
12
+ facade.framework = :jquery
13
+ facade.framework.should == :jquery
14
+ end
15
+
16
+ it "should register the jQuery script builder" do
17
+ facade.framework = :jquery
18
+ facade.script_builder.should == ::PageObject::Javascript::JQuery
19
+ end
20
+
21
+ it "should return script for pending requests in jQuery" do
22
+ facade.framework = :jquery
23
+ facade.pending_requests.should == 'return jQuery.active'
24
+ end
25
+
26
+ it "should register the Prototype script builder" do
27
+ facade.framework = :prototype
28
+ facade.script_builder.should == ::PageObject::Javascript::Prototype
29
+ end
30
+
31
+ it "should return script for pending requests in Prototype" do
32
+ facade.framework = :prototype
33
+ facade.pending_requests.should == 'return Ajax.activeRequestCount'
34
+ end
35
+
36
+ it "should not allow you to set the framework to one it does not know about" do
37
+ expect{ facade.framework = :blah }.to raise_error
38
+ end
39
+
40
+ it "should allow you to add a new javascript framework" do
41
+ module GoodFake
42
+ def self.pending_requests
43
+ "fake"
44
+ end
45
+ end
46
+
47
+ facade.add_framework(:blah, GoodFake)
48
+ facade.framework = :blah
49
+ facade.pending_requests.should == "fake"
50
+ end
51
+
52
+ it "should not allow you to add a new javascript framework that is invalid" do
53
+ module BadFake
54
+ def self.blah
55
+ end
56
+ end
57
+
58
+ expect{ facade.add_framework(:blah, BadFake) }.to raise_error
59
+ end
60
+ end
61
+
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ class TestLoadsPlatform
3
+ include PageObject::LoadsPlatform
4
+ end
5
+ describe TestLoadsPlatform do
6
+ let(:subject) { TestLoadsPlatform.new }
7
+ let(:adapters) { {} }
8
+
9
+ context "when browser x is registered with platform nom_nom_nom" do
10
+ let(:browser_x) { double('browser') }
11
+ before { adapters[:browser_x] = mock_adapter(browser_x, :nom_nom_nom) }
12
+
13
+ it "returns platform nom_nom_nom when asked about browser_x" do
14
+ subject.load_platform(browser_x, adapters).should == :nom_nom_nom
15
+ end
16
+
17
+ context "when browser a is registered with platform boom_boom_boom" do
18
+ let(:browser_a) { double('browser') }
19
+ before { adapters[:browser_a] = mock_adapter(browser_a, :boom_boom_boom) }
20
+
21
+ it "should return platform nom_nom_nom when asked about browser_x" do
22
+ subject.load_platform(browser_x, adapters).should == :nom_nom_nom
23
+ end
24
+ end
25
+ end
26
+
27
+ context "when browser a is registered with platform boom_boom_boom" do
28
+ let(:browser_n) { double('browser') }
29
+ before { adapters[:browser_n] = mock_adapter(browser_n, :boom_boom_boom) }
30
+
31
+ it "should return platform boom_boom_boom" do
32
+ subject.load_platform(browser_n, adapters).should == :boom_boom_boom
33
+ end
34
+ end
35
+
36
+ context "When an unknow object is passed in" do
37
+ let(:basic_message) { 'Unable to pick a platform for the provided browser.' }
38
+
39
+ it "should throw an exception" do
40
+ expect {
41
+ subject.load_platform("browser", {})
42
+ }.to raise_error(basic_message)
43
+ end
44
+
45
+ it "should notify when the browser is nil" do
46
+ begin
47
+ subject.load_platform(nil, {})
48
+ rescue Exception => e
49
+ e.message.should == "#{basic_message}\nnil was passed to the PageObject constructor instead of a valid browser object."
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,405 @@
1
+ require 'spec_helper'
2
+
3
+ class PageObjectTestPageObject
4
+ include PageObject
5
+ end
6
+
7
+ class CustomPlatform
8
+ end
9
+
10
+ describe PageObject do
11
+ let(:watir_browser) { mock_watir_browser }
12
+ let(:selenium_browser) { mock_selenium_browser }
13
+ let(:watir_page_object) { PageObjectTestPageObject.new(watir_browser) }
14
+ let(:selenium_page_object) { PageObjectTestPageObject.new(selenium_browser) }
15
+
16
+ context "setting values on the PageObject module" do
17
+ it "should set the javascript framework" do
18
+ PageObject::JavascriptFrameworkFacade.should_receive(:framework=)
19
+ PageObject.javascript_framework = :foo
20
+ end
21
+
22
+ it "should add a new Javascript Framework" do
23
+ PageObject::JavascriptFrameworkFacade.should_receive(:add_framework)
24
+ PageObject.add_framework(:foo, :bar)
25
+ end
26
+
27
+ it "should set a default page wait value" do
28
+ PageObject.default_page_wait = 20
29
+ wait = PageObject.instance_variable_get("@page_wait")
30
+ wait.should == 20
31
+ end
32
+
33
+ it "should provide the default page wait value" do
34
+ PageObject.instance_variable_set("@page_wait", 10)
35
+ PageObject.default_page_wait.should == 10
36
+ end
37
+
38
+ it "should default the page wait value to 30" do
39
+ PageObject.instance_variable_set("@page_wait", nil)
40
+ PageObject.default_page_wait.should == 30
41
+ end
42
+
43
+ it "should set the default element wait value" do
44
+ PageObject.default_element_wait = 20
45
+ wait = PageObject.instance_variable_get("@element_wait")
46
+ wait.should == 20
47
+ end
48
+
49
+ it "should provide the default element wait value" do
50
+ PageObject.instance_variable_set("@element_wait", 10)
51
+ PageObject.default_element_wait.should == 10
52
+ end
53
+
54
+ it "should default the element wait to 5" do
55
+ PageObject.instance_variable_set("@element_wait", nil)
56
+ PageObject.default_element_wait.should == 5
57
+ end
58
+ end
59
+
60
+ context "setting values on the PageObject class instance" do
61
+ it "should set the params value" do
62
+ PageObjectTestPageObject.params = {:some => :value}
63
+ params = PageObjectTestPageObject.instance_variable_get("@params")
64
+ params[:some].should == :value
65
+ end
66
+
67
+ it "should provide the params value" do
68
+ PageObjectTestPageObject.instance_variable_set("@params", {:value => :updated})
69
+ PageObjectTestPageObject.params[:value].should == :updated
70
+ end
71
+
72
+ it "should default the params to an empty hash" do
73
+ PageObjectTestPageObject.instance_variable_set("@params", nil)
74
+ PageObjectTestPageObject.params.should == {}
75
+ end
76
+ end
77
+
78
+ context "when created with a watir-webdriver browser" do
79
+ it "should include the WatirPageObject module" do
80
+ watir_page_object.platform.should be_kind_of PageObject::Platforms::WatirWebDriver::PageObject
81
+ end
82
+ end
83
+
84
+ context "when created with a selenium browser" do
85
+ it "should include the SeleniumPageObject module" do
86
+ selenium_page_object.platform.should be_kind_of PageObject::Platforms::SeleniumWebDriver::PageObject
87
+ end
88
+ end
89
+
90
+ context "when created with a non_bundled adapter" do
91
+ let(:custom_adapter) { mock_adapter(:custom_browser, CustomPlatform) }
92
+ it "should be an instance of whatever that objects adapter is" do
93
+ mock_adapters({:custom_adapter=>custom_adapter})
94
+ custom_page_object = PageObjectTestPageObject.new(:custom_browser)
95
+ custom_page_object.platform.should be custom_adapter.create_page_object
96
+ end
97
+ end
98
+
99
+ context "when created with an object we do not understand" do
100
+ it "should throw an error" do
101
+ expect {
102
+ TestPageObject.new("blah")
103
+ }.to raise_error
104
+ end
105
+ end
106
+
107
+ describe "page level functionality" do
108
+ context "for all drivers" do
109
+ it "should try a second time after sleeping when attach to window fails" do
110
+ watir_page_object.platform.should_receive(:attach_to_window).once.and_throw "error"
111
+ watir_page_object.platform.should_receive(:attach_to_window)
112
+ watir_page_object.attach_to_window("blah")
113
+ end
114
+
115
+ it "should call initialize_page if it exists" do
116
+ class CallbackPage
117
+ include PageObject
118
+ attr_reader :initialize_page_called
119
+
120
+ def initialize_page
121
+ @initialize_page_called = true
122
+ end
123
+ end
124
+
125
+ @page = CallbackPage.new(watir_browser)
126
+ @page.initialize_page_called.should be true
127
+ end
128
+
129
+ it "should call initialize_accessors if it exists" do
130
+ class CallbackPage
131
+ include PageObject
132
+ attr_reader :initialize_accessors_called
133
+
134
+ def initialize_accessors
135
+ @initialize_accessors_called = true
136
+ end
137
+ end
138
+
139
+ @page = CallbackPage.new(watir_browser)
140
+ @page.initialize_accessors_called.should be true
141
+ end
142
+
143
+ it "should call initialize_accessors before initialize_page if both exist" do
144
+ class CallbackPage
145
+ include PageObject
146
+ attr_reader :initialize_page, :initialize_accessors
147
+
148
+ def initialize_page
149
+ @initialize_accessors = Time.now
150
+ end
151
+
152
+ def initialize_page
153
+ @initialize_accessors = Time.now
154
+ end
155
+ end
156
+
157
+ @page = CallbackPage.new(watir_browser)
158
+ @page.initialize_accessors.usec.should be <= @page.initialize_page.usec
159
+ end
160
+
161
+ it "should know which element has focus" do
162
+ watir_browser.should_receive(:execute_script).and_return(watir_browser)
163
+ watir_browser.should_receive(:tag_name).twice.and_return(:input)
164
+ watir_browser.should_receive(:type).and_return(:submit)
165
+ watir_page_object.element_with_focus.class.should == PageObject::Elements::Button
166
+ end
167
+ end
168
+
169
+ context "when using WatirPageObject" do
170
+ it "should display the page text" do
171
+ watir_browser.should_receive(:text).and_return("browser text")
172
+ watir_page_object.text.should == "browser text"
173
+ end
174
+
175
+ it "should display the html of the page" do
176
+ watir_browser.should_receive(:html).and_return("<html>Some Sample HTML</html>")
177
+ watir_page_object.html.should == "<html>Some Sample HTML</html>"
178
+ end
179
+
180
+ it "should display the title of the page" do
181
+ watir_browser.should_receive(:title).and_return("I am the title of a page")
182
+ watir_page_object.title.should == "I am the title of a page"
183
+ end
184
+
185
+ it "should be able to navigate to a page" do
186
+ watir_browser.should_receive(:goto).with("cheezyworld.com")
187
+ watir_page_object.navigate_to("cheezyworld.com")
188
+ end
189
+
190
+ it "should wait until a block returns true" do
191
+ watir_browser.should_receive(:wait_until).with(5, "too long")
192
+ watir_page_object.wait_until(5, "too long")
193
+ end
194
+
195
+ it "should use the overriden timeout value when set" do
196
+ PageObject.default_page_wait = 10
197
+ watir_browser.should_receive(:wait_until).with(10, nil)
198
+ watir_page_object.wait_until
199
+ end
200
+
201
+ it "should wait until there are no pending ajax requests" do
202
+ PageObject::JavascriptFrameworkFacade.should_receive(:pending_requests).and_return('pending requests')
203
+ watir_browser.should_receive(:execute_script).with('pending requests').and_return(0)
204
+ watir_page_object.wait_for_ajax
205
+ end
206
+
207
+ it "should override alert popup behavior" do
208
+ watir_browser.should_receive(:alert).exactly(3).times.and_return(watir_browser)
209
+ watir_browser.should_receive(:exists?).and_return(true)
210
+ watir_browser.should_receive(:text)
211
+ watir_browser.should_receive(:ok)
212
+ watir_page_object.alert do
213
+ end
214
+ end
215
+
216
+ it "should override confirm popup behavior" do
217
+ watir_browser.should_receive(:alert).exactly(3).times.and_return(watir_browser)
218
+ watir_browser.should_receive(:exists?).and_return(true)
219
+ watir_browser.should_receive(:text)
220
+ watir_browser.should_receive(:ok)
221
+ watir_page_object.confirm(true) do
222
+ end
223
+ end
224
+
225
+ it "should override prompt popup behavior" do
226
+ watir_browser.should_receive(:wd).twice.and_return(watir_browser)
227
+ watir_browser.should_receive(:execute_script).twice
228
+ watir_page_object.prompt("blah") do
229
+ end
230
+ end
231
+
232
+ it "should execute javascript on the browser" do
233
+ watir_browser.should_receive(:execute_script).and_return("abc")
234
+ watir_page_object.execute_script("333").should == "abc"
235
+ end
236
+
237
+ it "should convert a modal popup to a window" do
238
+ watir_browser.should_receive(:execute_script)
239
+ watir_page_object.modal_dialog {}
240
+ end
241
+
242
+ it "should switch to a new window with a given title" do
243
+ watir_browser.should_receive(:window).with(:title => /My\ Title/).and_return(watir_browser)
244
+ watir_browser.should_receive(:use)
245
+ watir_page_object.attach_to_window(:title => "My Title")
246
+ end
247
+
248
+ it "should switch to a new window with a given url" do
249
+ watir_browser.should_receive(:window).with(:url => /success\.html/).and_return(watir_browser)
250
+ watir_browser.should_receive(:use)
251
+ watir_page_object.attach_to_window(:url => "success.html")
252
+ end
253
+
254
+ it "should refresh the page contents" do
255
+ watir_browser.should_receive(:refresh)
256
+ watir_page_object.refresh
257
+ end
258
+
259
+ it "should know how to go back" do
260
+ watir_browser.should_receive(:back)
261
+ watir_page_object.back
262
+ end
263
+
264
+ it "should know how to go forward" do
265
+ watir_browser.should_receive(:forward)
266
+ watir_page_object.forward
267
+ end
268
+
269
+ it "should know its' current url" do
270
+ watir_browser.should_receive(:url).and_return("cheezyworld.com")
271
+ watir_page_object.current_url.should == "cheezyworld.com"
272
+ end
273
+
274
+ it "should know how to clear all of the cookies from the browser" do
275
+ watir_browser.should_receive(:cookies).and_return(watir_browser)
276
+ watir_browser.should_receive(:clear)
277
+ watir_page_object.clear_cookies
278
+ end
279
+
280
+ it "should be able to save a screenshot" do
281
+ watir_browser.should_receive(:wd).and_return(watir_browser)
282
+ watir_browser.should_receive(:save_screenshot)
283
+ watir_page_object.save_screenshot("test.png")
284
+ end
285
+ end
286
+
287
+ context "when using SeleniumPageObject" do
288
+ it "should display the page text" do
289
+ selenium_browser.stub_chain(:find_element, :text).and_return("browser text")
290
+ selenium_page_object.text.should == "browser text"
291
+ end
292
+
293
+ it "should display the html of the page" do
294
+ selenium_browser.should_receive(:page_source).and_return("<html>Some Sample HTML</html>")
295
+ selenium_page_object.html.should == "<html>Some Sample HTML</html>"
296
+ end
297
+
298
+ it "should display the title of the page" do
299
+ selenium_browser.should_receive(:title).and_return("I am the title of a page")
300
+ selenium_page_object.title.should == "I am the title of a page"
301
+ end
302
+
303
+ it "should be able to navigate to a page" do
304
+ selenium_browser.stub_chain(:navigate, :to).with('cheezyworld.com')
305
+ selenium_page_object.navigate_to('cheezyworld.com')
306
+ end
307
+
308
+ it "should wait until a block returns true" do
309
+ wait = double('wait')
310
+ Selenium::WebDriver::Wait.should_receive(:new).with({:timeout => 5, :message => 'too long'}).and_return(wait)
311
+ wait.should_receive(:until)
312
+ selenium_page_object.wait_until(5, 'too long')
313
+ end
314
+
315
+ it "should wait until there are no pending ajax requests" do
316
+ PageObject::JavascriptFrameworkFacade.should_receive(:pending_requests).and_return('pending requests')
317
+ selenium_browser.should_receive(:execute_script).with('pending requests').and_return(0)
318
+ selenium_page_object.wait_for_ajax
319
+ end
320
+
321
+ it "should override alert popup behavior" do
322
+ selenium_browser.should_receive(:switch_to).and_return(selenium_browser)
323
+ selenium_browser.should_receive(:alert).and_return(selenium_browser)
324
+ selenium_browser.should_receive(:text)
325
+ selenium_browser.should_receive(:accept)
326
+ selenium_page_object.alert do
327
+ end
328
+ end
329
+
330
+ it "should override confirm popup behavior" do
331
+ selenium_browser.should_receive(:switch_to).and_return(selenium_browser)
332
+ selenium_browser.should_receive(:alert).and_return(selenium_browser)
333
+ selenium_browser.should_receive(:text)
334
+ selenium_browser.should_receive(:accept)
335
+ selenium_page_object.confirm(true) do
336
+ end
337
+ end
338
+ it "should override prompt popup behavior" do
339
+ selenium_browser.should_receive(:execute_script).twice
340
+ selenium_page_object.prompt("blah") do
341
+ end
342
+ end
343
+
344
+ it "should convert a modal popup to a window" do
345
+ selenium_browser.should_receive(:execute_script)
346
+ selenium_page_object.modal_dialog {}
347
+ end
348
+
349
+ it "should execute javascript on the browser" do
350
+ selenium_browser.should_receive(:execute_script).and_return("abc")
351
+ selenium_page_object.execute_script("333").should == "abc"
352
+ end
353
+
354
+ it "should switch to a new window with a given title" do
355
+ selenium_browser.should_receive(:window_handles).and_return(["win1"])
356
+ selenium_browser.should_receive(:switch_to).twice.and_return(selenium_browser)
357
+ selenium_browser.should_receive(:window).twice.with("win1").and_return(selenium_browser)
358
+ selenium_browser.should_receive(:title).and_return("My Title")
359
+ selenium_page_object.attach_to_window(:title => "My Title")
360
+ end
361
+
362
+ it "should switch to a new window with a given url" do
363
+ selenium_browser.should_receive(:window_handles).and_return(["win1"])
364
+ selenium_browser.should_receive(:switch_to).twice.and_return(selenium_browser)
365
+ selenium_browser.should_receive(:window).twice.with("win1").and_return(selenium_browser)
366
+ selenium_browser.should_receive(:current_url).and_return("page.html")
367
+ selenium_page_object.attach_to_window(:url => "page.html")
368
+ end
369
+
370
+ it "should refresh the page contents" do
371
+ selenium_browser.should_receive(:navigate).and_return(selenium_browser)
372
+ selenium_browser.should_receive(:refresh)
373
+ selenium_page_object.refresh
374
+ end
375
+
376
+ it "should know how to go back" do
377
+ selenium_browser.should_receive(:navigate).and_return(selenium_browser)
378
+ selenium_browser.should_receive(:back)
379
+ selenium_page_object.back
380
+ end
381
+
382
+ it "should know how to go forward" do
383
+ selenium_browser.should_receive(:navigate).and_return(selenium_browser)
384
+ selenium_browser.should_receive(:forward)
385
+ selenium_page_object.forward
386
+ end
387
+
388
+ it "should know its' current url" do
389
+ selenium_browser.should_receive(:current_url).and_return("cheezyworld.com")
390
+ selenium_page_object.current_url.should == "cheezyworld.com"
391
+ end
392
+
393
+ it "should clear all of the cookies from the browser" do
394
+ selenium_browser.should_receive(:manage).and_return(selenium_browser)
395
+ selenium_browser.should_receive(:delete_all_cookies)
396
+ selenium_page_object.clear_cookies
397
+ end
398
+
399
+ it "should be able to save a screenshot" do
400
+ selenium_browser.should_receive(:save_screenshot)
401
+ selenium_page_object.save_screenshot("test.png")
402
+ end
403
+ end
404
+ end
405
+ end