page_object 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) 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 +7 -0
  7. data/ChangeLog +809 -0
  8. data/Gemfile +14 -0
  9. data/Guardfile +20 -0
  10. data/LICENSE +20 -0
  11. data/README.md +111 -0
  12. data/Rakefile +35 -0
  13. data/cucumber.yml +10 -0
  14. data/features/area.feature +35 -0
  15. data/features/async.feature +30 -0
  16. data/features/audio.feature +68 -0
  17. data/features/bold.feature +21 -0
  18. data/features/button.feature +98 -0
  19. data/features/canvas.feature +37 -0
  20. data/features/check_box.feature +55 -0
  21. data/features/div.feature +45 -0
  22. data/features/element.feature +322 -0
  23. data/features/file_field.feature +40 -0
  24. data/features/form.feature +43 -0
  25. data/features/frames.feature +75 -0
  26. data/features/generic_elements.feature +29 -0
  27. data/features/gxt_table_extension.feature +24 -0
  28. data/features/headings.feature +97 -0
  29. data/features/hidden_field.feature +45 -0
  30. data/features/html/04-Death_Becomes_Fur.mp4 +0 -0
  31. data/features/html/04-Death_Becomes_Fur.oga +0 -0
  32. data/features/html/async.html +36 -0
  33. data/features/html/double_click.html +13 -0
  34. data/features/html/failure.html +8 -0
  35. data/features/html/frame_1.html +18 -0
  36. data/features/html/frame_2.html +16 -0
  37. data/features/html/frame_3.html +14 -0
  38. data/features/html/frames.html +12 -0
  39. data/features/html/hover.html +12 -0
  40. data/features/html/iframes.html +12 -0
  41. data/features/html/images/circle.png +0 -0
  42. data/features/html/images/img_pulpit.jpg +0 -0
  43. data/features/html/images/submit.gif +0 -0
  44. data/features/html/indexed_property.html +55 -0
  45. data/features/html/modal.html +17 -0
  46. data/features/html/modal_1.html +38 -0
  47. data/features/html/modal_2.html +27 -0
  48. data/features/html/movie.mp4 +0 -0
  49. data/features/html/movie.ogg +0 -0
  50. data/features/html/multi_elements.html +144 -0
  51. data/features/html/nested_elements.html +77 -0
  52. data/features/html/nested_frame_1.html +1 -0
  53. data/features/html/nested_frame_2.html +11 -0
  54. data/features/html/nested_frame_3.html +14 -0
  55. data/features/html/nested_frames.html +10 -0
  56. data/features/html/planets.gif +0 -0
  57. data/features/html/static_elements.html +207 -0
  58. data/features/html/success.html +8 -0
  59. data/features/html/sun.gif +0 -0
  60. data/features/html/sun.html +7 -0
  61. data/features/image.feature +50 -0
  62. data/features/indexed_property.feature +117 -0
  63. data/features/javascript.feature +28 -0
  64. data/features/label.feature +46 -0
  65. data/features/link.feature +52 -0
  66. data/features/list_item.feature +36 -0
  67. data/features/modal_dialog.feature +15 -0
  68. data/features/multi_elements.feature +492 -0
  69. data/features/nested_elements.feature +117 -0
  70. data/features/ordered_list.feature +56 -0
  71. data/features/page_level_actions.feature +90 -0
  72. data/features/paragraph.feature +35 -0
  73. data/features/radio_button.feature +58 -0
  74. data/features/radio_button_group.feature +29 -0
  75. data/features/sample-app/public/jquery-1.3.2.js +4376 -0
  76. data/features/sample-app/public/jquery.html +30 -0
  77. data/features/sample-app/public/prototype-1.6.0.3.js +4320 -0
  78. data/features/sample-app/public/prototype.html +35 -0
  79. data/features/sample-app/sample_app.rb +35 -0
  80. data/features/section.feature +132 -0
  81. data/features/select_list.feature +86 -0
  82. data/features/span.feature +37 -0
  83. data/features/step_definitions/accessor_steps.rb +64 -0
  84. data/features/step_definitions/area_steps.rb +19 -0
  85. data/features/step_definitions/async_steps.rb +83 -0
  86. data/features/step_definitions/audio_steps.rb +27 -0
  87. data/features/step_definitions/bold_steps.rb +12 -0
  88. data/features/step_definitions/button_steps.rb +48 -0
  89. data/features/step_definitions/canvas_steps.rb +15 -0
  90. data/features/step_definitions/check_box_steps.rb +35 -0
  91. data/features/step_definitions/div_steps.rb +19 -0
  92. data/features/step_definitions/element_steps.rb +266 -0
  93. data/features/step_definitions/file_field_steps.rb +19 -0
  94. data/features/step_definitions/form_steps.rb +19 -0
  95. data/features/step_definitions/frames_steps.rb +159 -0
  96. data/features/step_definitions/generic_element_steps.rb +31 -0
  97. data/features/step_definitions/gxt_table_steps.rb +58 -0
  98. data/features/step_definitions/headings_steps.rb +12 -0
  99. data/features/step_definitions/hidden_field_steps.rb +27 -0
  100. data/features/step_definitions/image_steps.rb +27 -0
  101. data/features/step_definitions/indexed_property_steps.rb +163 -0
  102. data/features/step_definitions/javascript_steps.rb +53 -0
  103. data/features/step_definitions/label_steps.rb +19 -0
  104. data/features/step_definitions/link_steps.rb +40 -0
  105. data/features/step_definitions/list_item_steps.rb +19 -0
  106. data/features/step_definitions/modal_dialog_steps.rb +62 -0
  107. data/features/step_definitions/multi_elements_steps.rb +541 -0
  108. data/features/step_definitions/nested_elements_steps.rb +212 -0
  109. data/features/step_definitions/ordered_list_steps.rb +23 -0
  110. data/features/step_definitions/page_level_actions_steps.rb +135 -0
  111. data/features/step_definitions/page_traversal_steps.rb +4 -0
  112. data/features/step_definitions/paragraph_steps.rb +28 -0
  113. data/features/step_definitions/radio_button_group_steps.rb +36 -0
  114. data/features/step_definitions/radio_button_steps.rb +27 -0
  115. data/features/step_definitions/section_steps.rb +268 -0
  116. data/features/step_definitions/select_list_steps.rb +65 -0
  117. data/features/step_definitions/span_steps.rb +19 -0
  118. data/features/step_definitions/table_cell_steps.rb +15 -0
  119. data/features/step_definitions/table_row_steps.rb +23 -0
  120. data/features/step_definitions/table_steps.rb +70 -0
  121. data/features/step_definitions/text_area_steps.rb +35 -0
  122. data/features/step_definitions/text_field_steps.rb +35 -0
  123. data/features/step_definitions/unordered_list_steps.rb +23 -0
  124. data/features/step_definitions/video_steps.rb +45 -0
  125. data/features/support/ajax_text_environment.rb +26 -0
  126. data/features/support/env.rb +8 -0
  127. data/features/support/hooks.rb +8 -0
  128. data/features/support/page.rb +382 -0
  129. data/features/support/persistent_browser.rb +70 -0
  130. data/features/support/targets/firefox14_osx.rb +6 -0
  131. data/features/support/targets/firefox14_windows7.rb +6 -0
  132. data/features/support/url_helper.rb +57 -0
  133. data/features/table.feature +122 -0
  134. data/features/table_cell.feature +45 -0
  135. data/features/table_row.feature +43 -0
  136. data/features/text_area.feature +51 -0
  137. data/features/text_field.feature +70 -0
  138. data/features/unordered_list.feature +56 -0
  139. data/features/video.feature +73 -0
  140. data/lib/page-object.rb +421 -0
  141. data/lib/page-object/accessors.rb +1412 -0
  142. data/lib/page-object/core_ext/string.rb +5 -0
  143. data/lib/page-object/element_locators.rb +21 -0
  144. data/lib/page-object/elements.rb +60 -0
  145. data/lib/page-object/elements/area.rb +31 -0
  146. data/lib/page-object/elements/audio.rb +9 -0
  147. data/lib/page-object/elements/bold.rb +11 -0
  148. data/lib/page-object/elements/button.rb +35 -0
  149. data/lib/page-object/elements/canvas.rb +23 -0
  150. data/lib/page-object/elements/check_box.rb +37 -0
  151. data/lib/page-object/elements/div.rb +19 -0
  152. data/lib/page-object/elements/element.rb +226 -0
  153. data/lib/page-object/elements/file_field.rb +38 -0
  154. data/lib/page-object/elements/form.rb +36 -0
  155. data/lib/page-object/elements/heading.rb +15 -0
  156. data/lib/page-object/elements/hidden_field.rb +22 -0
  157. data/lib/page-object/elements/image.rb +36 -0
  158. data/lib/page-object/elements/label.rb +19 -0
  159. data/lib/page-object/elements/link.rb +46 -0
  160. data/lib/page-object/elements/list_item.rb +19 -0
  161. data/lib/page-object/elements/media.rb +45 -0
  162. data/lib/page-object/elements/option.rb +10 -0
  163. data/lib/page-object/elements/ordered_list.rb +50 -0
  164. data/lib/page-object/elements/paragraph.rb +9 -0
  165. data/lib/page-object/elements/radio_button.rb +37 -0
  166. data/lib/page-object/elements/select_list.rb +42 -0
  167. data/lib/page-object/elements/span.rb +19 -0
  168. data/lib/page-object/elements/table.rb +79 -0
  169. data/lib/page-object/elements/table_cell.rb +28 -0
  170. data/lib/page-object/elements/table_row.rb +50 -0
  171. data/lib/page-object/elements/text_area.rb +38 -0
  172. data/lib/page-object/elements/text_field.rb +42 -0
  173. data/lib/page-object/elements/unordered_list.rb +51 -0
  174. data/lib/page-object/elements/video.rb +18 -0
  175. data/lib/page-object/indexed_properties.rb +40 -0
  176. data/lib/page-object/javascript/angularjs.rb +14 -0
  177. data/lib/page-object/javascript/jquery.rb +14 -0
  178. data/lib/page-object/javascript/prototype.rb +14 -0
  179. data/lib/page-object/javascript/yui.rb +19 -0
  180. data/lib/page-object/javascript_framework_facade.rb +80 -0
  181. data/lib/page-object/loads_platform.rb +45 -0
  182. data/lib/page-object/locator_generator.rb +131 -0
  183. data/lib/page-object/nested_elements.rb +17 -0
  184. data/lib/page-object/page_factory.rb +108 -0
  185. data/lib/page-object/page_populator.rb +83 -0
  186. data/lib/page-object/platforms.rb +18 -0
  187. data/lib/page-object/platforms/selenium_webdriver.rb +30 -0
  188. data/lib/page-object/platforms/selenium_webdriver/button.rb +15 -0
  189. data/lib/page-object/platforms/selenium_webdriver/check_box.rb +29 -0
  190. data/lib/page-object/platforms/selenium_webdriver/element.rb +291 -0
  191. data/lib/page-object/platforms/selenium_webdriver/file_field.rb +16 -0
  192. data/lib/page-object/platforms/selenium_webdriver/form.rb +16 -0
  193. data/lib/page-object/platforms/selenium_webdriver/image.rb +28 -0
  194. data/lib/page-object/platforms/selenium_webdriver/link.rb +23 -0
  195. data/lib/page-object/platforms/selenium_webdriver/ordered_list.rb +39 -0
  196. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +1237 -0
  197. data/lib/page-object/platforms/selenium_webdriver/radio_button.rb +22 -0
  198. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +93 -0
  199. data/lib/page-object/platforms/selenium_webdriver/surrogate_selenium_element.rb +42 -0
  200. data/lib/page-object/platforms/selenium_webdriver/table.rb +42 -0
  201. data/lib/page-object/platforms/selenium_webdriver/table_row.rb +43 -0
  202. data/lib/page-object/platforms/selenium_webdriver/text_area.rb +17 -0
  203. data/lib/page-object/platforms/selenium_webdriver/text_field.rb +17 -0
  204. data/lib/page-object/platforms/selenium_webdriver/unordered_list.rb +39 -0
  205. data/lib/page-object/platforms/watir_webdriver.rb +30 -0
  206. data/lib/page-object/platforms/watir_webdriver/check_box.rb +29 -0
  207. data/lib/page-object/platforms/watir_webdriver/element.rb +249 -0
  208. data/lib/page-object/platforms/watir_webdriver/file_field.rb +16 -0
  209. data/lib/page-object/platforms/watir_webdriver/form.rb +16 -0
  210. data/lib/page-object/platforms/watir_webdriver/image.rb +22 -0
  211. data/lib/page-object/platforms/watir_webdriver/link.rb +15 -0
  212. data/lib/page-object/platforms/watir_webdriver/ordered_list.rb +35 -0
  213. data/lib/page-object/platforms/watir_webdriver/page_object.rb +1082 -0
  214. data/lib/page-object/platforms/watir_webdriver/radio_button.rb +22 -0
  215. data/lib/page-object/platforms/watir_webdriver/select_list.rb +74 -0
  216. data/lib/page-object/platforms/watir_webdriver/table.rb +38 -0
  217. data/lib/page-object/platforms/watir_webdriver/table_row.rb +37 -0
  218. data/lib/page-object/platforms/watir_webdriver/text_area.rb +23 -0
  219. data/lib/page-object/platforms/watir_webdriver/text_field.rb +16 -0
  220. data/lib/page-object/platforms/watir_webdriver/unordered_list.rb +36 -0
  221. data/lib/page-object/sections.rb +29 -0
  222. data/lib/page-object/version.rb +4 -0
  223. data/lib/page-object/widgets.rb +133 -0
  224. data/page_object.gemspec +31 -0
  225. data/pageobject.gems +1 -0
  226. data/spec/page-object/accessors_spec.rb +40 -0
  227. data/spec/page-object/element_locators_spec.rb +1122 -0
  228. data/spec/page-object/elements/area_spec.rb +45 -0
  229. data/spec/page-object/elements/bold_spec.rb +29 -0
  230. data/spec/page-object/elements/button_spec.rb +64 -0
  231. data/spec/page-object/elements/canvas_spec.rb +40 -0
  232. data/spec/page-object/elements/check_box_spec.rb +49 -0
  233. data/spec/page-object/elements/div_spec.rb +28 -0
  234. data/spec/page-object/elements/element_spec.rb +114 -0
  235. data/spec/page-object/elements/file_field_spec.rb +39 -0
  236. data/spec/page-object/elements/form_spec.rb +28 -0
  237. data/spec/page-object/elements/heading_spec.rb +48 -0
  238. data/spec/page-object/elements/hidden_field_spec.rb +28 -0
  239. data/spec/page-object/elements/image_spec.rb +66 -0
  240. data/spec/page-object/elements/label_spec.rb +29 -0
  241. data/spec/page-object/elements/link_spec.rb +49 -0
  242. data/spec/page-object/elements/list_item_spec.rb +29 -0
  243. data/spec/page-object/elements/nested_element_spec.rb +254 -0
  244. data/spec/page-object/elements/option_spec.rb +11 -0
  245. data/spec/page-object/elements/ordered_list_spec.rb +94 -0
  246. data/spec/page-object/elements/paragraph_spec.rb +27 -0
  247. data/spec/page-object/elements/select_list_spec.rb +142 -0
  248. data/spec/page-object/elements/selenium/radio_button_spec.rb +44 -0
  249. data/spec/page-object/elements/selenium/text_field_spec.rb +49 -0
  250. data/spec/page-object/elements/selenium_element_spec.rb +177 -0
  251. data/spec/page-object/elements/span_spec.rb +26 -0
  252. data/spec/page-object/elements/table_cell_spec.rb +21 -0
  253. data/spec/page-object/elements/table_row_spec.rb +70 -0
  254. data/spec/page-object/elements/table_spec.rb +98 -0
  255. data/spec/page-object/elements/text_area_spec.rb +39 -0
  256. data/spec/page-object/elements/unordered_list_spec.rb +94 -0
  257. data/spec/page-object/elements/watir_element_spec.rb +145 -0
  258. data/spec/page-object/javascript_framework_facade_spec.rb +61 -0
  259. data/spec/page-object/loads_platform_spec.rb +53 -0
  260. data/spec/page-object/page-object_spec.rb +407 -0
  261. data/spec/page-object/page_factory_spec.rb +238 -0
  262. data/spec/page-object/page_populator_spec.rb +122 -0
  263. data/spec/page-object/page_section_spec.rb +73 -0
  264. data/spec/page-object/platforms/selenium_webdriver/selenium_page_object_spec.rb +68 -0
  265. data/spec/page-object/platforms/selenium_webdriver_spec.rb +29 -0
  266. data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +29 -0
  267. data/spec/page-object/platforms/watir_webdriver_spec.rb +9 -0
  268. data/spec/page-object/selenium_accessors_spec.rb +609 -0
  269. data/spec/page-object/watir_accessors_spec.rb +1134 -0
  270. data/spec/page-object/widget_spec.rb +226 -0
  271. data/spec/spec_helper.rb +47 -0
  272. metadata +601 -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
