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,11 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Option do
5
+
6
+ describe "interface" do
7
+ it "should register as tag_name :option" do
8
+ expect(::PageObject::Elements.element_class_for(:option)).to eql ::PageObject::Elements::Option
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::OrderedList do
5
+ let(:ol) { PageObject::Elements::OrderedList }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :xpath].each do |t|
10
+ identifier = ol.watir_identifier_for t => 'value'
11
+ expect(identifier.keys.first).to eql t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :index, :name, :xpath].each do |t|
17
+ key, value = ol.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ let(:ol_element) { double('ol_element') }
25
+
26
+ it "should register as tag_name :ol" do
27
+ expect(::PageObject::Elements.element_class_for(:ol)).to eql ::PageObject::Elements::OrderedList
28
+ end
29
+
30
+ context "for watir" do
31
+ it "should return a list item when indexed" do
32
+ ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :watir_webdriver)
33
+ allow(ol_element).to receive(:ols).and_return([ol_element])
34
+ allow(ol_element).to receive(:find_elements).and_return(ol_element)
35
+ allow(ol_element).to receive(:map).and_return([ol_element])
36
+ allow(ol_element).to receive(:parent).and_return(ol_element)
37
+ allow(ol_element).to receive(:element).and_return(ol_element)
38
+ allow(ol_element).to receive(:==).and_return(true)
39
+ ol[1]
40
+ end
41
+
42
+ it "should know how many list items it contains" do
43
+ ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :watir_webdriver)
44
+ allow(ol_element).to receive(:ols).and_return([ol_element])
45
+ allow(ol_element).to receive(:find_elements).and_return(ol_element)
46
+ allow(ol_element).to receive(:map).and_return([ol_element])
47
+ allow(ol_element).to receive(:parent).and_return(ol_element)
48
+ allow(ol_element).to receive(:element).and_return(ol_element)
49
+ allow(ol_element).to receive(:==).and_return(true)
50
+ expect(ol.items).to eql 1
51
+ end
52
+
53
+ it "should iterate over the list items" do
54
+ ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :watir_webdriver)
55
+ expect(ol).to receive(:items).and_return(5)
56
+ allow(ol).to receive(:[])
57
+ count = 0
58
+ ol.each { |item| count += 1 }
59
+ expect(count).to eql 5
60
+ end
61
+ end
62
+
63
+ context "for selenium" do
64
+ it "should return a list item when indexed" do
65
+ ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :selenium_webdriver)
66
+ expect(ol_element).to receive(:find_elements).and_return(ol_element)
67
+ expect(ol_element).to receive(:map).and_return([ol_element])
68
+ expect(ol_element).to receive(:parent).and_return(ol_element)
69
+ expect(ol_element).to receive(:element).and_return(ol_element)
70
+ expect(ol_element).to receive(:==).and_return(true)
71
+ ol[1]
72
+ end
73
+
74
+ it "should know how many list items it contains" do
75
+ ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :selenium_webdriver)
76
+ expect(ol_element).to receive(:find_elements).and_return(ol_element)
77
+ expect(ol_element).to receive(:map).and_return([ol_element])
78
+ expect(ol_element).to receive(:parent).and_return(ol_element)
79
+ expect(ol_element).to receive(:element).and_return(ol_element)
80
+ expect(ol_element).to receive(:==).and_return(true)
81
+ expect(ol.items).to eql 1
82
+ end
83
+
84
+ it "should iterate over the list items" do
85
+ ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :selenium_webdriver)
86
+ expect(ol).to receive(:items).and_return(5)
87
+ allow(ol).to receive(:[])
88
+ count = 0
89
+ ol.each { |item| count += 1 }
90
+ expect(count).to eql 5
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Paragraph do
5
+ let(:paragraph) { PageObject::Elements::Paragraph }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :name, :xpath].each do |t|
10
+ identifier = paragraph.watir_identifier_for t => 'value'
11
+ expect(identifier.keys.first).to eql t
12
+ end
13
+ end
14
+ it "should map selenium types to same" do
15
+ [:class, :id, :name, :xpath, :index].each do |t|
16
+ key, value = paragraph.selenium_identifier_for t => 'value'
17
+ expect(key).to eql t
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+ it "should register with type :checkbox" do
24
+ expect(::PageObject::Elements.element_class_for(:p)).to eql ::PageObject::Elements::Paragraph
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,142 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::SelectList do
5
+ let(:selectlist) { PageObject::Elements::SelectList }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :name, :text, :value, :xpath].each do |t|
10
+ identifier = selectlist.watir_identifier_for t => 'value'
11
+ expect(identifier.keys.first).to eql t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :name, :xpath, :index].each do |t|
17
+ key, value = selectlist.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ let(:sel_list) { double('select_list') }
25
+ let(:opts) { [sel_list, sel_list] }
26
+
27
+ before(:each) do
28
+ allow(sel_list).to receive(:find_elements).and_return(sel_list)
29
+ allow(sel_list).to receive(:each)
30
+ allow(sel_list).to receive(:wd).and_return(sel_list)
31
+ allow(sel_list).to receive(:map).and_return(opts)
32
+ allow(sel_list).to receive(:any?)
33
+ allow(sel_list).to receive(:include?)
34
+ allow(sel_list).to receive(:select).and_return(opts)
35
+ allow(sel_list).to receive(:text).and_return('blah')
36
+ end
37
+
38
+ it "should register with tag_name :select" do
39
+ expect(::PageObject::Elements.element_class_for(:select)).to eql ::PageObject::Elements::SelectList
40
+ end
41
+
42
+ context "for watir" do
43
+ let(:watir_sel_list) { PageObject::Elements::SelectList.new(sel_list, :platform => :watir_webdriver) }
44
+
45
+ it "should return an option when indexed" do
46
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
47
+ expect(watir_sel_list[0]).to be_instance_of PageObject::Elements::Option
48
+ end
49
+
50
+ it "should return an array of options" do
51
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
52
+ expect(watir_sel_list.options.size).to eql 2
53
+ end
54
+
55
+ it "should return an array of selected options" do
56
+ allow(sel_list).to receive(:selected_options).and_return(opts)
57
+ allow(sel_list).to receive(:text).and_return(sel_list)
58
+ expect(watir_sel_list.selected_options).to eql opts
59
+ end
60
+
61
+ it "should know if it includes some value" do
62
+ allow(sel_list).to receive(:include?).with('blah').and_return(true)
63
+ watir_sel_list.include?('blah')
64
+ end
65
+
66
+ it "should know if an option is selected" do
67
+ allow(sel_list).to receive(:selected?).with('blah').and_return(true)
68
+ watir_sel_list.selected?('blah')
69
+ end
70
+
71
+ it "should be able to get the value for the selected options" do
72
+ allow(sel_list).to receive(:selected_options).and_return(opts)
73
+ allow(sel_list).to receive(:value).and_return(sel_list)
74
+ expect(watir_sel_list.selected_values).to eql opts
75
+ end
76
+ end
77
+
78
+ context "for selenium" do
79
+ let(:selenium_sel_list) { PageObject::Elements::SelectList.new(sel_list, :platform => :selenium_webdriver) }
80
+
81
+ it "should return an option when indexed" do
82
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
83
+ expect(selenium_sel_list[1]).to be_instance_of PageObject::Elements::Option
84
+ end
85
+
86
+ it "should return an array of options" do
87
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
88
+ expect(selenium_sel_list.options.size).to eql 2
89
+ end
90
+
91
+ it "should select an element" do
92
+ option = double('option')
93
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return([option])
94
+ expect(option).to receive(:text).and_return('something')
95
+ expect(option).to receive(:click)
96
+ selenium_sel_list.select 'something'
97
+ end
98
+
99
+ it "should return an array of selected options" do
100
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
101
+ expect(opts[0]).to receive(:selected?).and_return(true)
102
+ expect(opts[0]).to receive(:text).and_return('test1')
103
+ expect(opts[1]).to receive(:selected?).and_return(false)
104
+ selected = selenium_sel_list.selected_options
105
+ expect(selected.size).to eql 1
106
+ expect(selected[0]).to eql 'test1'
107
+ end
108
+
109
+ it "should return an array of selected options" do
110
+ expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
111
+ expect(opts[0]).to receive(:selected?).and_return(true)
112
+ expect(opts[0]).to receive(:attribute).and_return('test1')
113
+ expect(opts[1]).to receive(:selected?).and_return(false)
114
+ selected = selenium_sel_list.selected_values
115
+ expect(selected.size).to eql 1
116
+ expect(selected[0]).to eql 'test1'
117
+ end
118
+
119
+ it "should know if it includes some value" do
120
+ expect(sel_list).to receive(:find_elements).and_return(opts)
121
+ expect(opts[0]).to receive(:text).and_return('blah')
122
+ expect(selenium_sel_list).to include 'blah'
123
+ end
124
+
125
+ it "should know if an option is selected" do
126
+ expect(sel_list).to receive(:find_elements).and_return(opts)
127
+ expect(opts[0]).to receive(:selected?).twice.and_return(true)
128
+ expect(opts[0]).to receive(:text).and_return('blah')
129
+ expect(selenium_sel_list.selected?('blah')).to be true
130
+ end
131
+
132
+ it "should be able to clear selected options" do
133
+ expect(sel_list).to receive(:find_elements).and_return(opts)
134
+ opts.each do |opt|
135
+ expect(opt).to receive(:selected?).and_return(true)
136
+ expect(opt).to receive(:click)
137
+ end
138
+ selenium_sel_list.clear
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::RadioButton do
5
+ let(:radiobutton) { PageObject::Elements::RadioButton }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :name, :value, :xpath].each do |t|
10
+ identifier = radiobutton.watir_identifier_for t => 'value'
11
+ expect(identifier.keys.first).to eql t
12
+ end
13
+ end
14
+ it "should map selenium types to same" do
15
+ [:class, :id, :name, :xpath, :value, :index].each do |t|
16
+ key, value = radiobutton.selenium_identifier_for t => 'value'
17
+ expect(key).to eql t
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+
24
+ it "should register as type :radio" do
25
+ expect(::PageObject::Elements.element_class_for(:input, :radio)).to eql ::PageObject::Elements::RadioButton
26
+ end
27
+
28
+ context "for selenium" do
29
+ let(:selenium_rb) { double('radio_button') }
30
+ let(:radio_button) { PageObject::Elements::RadioButton.new(selenium_rb, :platform => :selenium_webdriver) }
31
+
32
+ it "should select" do
33
+ expect(selenium_rb).to receive(:click)
34
+ expect(selenium_rb).to receive(:selected?).and_return(false)
35
+ radio_button.select
36
+ end
37
+
38
+ it "should know if it is selected" do
39
+ expect(selenium_rb).to receive(:selected?).and_return(true)
40
+ expect(radio_button).to be_selected
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::TextField do
5
+
6
+ describe "when mapping how to find an element" do
7
+ let(:textfield) { PageObject::Elements::TextField }
8
+
9
+ it "should map watir types to same" do
10
+ [:class, :id, :index, :name, :title, :xpath, :text, :label].each do |t|
11
+ identifier = textfield.watir_identifier_for t => 'value'
12
+ expect(identifier.keys.first).to eql t
13
+ end
14
+ end
15
+
16
+ it "should map selenium types to same" do
17
+ [:class, :id, :name, :title, :xpath, :index, :text, :label].each do |t|
18
+ key, value = textfield.selenium_identifier_for t => 'value'
19
+ expect(key).to eql t
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "interface" do
25
+ let(:text_field_element) { double('text_field') }
26
+ let(:selenium_text_field) { PageObject::Elements::TextField.new(text_field_element, :platform => :selenium_webdriver) }
27
+
28
+ it "should register with type :text" do
29
+ expect(::PageObject::Elements.element_class_for(:input, :text)).to eql ::PageObject::Elements::TextField
30
+ end
31
+
32
+ it "should register with type :password" do
33
+ expect(::PageObject::Elements.element_class_for(:input, :password)).to eql ::PageObject::Elements::TextField
34
+ end
35
+
36
+ it "should append text" do
37
+ expect(text_field_element).to receive(:send_keys).with('abc')
38
+ selenium_text_field.append('abc')
39
+ end
40
+
41
+ context "for selenium" do
42
+ it "should set its' value" do
43
+ expect(text_field_element).to receive(:clear)
44
+ expect(text_field_element).to receive(:send_keys).with('Joseph')
45
+ selenium_text_field.value = 'Joseph'
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,177 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+ require 'selenium-webdriver'
4
+
5
+
6
+ describe "Element for Selenium" do
7
+ before(:each) do
8
+ @selenium_driver = double('selenium')
9
+ @selenium_element = ::PageObject::Elements::Element.new(@selenium_driver, :platform => :selenium_webdriver)
10
+ end
11
+
12
+ it "should know when it is visible" do
13
+ expect(@selenium_driver).to receive(:displayed?).and_return(true)
14
+ expect(@selenium_element.visible?).to be true
15
+ end
16
+
17
+ it "should know when it is not visible" do
18
+ expect(@selenium_driver).to receive(:displayed?).and_return(false)
19
+ expect(@selenium_element.visible?).to eql false
20
+ end
21
+
22
+ it "should know when it exists" do
23
+ expect(@selenium_driver).to receive(:nil?).and_return(false)
24
+ expect(@selenium_element.exists?).to eql true
25
+ end
26
+
27
+ it "should know when it does not exist" do
28
+ @selenium_element = ::PageObject::Elements::Element.new(nil, :platform => :selenium_webdriver)
29
+ expect(@selenium_element.exists?).to eql false
30
+ end
31
+
32
+ it "should flash an element" do
33
+ bridge = double('bridge')
34
+ expect(@selenium_driver).to receive(:attribute).and_return('blue')
35
+ expect(@selenium_driver).to receive(:instance_variable_get).and_return(bridge)
36
+ expect(bridge).to receive(:executeScript).exactly(10).times
37
+ @selenium_element.flash
38
+ end
39
+
40
+ it "should be able to return the text contained in the element" do
41
+ expect(@selenium_driver).to receive(:text).and_return("my text")
42
+ expect(@selenium_element.text).to eql "my text"
43
+ end
44
+
45
+ it "should know when it is equal to another" do
46
+ expect(@selenium_driver).to receive(:==).and_return(true)
47
+ expect(@selenium_element).to eq @selenium_element
48
+ end
49
+
50
+ it "should know when it is not equal to another" do
51
+ expect(@selenium_element).not_to eq 'not an element'
52
+ end
53
+
54
+ it "should return its tag name" do
55
+ expect(@selenium_driver).to receive(:tag_name).and_return("h1")
56
+ expect(@selenium_element.tag_name).to eql "h1"
57
+ end
58
+
59
+ it "should know its value" do
60
+ expect(@selenium_driver).to receive(:attribute).with('value').and_return("value")
61
+ expect(@selenium_element.value).to eql "value"
62
+ end
63
+
64
+ it "should know how to retrieve the value of an attribute" do
65
+ expect(@selenium_driver).to receive(:attribute).and_return(true)
66
+ expect(@selenium_element.attribute('readonly')).to be true
67
+ end
68
+
69
+ it "should be clickable" do
70
+ expect(@selenium_driver).to receive(:click)
71
+ @selenium_element.click
72
+ end
73
+
74
+ it "should be double clickable" do
75
+ expect(Selenium::WebDriver::Mouse).to receive(:new).and_return(@selenium_driver)
76
+ expect(@selenium_driver).to receive(:double_click)
77
+ @selenium_element.double_click
78
+ end
79
+
80
+ it "should be right clickable" do
81
+ expect(@selenium_driver).to receive(:context_click)
82
+ @selenium_element.right_click
83
+ end
84
+
85
+ it "should be able to block until it is present" do
86
+ wait = double('wait')
87
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
88
+ expect(wait).to receive(:until)
89
+ @selenium_element.when_present(10)
90
+ end
91
+
92
+ it "should return the element when it is present" do
93
+ wait = double('wait')
94
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
95
+ expect(wait).to receive(:until)
96
+ element = @selenium_element.when_present(10)
97
+ expect(element).to equal @selenium_element
98
+ end
99
+
100
+ it "should return when an element is not present" do
101
+ wait = double('wait')
102
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
103
+ expect(wait).to receive(:until)
104
+ @selenium_element.when_not_present
105
+ end
106
+
107
+ it "should be able to block until it is visible" do
108
+ wait = double('wait')
109
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
110
+ expect(wait).to receive(:until)
111
+ @selenium_element.when_visible(10)
112
+ end
113
+
114
+ it "should return the element when it is visible" do
115
+ wait = double('wait')
116
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
117
+ expect(wait).to receive(:until)
118
+ element = @selenium_element.when_visible(10)
119
+ expect(element).to equal @selenium_element
120
+ end
121
+
122
+ it "should be able to block until it is not visible" do
123
+ wait = double('wait')
124
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
125
+ expect(wait).to receive(:until)
126
+ @selenium_element.when_not_visible(10)
127
+ end
128
+
129
+ it "should return the element when it is not visible" do
130
+ wait = double('wait')
131
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
132
+ expect(wait).to receive(:until)
133
+ element = @selenium_element.when_not_visible(10)
134
+ expect(element).to equal @selenium_element
135
+ end
136
+
137
+ it "should be able to block until a user define event fires true" do
138
+ wait = double('wait')
139
+ expect(::Selenium::WebDriver::Wait).to receive(:new).and_return(wait)
140
+ expect(wait).to receive(:until)
141
+ @selenium_element.wait_until(10, "Element blah") {}
142
+ end
143
+
144
+ it "should send keys to the element" do
145
+ expect(@selenium_driver).to receive(:send_keys).with([:control, 'a'])
146
+ @selenium_element.send_keys([:control, 'a'])
147
+ end
148
+
149
+ it "should clear its' contents" do
150
+ expect(@selenium_driver).to receive(:clear)
151
+ @selenium_element.clear
152
+ end
153
+
154
+ it "should fire an event" do
155
+ expect(@selenium_driver).to receive(:instance_variable_get).with(:@bridge).and_return(@selenium_driver)
156
+ expect(@selenium_driver).to receive(:executeScript)
157
+ @selenium_element.fire_event('onfocus')
158
+ end
159
+
160
+ it "should find the parent element" do
161
+ expect(@selenium_driver).to receive(:instance_variable_get).with(:@bridge).and_return(@selenium_driver)
162
+ expect(@selenium_driver).to receive(:executeScript).and_return(@selenium_driver)
163
+ expect(@selenium_driver).to receive(:tag_name).twice.and_return(:div)
164
+ @selenium_element.parent
165
+ end
166
+
167
+ it "should set the focus" do
168
+ expect(@selenium_driver).to receive(:instance_variable_get).and_return(@selenium_driver)
169
+ expect(@selenium_driver).to receive(:executeScript)
170
+ @selenium_element.focus
171
+ end
172
+
173
+ it "should scroll into view" do
174
+ expect(@selenium_driver).to receive(:location_once_scrolled_into_view)
175
+ @selenium_element.scroll_into_view
176
+ end
177
+ end