meeane-page-object 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +10 -0
  7. data/ChangeLog +790 -0
  8. data/Gemfile +13 -0
  9. data/Guardfile +20 -0
  10. data/LICENSE +20 -0
  11. data/README.md +141 -0
  12. data/Rakefile +35 -0
  13. data/cucumber.yml +10 -0
  14. data/features/area.feature +35 -0
  15. data/features/async.feature +30 -0
  16. data/features/audio.feature +68 -0
  17. data/features/button.feature +87 -0
  18. data/features/canvas.feature +37 -0
  19. data/features/check_box.feature +55 -0
  20. data/features/div.feature +45 -0
  21. data/features/element.feature +322 -0
  22. data/features/file_field.feature +40 -0
  23. data/features/form.feature +43 -0
  24. data/features/frames.feature +75 -0
  25. data/features/generic_elements.feature +29 -0
  26. data/features/gxt_table_extension.feature +24 -0
  27. data/features/headings.feature +97 -0
  28. data/features/hidden_field.feature +45 -0
  29. data/features/html/04-Death_Becomes_Fur.mp4 +0 -0
  30. data/features/html/04-Death_Becomes_Fur.oga +0 -0
  31. data/features/html/async.html +36 -0
  32. data/features/html/double_click.html +13 -0
  33. data/features/html/failure.html +8 -0
  34. data/features/html/frame_1.html +18 -0
  35. data/features/html/frame_2.html +16 -0
  36. data/features/html/frame_3.html +14 -0
  37. data/features/html/frames.html +12 -0
  38. data/features/html/hover.html +12 -0
  39. data/features/html/iframes.html +12 -0
  40. data/features/html/images/circle.png +0 -0
  41. data/features/html/images/img_pulpit.jpg +0 -0
  42. data/features/html/images/submit.gif +0 -0
  43. data/features/html/indexed_property.html +52 -0
  44. data/features/html/modal.html +17 -0
  45. data/features/html/modal_1.html +38 -0
  46. data/features/html/modal_2.html +27 -0
  47. data/features/html/movie.mp4 +0 -0
  48. data/features/html/movie.ogg +0 -0
  49. data/features/html/multi_elements.html +144 -0
  50. data/features/html/nested_elements.html +77 -0
  51. data/features/html/nested_frame_1.html +1 -0
  52. data/features/html/nested_frame_2.html +11 -0
  53. data/features/html/nested_frame_3.html +14 -0
  54. data/features/html/nested_frames.html +10 -0
  55. data/features/html/planets.gif +0 -0
  56. data/features/html/static_elements.html +206 -0
  57. data/features/html/success.html +8 -0
  58. data/features/html/sun.gif +0 -0
  59. data/features/html/sun.html +7 -0
  60. data/features/image.feature +50 -0
  61. data/features/indexed_property.feature +98 -0
  62. data/features/javascript.feature +28 -0
  63. data/features/label.feature +46 -0
  64. data/features/link.feature +52 -0
  65. data/features/list_item.feature +36 -0
  66. data/features/modal_dialog.feature +15 -0
  67. data/features/multi_elements.feature +486 -0
  68. data/features/nested_elements.feature +117 -0
  69. data/features/ordered_list.feature +56 -0
  70. data/features/page_level_actions.feature +90 -0
  71. data/features/paragraph.feature +35 -0
  72. data/features/radio_button.feature +58 -0
  73. data/features/radio_button_group.feature +29 -0
  74. data/features/sample-app/public/jquery-1.3.2.js +4376 -0
  75. data/features/sample-app/public/jquery.html +30 -0
  76. data/features/sample-app/public/prototype-1.6.0.3.js +4320 -0
  77. data/features/sample-app/public/prototype.html +35 -0
  78. data/features/sample-app/sample_app.rb +35 -0
  79. data/features/select_list.feature +86 -0
  80. data/features/span.feature +37 -0
  81. data/features/step_definitions/accessor_steps.rb +60 -0
  82. data/features/step_definitions/area_steps.rb +19 -0
  83. data/features/step_definitions/async_steps.rb +83 -0
  84. data/features/step_definitions/audio_steps.rb +27 -0
  85. data/features/step_definitions/button_steps.rb +43 -0
  86. data/features/step_definitions/canvas_steps.rb +15 -0
  87. data/features/step_definitions/check_box_steps.rb +35 -0
  88. data/features/step_definitions/div_steps.rb +19 -0
  89. data/features/step_definitions/element_steps.rb +266 -0
  90. data/features/step_definitions/file_field_steps.rb +19 -0
  91. data/features/step_definitions/form_steps.rb +19 -0
  92. data/features/step_definitions/frames_steps.rb +159 -0
  93. data/features/step_definitions/generic_element_steps.rb +31 -0
  94. data/features/step_definitions/gxt_table_steps.rb +58 -0
  95. data/features/step_definitions/headings_steps.rb +12 -0
  96. data/features/step_definitions/hidden_field_steps.rb +27 -0
  97. data/features/step_definitions/image_steps.rb +27 -0
  98. data/features/step_definitions/indexed_property_steps.rb +129 -0
  99. data/features/step_definitions/javascript_steps.rb +53 -0
  100. data/features/step_definitions/label_steps.rb +19 -0
  101. data/features/step_definitions/link_steps.rb +40 -0
  102. data/features/step_definitions/list_item_steps.rb +19 -0
  103. data/features/step_definitions/modal_dialog_steps.rb +62 -0
  104. data/features/step_definitions/multi_elements_steps.rb +528 -0
  105. data/features/step_definitions/nested_elements_steps.rb +212 -0
  106. data/features/step_definitions/ordered_list_steps.rb +23 -0
  107. data/features/step_definitions/page_level_actions_steps.rb +135 -0
  108. data/features/step_definitions/page_traversal_steps.rb +4 -0
  109. data/features/step_definitions/paragraph_steps.rb +28 -0
  110. data/features/step_definitions/radio_button_group_steps.rb +36 -0
  111. data/features/step_definitions/radio_button_steps.rb +27 -0
  112. data/features/step_definitions/select_list_steps.rb +65 -0
  113. data/features/step_definitions/span_steps.rb +19 -0
  114. data/features/step_definitions/table_cell_steps.rb +15 -0
  115. data/features/step_definitions/table_steps.rb +66 -0
  116. data/features/step_definitions/text_area_steps.rb +35 -0
  117. data/features/step_definitions/text_field_steps.rb +35 -0
  118. data/features/step_definitions/unordered_list_steps.rb +23 -0
  119. data/features/step_definitions/video_steps.rb +45 -0
  120. data/features/support/ajax_text_environment.rb +26 -0
  121. data/features/support/env.rb +8 -0
  122. data/features/support/hooks.rb +8 -0
  123. data/features/support/page.rb +364 -0
  124. data/features/support/persistent_browser.rb +70 -0
  125. data/features/support/targets/firefox14_osx.rb +6 -0
  126. data/features/support/targets/firefox14_windows7.rb +6 -0
  127. data/features/support/url_helper.rb +57 -0
  128. data/features/table.feature +114 -0
  129. data/features/table_cell.feature +45 -0
  130. data/features/text_area.feature +51 -0
  131. data/features/text_field.feature +70 -0
  132. data/features/unordered_list.feature +56 -0
  133. data/features/video.feature +73 -0
  134. data/lib/page-object/accessors.rb +1313 -0
  135. data/lib/page-object/core_ext/string.rb +5 -0
  136. data/lib/page-object/element_locators.rb +21 -0
  137. data/lib/page-object/elements/area.rb +31 -0
  138. data/lib/page-object/elements/audio.rb +9 -0
  139. data/lib/page-object/elements/button.rb +35 -0
  140. data/lib/page-object/elements/canvas.rb +23 -0
  141. data/lib/page-object/elements/check_box.rb +37 -0
  142. data/lib/page-object/elements/div.rb +19 -0
  143. data/lib/page-object/elements/element.rb +226 -0
  144. data/lib/page-object/elements/file_field.rb +38 -0
  145. data/lib/page-object/elements/form.rb +36 -0
  146. data/lib/page-object/elements/heading.rb +15 -0
  147. data/lib/page-object/elements/hidden_field.rb +22 -0
  148. data/lib/page-object/elements/image.rb +36 -0
  149. data/lib/page-object/elements/label.rb +36 -0
  150. data/lib/page-object/elements/link.rb +46 -0
  151. data/lib/page-object/elements/list_item.rb +19 -0
  152. data/lib/page-object/elements/media.rb +45 -0
  153. data/lib/page-object/elements/option.rb +10 -0
  154. data/lib/page-object/elements/ordered_list.rb +50 -0
  155. data/lib/page-object/elements/paragraph.rb +9 -0
  156. data/lib/page-object/elements/radio_button.rb +37 -0
  157. data/lib/page-object/elements/select_list.rb +42 -0
  158. data/lib/page-object/elements/span.rb +19 -0
  159. data/lib/page-object/elements/table.rb +68 -0
  160. data/lib/page-object/elements/table_cell.rb +28 -0
  161. data/lib/page-object/elements/table_row.rb +50 -0
  162. data/lib/page-object/elements/text_area.rb +38 -0
  163. data/lib/page-object/elements/text_field.rb +42 -0
  164. data/lib/page-object/elements/unordered_list.rb +51 -0
  165. data/lib/page-object/elements/video.rb +18 -0
  166. data/lib/page-object/elements.rb +59 -0
  167. data/lib/page-object/indexed_properties.rb +36 -0
  168. data/lib/page-object/javascript/jquery.rb +14 -0
  169. data/lib/page-object/javascript/prototype.rb +14 -0
  170. data/lib/page-object/javascript/yui.rb +19 -0
  171. data/lib/page-object/javascript_framework_facade.rb +78 -0
  172. data/lib/page-object/loads_platform.rb +26 -0
  173. data/lib/page-object/locator_generator.rb +129 -0
  174. data/lib/page-object/nested_elements.rb +17 -0
  175. data/lib/page-object/page_factory.rb +108 -0
  176. data/lib/page-object/page_populator.rb +92 -0
  177. data/lib/page-object/platforms/selenium_webdriver/button.rb +15 -0
  178. data/lib/page-object/platforms/selenium_webdriver/check_box.rb +29 -0
  179. data/lib/page-object/platforms/selenium_webdriver/element.rb +291 -0
  180. data/lib/page-object/platforms/selenium_webdriver/file_field.rb +16 -0
  181. data/lib/page-object/platforms/selenium_webdriver/form.rb +16 -0
  182. data/lib/page-object/platforms/selenium_webdriver/image.rb +28 -0
  183. data/lib/page-object/platforms/selenium_webdriver/label.rb +17 -0
  184. data/lib/page-object/platforms/selenium_webdriver/link.rb +23 -0
  185. data/lib/page-object/platforms/selenium_webdriver/ordered_list.rb +39 -0
  186. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +1136 -0
  187. data/lib/page-object/platforms/selenium_webdriver/radio_button.rb +22 -0
  188. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +93 -0
  189. data/lib/page-object/platforms/selenium_webdriver/surrogate_selenium_element.rb +42 -0
  190. data/lib/page-object/platforms/selenium_webdriver/table.rb +42 -0
  191. data/lib/page-object/platforms/selenium_webdriver/table_row.rb +43 -0
  192. data/lib/page-object/platforms/selenium_webdriver/text_area.rb +17 -0
  193. data/lib/page-object/platforms/selenium_webdriver/text_field.rb +17 -0
  194. data/lib/page-object/platforms/selenium_webdriver/unordered_list.rb +39 -0
  195. data/lib/page-object/platforms/selenium_webdriver.rb +18 -0
  196. data/lib/page-object/platforms/watir_webdriver/check_box.rb +29 -0
  197. data/lib/page-object/platforms/watir_webdriver/element.rb +249 -0
  198. data/lib/page-object/platforms/watir_webdriver/file_field.rb +16 -0
  199. data/lib/page-object/platforms/watir_webdriver/form.rb +16 -0
  200. data/lib/page-object/platforms/watir_webdriver/image.rb +22 -0
  201. data/lib/page-object/platforms/watir_webdriver/label.rb +17 -0
  202. data/lib/page-object/platforms/watir_webdriver/link.rb +15 -0
  203. data/lib/page-object/platforms/watir_webdriver/ordered_list.rb +35 -0
  204. data/lib/page-object/platforms/watir_webdriver/page_object.rb +1029 -0
  205. data/lib/page-object/platforms/watir_webdriver/radio_button.rb +22 -0
  206. data/lib/page-object/platforms/watir_webdriver/select_list.rb +74 -0
  207. data/lib/page-object/platforms/watir_webdriver/table.rb +38 -0
  208. data/lib/page-object/platforms/watir_webdriver/table_row.rb +37 -0
  209. data/lib/page-object/platforms/watir_webdriver/text_area.rb +23 -0
  210. data/lib/page-object/platforms/watir_webdriver/text_field.rb +16 -0
  211. data/lib/page-object/platforms/watir_webdriver/unordered_list.rb +36 -0
  212. data/lib/page-object/platforms/watir_webdriver.rb +18 -0
  213. data/lib/page-object/platforms.rb +18 -0
  214. data/lib/page-object/version.rb +4 -0
  215. data/lib/page-object/widgets.rb +133 -0
  216. data/lib/page-object.rb +408 -0
  217. data/meeane-page-object.gemspec +32 -0
  218. data/pageobject.gems +1 -0
  219. data/spec/page-object/element_locators_spec.rb +1065 -0
  220. data/spec/page-object/elements/area_spec.rb +45 -0
  221. data/spec/page-object/elements/button_spec.rb +50 -0
  222. data/spec/page-object/elements/canvas_spec.rb +40 -0
  223. data/spec/page-object/elements/check_box_spec.rb +49 -0
  224. data/spec/page-object/elements/div_spec.rb +28 -0
  225. data/spec/page-object/elements/element_spec.rb +114 -0
  226. data/spec/page-object/elements/file_field_spec.rb +39 -0
  227. data/spec/page-object/elements/form_spec.rb +28 -0
  228. data/spec/page-object/elements/heading_spec.rb +48 -0
  229. data/spec/page-object/elements/hidden_field_spec.rb +28 -0
  230. data/spec/page-object/elements/image_spec.rb +66 -0
  231. data/spec/page-object/elements/label_spec.rb +29 -0
  232. data/spec/page-object/elements/link_spec.rb +49 -0
  233. data/spec/page-object/elements/list_item_spec.rb +28 -0
  234. data/spec/page-object/elements/nested_element_spec.rb +254 -0
  235. data/spec/page-object/elements/option_spec.rb +11 -0
  236. data/spec/page-object/elements/ordered_list_spec.rb +94 -0
  237. data/spec/page-object/elements/paragraph_spec.rb +28 -0
  238. data/spec/page-object/elements/select_list_spec.rb +142 -0
  239. data/spec/page-object/elements/selenium/radio_button_spec.rb +44 -0
  240. data/spec/page-object/elements/selenium/text_field_spec.rb +49 -0
  241. data/spec/page-object/elements/selenium_element_spec.rb +172 -0
  242. data/spec/page-object/elements/span_spec.rb +26 -0
  243. data/spec/page-object/elements/table_cell_spec.rb +21 -0
  244. data/spec/page-object/elements/table_row_spec.rb +70 -0
  245. data/spec/page-object/elements/table_spec.rb +98 -0
  246. data/spec/page-object/elements/text_area_spec.rb +39 -0
  247. data/spec/page-object/elements/unordered_list_spec.rb +95 -0
  248. data/spec/page-object/elements/watir_element_spec.rb +142 -0
  249. data/spec/page-object/javascript_framework_facade_spec.rb +61 -0
  250. data/spec/page-object/loads_platform_spec.rb +53 -0
  251. data/spec/page-object/page-object_spec.rb +405 -0
  252. data/spec/page-object/page_factory_spec.rb +256 -0
  253. data/spec/page-object/page_populator_spec.rb +122 -0
  254. data/spec/page-object/platforms/selenium_webdriver/selenium_page_object_spec.rb +68 -0
  255. data/spec/page-object/platforms/selenium_webdriver_spec.rb +29 -0
  256. data/spec/page-object/platforms/watir_webdriver/watir_page_object_spec.rb +29 -0
  257. data/spec/page-object/platforms/watir_webdriver_spec.rb +9 -0
  258. data/spec/page-object/selenium_accessors_spec.rb +589 -0
  259. data/spec/page-object/watir_accessors_spec.rb +1107 -0
  260. data/spec/page-object/widget_spec.rb +226 -0
  261. data/spec/spec_helper.rb +44 -0
  262. metadata +404 -0