+ expect(facade.framework).to eql :jquery
14
+ end
15
+
16
+ it "should register the jQuery script builder" do
17
+ facade.framework = :jquery
18
+ expect(facade.script_builder).to eql ::PageObject::Javascript::JQuery
19
+ end
20
+
21
+ it "should return script for pending requests in jQuery" do
22
+ facade.framework = :jquery
23
+ expect(facade.pending_requests).to eql 'return jQuery.active'
24
+ end
25
+
26
+ it "should register the Prototype script builder" do
27
+ facade.framework = :prototype
28
+ expect(facade.script_builder).to eql ::PageObject::Javascript::Prototype
29
+ end
30
+
31
+ it "should return script for pending requests in Prototype" do
32
+ facade.framework = :prototype
33
+ expect(facade.pending_requests).to eql '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
+ expect(facade.pending_requests).to eql "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
+ expect(subject.load_platform(browser_x, adapters)).to eql :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
+ expect(subject.load_platform(browser_x, adapters)).to eql :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
+ expect(subject.load_platform(browser_n, adapters)).to eql :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 or element:' }
38
+
39
+ it "should throw an exception" do
40
+ expect {
41
+ subject.load_platform("browser", {})
42
+ }.to raise_error("#{basic_message} \"browser\".")
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
+ expect(e.message).to eql "#{basic_message} nil.\nnil was passed to the PageObject constructor instead of a valid browser or element object."
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,407 @@
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
+ expect(PageObject::JavascriptFrameworkFacade).to receive(:framework=)
19
+ PageObject.javascript_framework = :foo
20
+ end
21
+
22
+ it "should add a new Javascript Framework" do
23
+ expect(PageObject::JavascriptFrameworkFacade).to 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
+ expect(wait).to eql 20
31
+ end
32
+
33
+ it "should provide the default page wait value" do
34
+ PageObject.instance_variable_set("@page_wait", 10)
35
+ expect(PageObject.default_page_wait).to eql 10
36
+ end
37
+
38
+ it "should default the page wait value to 30" do
39
+ PageObject.instance_variable_set("@page_wait", nil)
40
+ expect(PageObject.default_page_wait).to eql 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
+ expect(wait).to eql 20
47
+ end
48
+
49
+ it "should provide the default element wait value" do
50
+ PageObject.instance_variable_set("@element_wait", 10)
51
+ expect(PageObject.default_element_wait).to eql 10
52
+ end
53
+
54
+ it "should default the element wait to 5" do
55
+ PageObject.instance_variable_set("@element_wait", nil)
56
+ expect(PageObject.default_element_wait).to eql 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
+ expect(params[:some]).to eql :value
65
+ end
66
+
67
+ it "should provide the params value" do
68
+ PageObjectTestPageObject.instance_variable_set("@params", {:value => :updated})
69
+ expect(PageObjectTestPageObject.params[:value]).to eql :updated
70
+ end
71
+
72
+ it "should default the params to an empty hash" do
73
+ PageObjectTestPageObject.instance_variable_set("@params", nil)
74
+ expect(PageObjectTestPageObject.params).to eql Hash.new
75
+ end
76
+ end
77
+
78
+ context "when created with a watir-webdriver browser" do
79
+ it "should include the WatirPageObject module" do
80
+ expect(watir_page_object.platform).to 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
+ expect(selenium_page_object.platform).to 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
+
93
+ it "should be an instance of whatever that objects adapter is" do
94
+ mock_adapters({:custom_adapter=>custom_adapter})
95
+ custom_page_object = PageObjectTestPageObject.new(:custom_browser)
96
+ expect(custom_page_object.platform).to be custom_adapter.create_page_object
97
+ end
98
+ end
99
+
100
+ context "when created with an object we do not understand" do
101
+ it "should throw an error" do
102
+ expect {
103
+ TestPageObject.new("blah")
104
+ }.to raise_error
105
+ end
106
+ end
107
+
108
+ describe "page level functionality" do
109
+ context "for all drivers" do
110
+ it "should try a second time after sleeping when attach to window fails" do
111
+ expect(watir_page_object.platform).to receive(:attach_to_window).once.and_throw "error"
112
+ expect(watir_page_object.platform).to receive(:attach_to_window)
113
+ watir_page_object.attach_to_window("blah")
114
+ end
115
+
116
+ it "should call initialize_page if it exists" do
117
+ class CallbackPage
118
+ include PageObject
119
+ attr_reader :initialize_page_called
120
+
121
+ def initialize_page
122
+ @initialize_page_called = true
123
+ end
124
+ end
125
+
126
+ @page = CallbackPage.new(watir_browser)
127
+ expect(@page.initialize_page_called).to be true
128
+ end
129
+
130
+ it "should call initialize_accessors if it exists" do
131
+ class CallbackPage
132
+ include PageObject
133
+ attr_reader :initialize_accessors_called
134
+
135
+ def initialize_accessors
136
+ @initialize_accessors_called = true
137
+ end
138
+ end
139
+
140
+ @page = CallbackPage.new(watir_browser)
141
+ expect(@page.initialize_accessors_called).to be true
142
+ end
143
+
144
+ it "should call initialize_accessors before initialize_page if both exist" do
145
+ class CallbackPage
146
+ include PageObject
147
+ attr_reader :initialize_page, :initialize_accessors
148
+
149
+ def initialize_page
150
+ @initialize_accessors = Time.now
151
+ end
152
+
153
+ def initialize_page
154
+ @initialize_accessors = Time.now
155
+ end
156
+ end
157
+
158
+ @page = CallbackPage.new(watir_browser)
159
+ expect(@page.initialize_accessors.usec).to be <= @page.initialize_page.usec
160
+ end
161
+
162
+ it "should know which element has focus" do
163
+ expect(watir_browser).to receive(:execute_script).and_return(watir_browser)
164
+ expect(watir_browser).to receive(:tag_name).twice.and_return(:input)
165
+ expect(watir_browser).to receive(:type).and_return(:submit)
166
+ expect(watir_page_object.element_with_focus.class).to eql PageObject::Elements::Button
167
+ end
168
+ end
169
+
170
+ context "when using WatirPageObject" do
171
+ it "should display the page text" do
172
+ expect(watir_browser).to receive(:element).and_return(watir_browser)
173
+ expect(watir_browser).to receive(:text).and_return("browser text")
174
+ expect(watir_page_object.text).to eql "browser text"
175
+ end
176
+
177
+ it "should display the html of the page" do
178
+ expect(watir_browser).to receive(:html).and_return("<html>Some Sample HTML</html>")
179
+ expect(watir_page_object.html).to eql "<html>Some Sample HTML</html>"
180
+ end
181
+
182
+ it "should display the title of the page" do
183
+ expect(watir_browser).to receive(:title).and_return("I am the title of a page")
184
+ expect(watir_page_object.title).to eql "I am the title of a page"
185
+ end
186
+
187
+ it "should be able to navigate to a page" do
188
+ expect(watir_browser).to receive(:goto).with("cheezyworld.com")
189
+ watir_page_object.navigate_to("cheezyworld.com")
190
+ end
191
+
192
+ it "should wait until a block returns true" do
193
+ expect(watir_browser).to receive(:wait_until).with(5, "too long")
194
+ watir_page_object.wait_until(5, "too long")
195
+ end
196
+
197
+ it "should use the overriden timeout value when set" do
198
+ PageObject.default_page_wait = 10
199
+ expect(watir_browser).to receive(:wait_until).with(10, nil)
200
+ watir_page_object.wait_until
201
+ end
202
+
203
+ it "should wait until there are no pending ajax requests" do
204
+ expect(PageObject::JavascriptFrameworkFacade).to receive(:pending_requests).and_return('pending requests')
205
+ expect(watir_browser).to receive(:execute_script).with('pending requests').and_return(0)
206
+ watir_page_object.wait_for_ajax
207
+ end
208
+
209
+ it "should override alert popup behavior" do
210
+ expect(watir_browser).to receive(:alert).exactly(3).times.and_return(watir_browser)
211
+ expect(watir_browser).to receive(:exists?).and_return(true)
212
+ expect(watir_browser).to receive(:text)
213
+ expect(watir_browser).to receive(:ok)
214
+ watir_page_object.alert do
215
+ end
216
+ end
217
+
218
+ it "should override confirm popup behavior" do
219
+ expect(watir_browser).to receive(:alert).exactly(3).times.and_return(watir_browser)
220
+ expect(watir_browser).to receive(:exists?).and_return(true)
221
+ expect(watir_browser).to receive(:text)
222
+ expect(watir_browser).to receive(:ok)
223
+ watir_page_object.confirm(true) do
224
+ end
225
+ end
226
+
227
+ it "should override prompt popup behavior" do
228
+ expect(watir_browser).to receive(:wd).twice.and_return(watir_browser)
229
+ expect(watir_browser).to receive(:execute_script).twice
230
+ watir_page_object.prompt("blah") do
231
+ end
232
+ end
233
+
234
+ it "should execute javascript on the browser" do
235
+ expect(watir_browser).to receive(:execute_script).and_return("abc")
236
+ expect(watir_page_object.execute_script("333")).to eql "abc"
237
+ end
238
+
239
+ it "should convert a modal popup to a window" do
240
+ expect(watir_browser).to receive(:execute_script)
241
+ watir_page_object.modal_dialog {}
242
+ end
243
+
244
+ it "should switch to a new window with a given title" do
245
+ expect(watir_browser).to receive(:window).with(:title => /My\ Title/).and_return(watir_browser)
246
+ expect(watir_browser).to receive(:use)
247
+ watir_page_object.attach_to_window(:title => "My Title")
248
+ end
249
+
250
+ it "should switch to a new window with a given url" do
251
+ expect(watir_browser).to receive(:window).with(:url => /success\.html/).and_return(watir_browser)
252
+ expect(watir_browser).to receive(:use)
253
+ watir_page_object.attach_to_window(:url => "success.html")
254
+ end
255
+
256
+ it "should refresh the page contents" do
257
+ expect(watir_browser).to receive(:refresh)
258
+ watir_page_object.refresh
259
+ end
260
+
261
+ it "should know how to go back" do
262
+ expect(watir_browser).to receive(:back)
263
+ watir_page_object.back
264
+ end
265
+
266
+ it "should know how to go forward" do
267
+ expect(watir_browser).to receive(:forward)
268
+ watir_page_object.forward
269
+ end
270
+
271
+ it "should know its' current url" do
272
+ expect(watir_browser).to receive(:url).and_return("cheezyworld.com")
273
+ expect(watir_page_object.current_url).to eql "cheezyworld.com"
274
+ end
275
+
276
+ it "should know how to clear all of the cookies from the browser" do
277
+ expect(watir_browser).to receive(:cookies).and_return(watir_browser)
278
+ expect(watir_browser).to receive(:clear)
279
+ watir_page_object.clear_cookies
280
+ end
281
+
282
+ it "should be able to save a screenshot" do
283
+ expect(watir_browser).to receive(:wd).and_return(watir_browser)
284
+ expect(watir_browser).to receive(:save_screenshot)
285
+ watir_page_object.save_screenshot("test.png")
286
+ end
287
+ end
288
+
289
+ context "when using SeleniumPageObject" do
290
+ it "should display the page text" do
291
+ expect(selenium_browser).to receive_messages(find_element: selenium_browser, text: 'browser text')
292
+ expect(selenium_page_object.text).to eql "browser text"
293
+ end
294
+
295
+ it "should display the html of the page" do
296
+ expect(selenium_browser).to receive(:page_source).and_return("<html>Some Sample HTML</html>")
297
+ expect(selenium_page_object.html).to eql "<html>Some Sample HTML</html>"
298
+ end
299
+
300
+ it "should display the title of the page" do
301
+ expect(selenium_browser).to receive(:title).and_return("I am the title of a page")
302
+ expect(selenium_page_object.title).to eql "I am the title of a page"
303
+ end
304
+
305
+ it "should be able to navigate to a page" do
306
+ expect(selenium_browser).to receive_messages(navigate: selenium_browser, to: 'cheezyworld.com')
307
+ selenium_page_object.navigate_to('cheezyworld.com')
308
+ end
309
+
310
+ it "should wait until a block returns true" do
311
+ wait = double('wait')
312
+ expect(Selenium::WebDriver::Wait).to receive(:new).with({:timeout => 5, :message => 'too long'}).and_return(wait)
313
+ expect(wait).to receive(:until)
314
+ selenium_page_object.wait_until(5, 'too long')
315
+ end
316
+
317
+ it "should wait until there are no pending ajax requests" do
318
+ expect(PageObject::JavascriptFrameworkFacade).to receive(:pending_requests).and_return('pending requests')
319
+ expect(selenium_browser).to receive(:execute_script).with('pending requests').and_return(0)
320
+ selenium_page_object.wait_for_ajax
321
+ end
322
+
323
+ it "should override alert popup behavior" do
324
+ expect(selenium_browser).to receive(:switch_to).and_return(selenium_browser)
325
+ expect(selenium_browser).to receive(:alert).and_return(selenium_browser)
326
+ expect(selenium_browser).to receive(:text)
327
+ expect(selenium_browser).to receive(:accept)
328
+ selenium_page_object.alert do
329
+ end
330
+ end
331
+
332
+ it "should override confirm popup behavior" do
333
+ expect(selenium_browser).to receive(:switch_to).and_return(selenium_browser)
334
+ expect(selenium_browser).to receive(:alert).and_return(selenium_browser)
335
+ expect(selenium_browser).to receive(:text)
336
+ expect(selenium_browser).to receive(:accept)
337
+ selenium_page_object.confirm(true) do
338
+ end
339
+ end
340
+ it "should override prompt popup behavior" do
341
+ expect(selenium_browser).to receive(:execute_script).twice
342
+ selenium_page_object.prompt("blah") do
343
+ end
344
+ end
345
+
346
+ it "should convert a modal popup to a window" do
347
+ expect(selenium_browser).to receive(:execute_script)
348
+ selenium_page_object.modal_dialog {}
349
+ end
350
+
351
+ it "should execute javascript on the browser" do
352
+ expect(selenium_browser).to receive(:execute_script).and_return("abc")
353
+ expect(selenium_page_object.execute_script("333")).to eql "abc"
354
+ end
355
+
356
+ it "should switch to a new window with a given title" do
357
+ expect(selenium_browser).to receive(:window_handles).and_return(["win1"])
358
+ expect(selenium_browser).to receive(:switch_to).twice.and_return(selenium_browser)
359
+ expect(selenium_browser).to receive(:window).twice.with("win1").and_return(selenium_browser)
360
+ expect(selenium_browser).to receive(:title).and_return("My Title")
361
+ selenium_page_object.attach_to_window(:title => "My Title")
362
+ end
363
+
364
+ it "should switch to a new window with a given url" do
365
+ expect(selenium_browser).to receive(:window_handles).and_return(["win1"])
366
+ expect(selenium_browser).to receive(:switch_to).twice.and_return(selenium_browser)
367
+ expect(selenium_browser).to receive(:window).twice.with("win1").and_return(selenium_browser)
368
+ expect(selenium_browser).to receive(:current_url).and_return("page.html")
369
+ selenium_page_object.attach_to_window(:url => "page.html")
370
+ end
371
+
372
+ it "should refresh the page contents" do
373
+ expect(selenium_browser).to receive(:navigate).and_return(selenium_browser)
374
+ expect(selenium_browser).to receive(:refresh)
375
+ selenium_page_object.refresh
376
+ end
377
+
378
+ it "should know how to go back" do
379
+ expect(selenium_browser).to receive(:navigate).and_return(selenium_browser)
380
+ expect(selenium_browser).to receive(:back)
381
+ selenium_page_object.back
382
+ end
383
+
384
+ it "should know how to go forward" do
385
+ expect(selenium_browser).to receive(:navigate).and_return(selenium_browser)
386
+ expect(selenium_browser).to receive(:forward)
387
+ selenium_page_object.forward
388
+ end
389
+
390
+ it "should know its' current url" do
391
+ expect(selenium_browser).to receive(:current_url).and_return("cheezyworld.com")
392
+ expect(selenium_page_object.current_url).to eql "cheezyworld.com"
393
+ end
394
+
395
+ it "should clear all of the cookies from the browser" do
396
+ expect(selenium_browser).to receive(:manage).and_return(selenium_browser)
397
+ expect(selenium_browser).to receive(:delete_all_cookies)
398
+ selenium_page_object.clear_cookies
399
+ end
400
+
401
+ it "should be able to save a screenshot" do
402
+ expect(selenium_browser).to receive(:save_screenshot)
403
+ selenium_page_object.save_screenshot("test.png")
404
+ end
405
+ end
406
+ end
407
+ end