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,45 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Area do
5
+ let(:area) { PageObject::Elements::Area }
6
+
7
+ context "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 = area.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 = area.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ context "implementation" do
24
+ let(:area_element) { double('area_element') }
25
+
26
+ context "when using selenium" do
27
+ let(:selenium_area) { PageObject::Elements::Area.new(area_element, :platform => :selenium_webdriver) }
28
+
29
+ it "should know its coords" do
30
+ expect(area_element).to receive(:attribute).with(:coords).and_return("1,2,3,4")
31
+ expect(selenium_area.coords).to eql "1,2,3,4"
32
+ end
33
+
34
+ it "should know its shape" do
35
+ expect(area_element).to receive(:attribute).with(:shape).and_return('circle')
36
+ expect(selenium_area.shape).to eql 'circle'
37
+ end
38
+
39
+ it "should know its href" do
40
+ expect(area_element).to receive(:attribute).with(:href).and_return('twitter.com')
41
+ expect(selenium_area.href).to eql 'twitter.com'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Bold do
5
+ let(:bold) { PageObject::Elements::Bold }
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 = bold.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 = bold.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+
25
+ it "should register with tag :b" do
26
+ expect(::PageObject::Elements.element_class_for(:b)).to eql ::PageObject::Elements::Bold
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Button do
5
+ let(:button) { PageObject::Elements::Button }
6
+
7
+ context "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :name, :value, :xpath, :src, :alt, :css].each do |t|
10
+ identifier = button.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, :value, :xpath, :src, :alt, :css].each do |t|
17
+ key, value = button.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ let(:button_element) { double('button_element') }
25
+
26
+ it "should register with type :submit" do
27
+ expect(::PageObject::Elements.element_class_for(:input, :submit)).to eql ::PageObject::Elements::Button
28
+ end
29
+
30
+ it "should register with type :image" do
31
+ expect(::PageObject::Elements.element_class_for(:input, :image)).to eql ::PageObject::Elements::Button
32
+ end
33
+
34
+ it "should register with type :button" do
35
+ expect(::PageObject::Elements.element_class_for(:input, :button)).to eql ::PageObject::Elements::Button
36
+ end
37
+
38
+ it "should retisger with type :reset" do
39
+ expect(::PageObject::Elements.element_class_for(:input, :reset)).to eql ::PageObject::Elements::Button
40
+ end
41
+
42
+ context "for selenium" do
43
+ it "should return error when asked for its' text" do
44
+ button = PageObject::Elements::Button.new(button_element, :platform => :selenium_webdriver)
45
+ expect(lambda { button.text }).to raise_error
46
+ end
47
+
48
+ it "should return text for a button tag button" do
49
+ allow(button_element).to receive(:tag_name).and_return('button')
50
+ allow(button_element).to receive(:text).and_return('button?')
51
+ button = PageObject::Elements::Button.new(button_element, :platform => :selenium_webdriver)
52
+ expect(button.text).to eq 'button?'
53
+ end
54
+
55
+ it "should return text for an input tag button" do
56
+ allow(button_element).to receive(:tag_name).and_return('input')
57
+ allow(button_element).to receive(:attribute).with('value').and_return('button!')
58
+ button = PageObject::Elements::Button.new(button_element, :platform => :selenium_webdriver)
59
+ expect(button.text).to eq 'button!'
60
+ end
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Canvas do
5
+ let(:area) { PageObject::Elements::Canvas }
6
+
7
+ context "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 = area.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 = area.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ context "implementation" do
24
+ let(:canvas_element) { double('canvas_element') }
25
+
26
+ context "when using selenium" do
27
+ let(:selenium_canvas) { PageObject::Elements::Canvas.new(canvas_element, :platform => :selenium_webdriver) }
28
+
29
+ it "should know its width" do
30
+ expect(canvas_element).to receive(:attribute).with(:width).and_return("400")
31
+ expect(selenium_canvas.width).to eql 400
32
+ end
33
+
34
+ it "should know its height" do
35
+ expect(canvas_element).to receive(:attribute).with(:height).and_return("100")
36
+ expect(selenium_canvas.height).to eql 100
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::CheckBox do
5
+ let(:checkbox) { PageObject::Elements::CheckBox }
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, :value].each do |t|
10
+ identifier = checkbox.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, :value].each do |t|
16
+ key, value = checkbox.selenium_identifier_for t => 'value'
17
+ expect(key).to eql t
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+ let(:check_box) { double('check_box') }
24
+ let(:selenium_cb) { PageObject::Elements::CheckBox.new(check_box, :platform => :selenium_webdriver) }
25
+
26
+ it "should register with type :checkbox" do
27
+ expect(::PageObject::Elements.element_class_for(:input, :checkbox)).to eql ::PageObject::Elements::CheckBox
28
+ end
29
+
30
+ context "for selenium" do
31
+ it "should check" do
32
+ expect(check_box).to receive(:click)
33
+ expect(check_box).to receive(:selected?).and_return(false)
34
+ selenium_cb.check
35
+ end
36
+
37
+ it "should uncheck" do
38
+ expect(check_box).to receive(:click)
39
+ expect(check_box).to receive(:selected?).and_return(true)
40
+ selenium_cb.uncheck
41
+ end
42
+
43
+ it "should know if it is checked" do
44
+ expect(check_box).to receive(:selected?).and_return(true)
45
+ expect(selenium_cb).to be_checked
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Div do
5
+ let(:div) { PageObject::Elements::Div }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :text, :index, :xpath, :name, :title, :css].each do |t|
10
+ identifier = div.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, :text, :index, :name, :xpath, :title, :css].each do |t|
17
+ key, value = div.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+ it "should register with tag :div" do
24
+ expect(::PageObject::Elements.element_class_for(:div)).to eql ::PageObject::Elements::Div
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+
5
+ describe "Element" do
6
+
7
+ context "when building the identifiers for Watir" do
8
+ it "should build xpath when finding elements by name where not supported" do
9
+ ['table', 'span', 'div', 'td', 'li', 'ol', 'ul'].each do |tag|
10
+ how = {:tag_name => tag, :name => 'blah'}
11
+ result = PageObject::Elements::Element.watir_identifier_for how
12
+ expect(result[:xpath]).to eql ".//#{tag}[@name='blah']"
13
+ end
14
+ end
15
+ end
16
+
17
+ context "when building the identifiers for Selenium" do
18
+ def all_basic_elements
19
+ ['textarea', 'select', 'a', 'div', 'span', 'table', 'td', 'img', 'form', 'li', 'ul', 'ol']
20
+ end
21
+
22
+ def all_input_elements
23
+ ['text', 'hidden', 'checkbox', 'radio']
24
+ end
25
+
26
+ it "should build xpath when index is provided for basic elements" do
27
+ all_basic_elements.each do |tag|
28
+ identifier = {:tag_name => tag, :index => 1}
29
+ how, what = PageObject::Elements::Element.selenium_identifier_for identifier
30
+ expect(how).to eql :xpath
31
+ expect(what).to eql "(.//#{tag})[2]"
32
+ end
33
+ end
34
+
35
+ it "should should build xpath when index is provided for input elements" do
36
+ all_input_elements.each do |tag|
37
+ identifier = {:tag_name => 'input', :type => tag, :index => 1}
38
+ how, what = PageObject::Elements::Element.selenium_identifier_for identifier
39
+ expect(how).to eql :xpath
40
+ expect(what).to include "(.//input[@type='#{tag}'])[2]"
41
+ end
42
+ end
43
+
44
+ it "should build xpath when locating basic elements by name and index" do
45
+ all_basic_elements.each do |tag|
46
+ identifier = {:tag_name => tag, :name => 'blah', :index => 0}
47
+ how, what = PageObject::Elements::Element.selenium_identifier_for identifier
48
+ expect(how).to eql :xpath
49
+ expect(what).to eql "(.//#{tag}[@name='blah'])[1]"
50
+ end
51
+ end
52
+
53
+ it "should build xpath when locating input elements by name and index" do
54
+ all_input_elements.each do |type|
55
+ identifier = {:tag_name => 'input', :type => "#{type}", :name => 'blah', :index => 0}
56
+ how, what = PageObject::Elements::Element.selenium_identifier_for identifier
57
+ expect(how).to eql :xpath
58
+ expect(what).to include "(.//input[@type='#{type}' and @name='blah'])[1]"
59
+ end
60
+ end
61
+
62
+ it "should build xpath when locating basic elements by name and class" do
63
+ all_basic_elements.each do |tag|
64
+ identifier = {:tag_name => tag, :class => 'bar', :name => 'foo'}
65
+ how, what = PageObject::Elements::Element.selenium_identifier_for identifier
66
+ expect(how).to eql :xpath
67
+ expect(what).to eql ".//#{tag}[@class='bar' and @name='foo']"
68
+ end
69
+ end
70
+
71
+ it "should build xpath when locating input elements by name and class" do
72
+ all_input_elements.each do |type|
73
+ identifier = {:tag_name => 'input', :type => "#{type}", :class => 'bar', :name => 'foo'}
74
+ how, what = PageObject::Elements::Element.selenium_identifier_for identifier
75
+ expect(what).to include ".//input[@type='#{type}' and @class='bar' and @name='foo']"
76
+ end
77
+ end
78
+ end
79
+
80
+ context "interaction with native element" do
81
+ let(:native) { double('') }
82
+ let(:element) { PageObject::Elements::Element.new(native, :platform => :watir_webdriver) }
83
+
84
+ it "should check if native is enabled" do
85
+ expect(native).to receive(:enabled?).and_return(true)
86
+ expect(element).to be_enabled
87
+ end
88
+
89
+ it "should click the native" do
90
+ expect(native).to receive(:click)
91
+ element.click
92
+ end
93
+
94
+ it "should double click the native" do
95
+ expect(native).to receive(:double_click)
96
+ element.double_click
97
+ end
98
+
99
+ it "should inspect the native" do
100
+ expect(native).to receive(:inspect)
101
+ element.inspect
102
+ end
103
+
104
+ it "should retrieve the native's style" do
105
+ expect(native).to receive(:style).with('foo').and_return("cheezy_style")
106
+ expect(element.style('foo')).to eql 'cheezy_style'
107
+ end
108
+
109
+ it "should know if a native is disabled" do
110
+ expect(native).to receive(:enabled?).and_return(false)
111
+ expect(element).to be_disabled
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::FileField do
5
+
6
+ describe "when mapping how to find an element" do
7
+ let(:filefield) { PageObject::Elements::FileField }
8
+
9
+ it "should map watir types to same" do
10
+ [:class, :id, :index, :name, :xpath, :title].each do |t|
11
+ identifier = filefield.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, :index, :name, :xpath, :title].each do |t|
18
+ key, value = filefield.selenium_identifier_for t => 'value'
19
+ expect(key).to eql t
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "interface" do
25
+ let(:filefield) { double('file_field') }
26
+
27
+ it "should register as type :file" do
28
+ expect(::PageObject::Elements.element_class_for(:input, :file)).to eql ::PageObject::Elements::FileField
29
+ end
30
+
31
+ context "for selenium" do
32
+ it "should set its' value" do
33
+ selenium_file_field = PageObject::Elements::FileField.new(filefield, :platform => :selenium_webdriver)
34
+ expect(filefield).to receive(:send_keys).with('a file')
35
+ selenium_file_field.value = 'a file'
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Form do
5
+ describe "interface" do
6
+ let(:form_element) { double('form_element') }
7
+
8
+ it "should register with tag_name :form" do
9
+ expect(::PageObject::Elements.element_class_for(:form)).to eql ::PageObject::Elements::Form
10
+ end
11
+
12
+ context "for watir" do
13
+ it "should submit a form" do
14
+ form = PageObject::Elements::Form.new(form_element, :platform => :watir_webdriver)
15
+ expect(form_element).to receive(:submit)
16
+ form.submit
17
+ end
18
+ end
19
+
20
+ context "for selenium" do
21
+ it "should submit a form" do
22
+ form = PageObject::Elements::Form.new(form_element, :platform => :selenium_webdriver)
23
+ expect(form_element).to receive(:submit)
24
+ form.submit
25
+ end
26
+ end
27
+ end
28
+ end