@@ -0,0 +1,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
+ identifier.keys.first.should == 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
+ key.should == 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
+ area_element.should_receive(:attribute).with(:coords).and_return("1,2,3,4")
31
+ selenium_area.coords.should == "1,2,3,4"
32
+ end
33
+
34
+ it "should know its shape" do
35
+ area_element.should_receive(:attribute).with(:shape).and_return('circle')
36
+ selenium_area.shape.should == 'circle'
37
+ end
38
+
39
+ it "should know its href" do
40
+ area_element.should_receive(:attribute).with(:href).and_return('twitter.com')
41
+ selenium_area.href.should == 'twitter.com'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,50 @@
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
+ identifier.keys.first.should == 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
+ key.should == 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
+ ::PageObject::Elements.element_class_for(:input, :submit).should == ::PageObject::Elements::Button
28
+ end
29
+
30
+ it "should register with type :image" do
31
+ ::PageObject::Elements.element_class_for(:input, :image).should == ::PageObject::Elements::Button
32
+ end
33
+
34
+ it "should register with type :button" do
35
+ ::PageObject::Elements.element_class_for(:input, :button).should == ::PageObject::Elements::Button
36
+ end
37
+
38
+ it "should retisger with type :reset" do
39
+ ::PageObject::Elements.element_class_for(:input, :reset).should == ::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
+ lambda { button.text }.should raise_error
46
+ end
47
+ end
48
+ end
49
+
50
+ 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
+ identifier.keys.first.should == 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
+ key.should == 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
+ canvas_element.should_receive(:attribute).with(:width).and_return("400")
31
+ selenium_canvas.width.should == 400
32
+ end
33
+
34
+ it "should know its height" do
35
+ canvas_element.should_receive(:attribute).with(:height).and_return("100")
36
+ selenium_canvas.height.should == 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
+ identifier.keys.first.should == 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
+ key.should == 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
+ ::PageObject::Elements.element_class_for(:input, :checkbox).should == ::PageObject::Elements::CheckBox
28
+ end
29
+
30
+ context "for selenium" do
31
+ it "should check" do
32
+ check_box.should_receive(:click)
33
+ check_box.should_receive(:selected?).and_return(false)
34
+ selenium_cb.check
35
+ end
36
+
37
+ it "should uncheck" do
38
+ check_box.should_receive(:click)
39
+ check_box.should_receive(:selected?).and_return(true)
40
+ selenium_cb.uncheck
41
+ end
42
+
43
+ it "should know if it is checked" do
44
+ check_box.should_receive(:selected?).and_return(true)
45
+ selenium_cb.should 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
+ identifier.keys.first.should == 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
+ key.should == t
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+ it "should register with tag :div" do
24
+ ::PageObject::Elements.element_class_for(:div).should == ::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
+ result[:xpath].should == ".//#{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
+ how.should == :xpath
31
+ what.should == "(.//#{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
+ how.should == :xpath
40
+ what.should 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
+ how.should == :xpath
49
+ what.should == "(.//#{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
+ how.should == :xpath
58
+ what.should 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
+ how.should == :xpath
67
+ what.should == ".//#{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
+ what.should 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
+ native.should_receive(:enabled?).and_return(true)
86
+ element.should be_enabled
87
+ end
88
+
89
+ it "should click the native" do
90
+ native.should_receive(:click)
91
+ element.click
92
+ end
93
+
94
+ it "should double click the native" do
95
+ native.should_receive(:double_click)
96
+ element.double_click
97
+ end
98
+
99
+ it "should inspect the native" do
100
+ native.should_receive(:inspect)
101
+ element.inspect
102
+ end
103
+
104
+ it "should retrieve the native's style" do
105
+ native.should_receive(:style).with('foo').and_return("cheezy_style")
106
+ element.style('foo').should == 'cheezy_style'
107
+ end
108
+
109
+ it "should know if a native is disabled" do
110
+ native.should_receive(:enabled?).and_return(false)
111
+ element.should 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
+ identifier.keys.first.should == 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
+ key.should == 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
+ ::PageObject::Elements.element_class_for(:input, :file).should == ::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
+ filefield.should_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
+ ::PageObject::Elements.element_class_for(:form).should == ::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
+ form_element.should_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
+ form_element.should_receive(:submit)
24
+ form.submit
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Heading do
5
+ let(:heading) { PageObject::Elements::Heading }
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 = heading.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == 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 = heading.selenium_identifier_for t => 'value'
18
+ key.should == t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ it "should register with tag :h1" do
25
+ ::PageObject::Elements.element_class_for(:h1).should == ::PageObject::Elements::Heading
26
+ end
27
+
28
+ it "should register with tag :h2" do
29
+ ::PageObject::Elements.element_class_for(:h2).should == ::PageObject::Elements::Heading
30
+ end
31
+
32
+ it "should register with tag :h3" do
33
+ ::PageObject::Elements.element_class_for(:h3).should == ::PageObject::Elements::Heading
34
+ end
35
+
36
+ it "should register with tag :h4" do
37
+ ::PageObject::Elements.element_class_for(:h4).should == ::PageObject::Elements::Heading
38
+ end
39
+
40
+ it "should register with tag :h5" do
41
+ ::PageObject::Elements.element_class_for(:h5).should == ::PageObject::Elements::Heading
42
+ end
43
+
44
+ it "should register with tag :h6" do
45
+ ::PageObject::Elements.element_class_for(:h6).should == ::PageObject::Elements::Heading
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::HiddenField do
5
+ let(:hiddenfield) { PageObject::Elements::HiddenField }
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, :xpath, :value].each do |t|
10
+ identifier = hiddenfield.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :name, :xpath, :index, :value].each do |t|
17
+ key, value = hiddenfield.selenium_identifier_for t => 'value'
18
+ key.should == t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ it "should register with type :hidden" do
25
+ ::PageObject::Elements.element_class_for(:input, :hidden).should == ::PageObject::Elements::HiddenField
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Image do
5
+ let(:image) { PageObject::Elements::Image }
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, :alt, :src].each do |t|
10
+ identifier = image.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :index, :name, :xpath, :alt, :src].each do |t|
17
+ key, value = image.selenium_identifier_for t => 'value'
18
+ key.should == t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ let(:image_element) { double('image_element') }
25
+
26
+ before(:each) do
27
+ image_element.stub(:size).and_return(image_element)
28
+ end
29
+
30
+ it "should register with tag_name :img" do
31
+ ::PageObject::Elements.element_class_for(:img).should == ::PageObject::Elements::Image
32
+ end
33
+
34
+ context "for watir" do
35
+ it "should know the images width" do
36
+ image = PageObject::Elements::Image.new(image_element, :platform => :watir_webdriver)
37
+ image_element.should_receive(:width).and_return(100)
38
+ image.width.should == 100
39
+ end
40
+
41
+ it "should know the images height" do
42
+ image = PageObject::Elements::Image.new(image_element, :platform => :watir_webdriver)
43
+ image_element.should_receive(:height).and_return(120)
44
+ image.height.should == 120
45
+ end
46
+ end
47
+
48
+ context "for selenium" do
49
+ it "should know the images width" do
50
+ dim = double('dimension')
51
+ image = PageObject::Elements::Image.new(image_element, :platform => :selenium_webdriver)
52
+ image_element.should_receive(:size).and_return(dim)
53
+ dim.should_receive(:width).and_return(100)
54
+ image.width.should == 100
55
+ end
56
+
57
+ it "should know the images height" do
58
+ dim = double('dimension')
59
+ image = PageObject::Elements::Image.new(image_element, :platform => :selenium_webdriver)
60
+ image_element.should_receive(:size).and_return(dim)
61
+ dim.should_receive(:height).and_return(120)
62
+ image.height.should == 120
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Label do
5
+ let(:label) { PageObject::Elements::Label }
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].each do |t|
10
+ identifier = label.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :text, :index, :xpath].each do |t|
17
+ key, value = label.selenium_identifier_for t => 'value'
18
+ key.should == t
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+ it "should register with tag :label" do
24
+ ::PageObject::Elements.element_class_for(:label).should == ::PageObject::Elements::Label
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Link do
5
+ let(:link) { PageObject::Elements::Link }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :href, :id, :index, :name, :text, :xpath, :css, :title].each do |t|
10
+ identifier = link.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to watir" do
16
+ [:link, :link_text].each do |t|
17
+ identifier = link.watir_identifier_for t => 'value'
18
+ identifier.keys.first.should == :text
19
+ end
20
+ end
21
+
22
+ it "should map selenium types to same" do
23
+ [:class, :id, :link, :link_text, :name, :xpath, :index, :css, :title].each do |t|
24
+ key, value = link.selenium_identifier_for t => 'value'
25
+ key.should == t
26
+ end
27
+ end
28
+
29
+ it "should map watir types to selenium" do
30
+ key, value = link.selenium_identifier_for :text => 'value'
31
+ key.should == :link_text
32
+ end
33
+ end
34
+
35
+ describe "interface" do
36
+ let(:link_element) { double('link_element') }
37
+
38
+ it "should register with tag :a" do
39
+ ::PageObject::Elements.element_class_for(:a).should == ::PageObject::Elements::Link
40
+ end
41
+
42
+ context "for selenium" do
43
+ it "should return error when asked for its' value" do
44
+ link = PageObject::Elements::Link.new(link_element, :platform => :selenium_webdriver)
45
+ lambda { link.value }.should raise_error
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::ListItem do
5
+ let(:list_item) { PageObject::Elements::ListItem }
6
+
7
+ describe "when mapping how to find an element" do
8
+ it "should map watir types to same" do
9
+ [:class, :id, :index, :text, :xpath].each do |t|
10
+ identifier = list_item.watir_identifier_for t => 'value'
11
+ identifier.keys.first.should == t
12
+ end
13
+ end
14
+
15
+ it "should map selenium types to same" do
16
+ [:class, :id, :index, :name, :text, :xpath].each do |t|
17
+ key, value = list_item.selenium_identifier_for t => 'value'
18
+ key.should == t
19
+ end
20
+ end
21
+
22
+ describe "interface" do
23
+ it "should register as tag_name :li" do
24
+ ::PageObject::Elements.element_class_for(:li).should == ::PageObject::Elements::ListItem
25
+ end
26
+ end
27
+ end
28
+ end