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,26 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Span do
5
+ let(:span) { PageObject::Elements::Span }
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, :title, :xpath].each do |t|
10
+ identifier = span.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, :text, :title, :xpath].each do |t|
17
+ key, value = span.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ it "should register with tag_name :span" do
24
+ expect(::PageObject::Elements.element_class_for(:span)).to eql ::PageObject::Elements::Span
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::TableCell do
5
+
6
+ context "interface" do
7
+ it "should register with tag_name :td" do
8
+ expect(::PageObject::Elements.element_class_for(:td)).to eql ::PageObject::Elements::TableCell
9
+ end
10
+
11
+ it "should register with tag_name :th" do
12
+ expect(::PageObject::Elements.element_class_for(:th)).to eql ::PageObject::Elements::TableCell
13
+ end
14
+
15
+ it "should always be enabled" do
16
+ table_cell_element = double('table_cell_element')
17
+ table_cell = PageObject::Elements::TableCell.new(table_cell_element, :platform => :selenium_webdriver)
18
+ expect(table_cell.enabled?).to be true
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::TableRow do
5
+ let(:table_cell) { double('table_cell') }
6
+ let(:table_row_driver) { double('table_row_driver') }
7
+
8
+ describe "interface" do
9
+
10
+ it "should register with tag_name :tr" do
11
+ expect(::PageObject::Elements.element_class_for(:tr)).to eql ::PageObject::Elements::TableRow
12
+ end
13
+
14
+ context "for selenium" do
15
+ it "should return a table cell when indexed" do
16
+ table_row = PageObject::Elements::TableRow.new(table_row_driver, :platform => :selenium_webdriver)
17
+ allow(table_row).to receive(:columns).and_return(2)
18
+ expect(table_row_driver).to receive(:find_elements).with(:xpath, ".//child::td|th").and_return(table_cell)
19
+ expect(table_cell).to receive(:[]).and_return(table_cell)
20
+ expect(table_row[0]).to be_instance_of PageObject::Elements::TableCell
21
+ end
22
+
23
+ it "should retrun the number of columns" do
24
+ table_row = PageObject::Elements::TableRow.new(table_row_driver, :platform => :selenium_webdriver)
25
+ expect(table_row_driver).to receive(:find_elements).with(:xpath, ".//child::td|th").and_return(table_row_driver)
26
+ expect(table_row_driver).to receive(:size).and_return(3)
27
+ expect(table_row.columns).to eql 3
28
+ end
29
+
30
+ it "should iterate over the table columns" do
31
+ table_row = PageObject::Elements::TableRow.new(table_row_driver, :platform => :selenium_webdriver)
32
+ expect(table_row).to receive(:columns).and_return(2)
33
+ allow(table_row).to receive(:[]).and_return(table_row_driver)
34
+ count = 0
35
+ table_row.each { |e| count += 1 }
36
+ expect(count).to eql 2
37
+ end
38
+ end
39
+
40
+ context "for watir" do
41
+ before(:each) do
42
+ allow(table_row_driver).to receive(:find_elements).and_return(table_row_driver)
43
+ end
44
+
45
+ it "should return a table cell when indexed" do
46
+ table_row = PageObject::Elements::TableRow.new(table_row_driver, :platform => :watir_webdriver)
47
+ allow(table_row).to receive(:columns).and_return(2)
48
+ expect(table_row_driver).to receive(:[]).with(1).and_return(table_cell)
49
+ expect(table_row[1]).to be_instance_of PageObject::Elements::TableCell
50
+ end
51
+
52
+ it "should return the number of columns" do
53
+ table_row = PageObject::Elements::TableRow.new(table_row_driver, :platform => :watir_webdriver)
54
+ allow(table_row_driver).to receive(:wd).and_return(table_row_driver)
55
+ expect(table_row_driver).to receive(:find_elements).with(:xpath, ".//child::td|th").and_return(table_row_driver)
56
+ expect(table_row_driver).to receive(:size).and_return(3)
57
+ expect(table_row.columns).to eql 3
58
+ end
59
+
60
+ it "should iterate over the table columns" do
61
+ table_row = PageObject::Elements::TableRow.new(table_row_driver, :platform => :watir_webdriver)
62
+ expect(table_row).to receive(:columns).and_return(2)
63
+ allow(table_row).to receive(:[])
64
+ count = 0
65
+ table_row.each { |e| count += 1 }
66
+ expect(count).to eql 2
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::Table do
5
+ describe "when mapping how to find an element" do
6
+ it "should map watir types to same" do
7
+ [:class, :id, :index, :xpath].each do |t|
8
+ identifier = PageObject::Elements::Table.watir_identifier_for t => 'value'
9
+ expect(identifier.keys.first).to eql t
10
+ end
11
+ end
12
+
13
+ it "should map selenium types to same" do
14
+ [:class, :id, :index, :name, :xpath].each do |t|
15
+ key, value = PageObject::Elements::Table.selenium_identifier_for t => 'value'
16
+ expect(key).to eql t
17
+ end
18
+ end
19
+ end
20
+
21
+ describe "interface" do
22
+ let(:table_element) { double('table_element') }
23
+
24
+ before(:each) do
25
+ allow(table_element).to receive(:[]).and_return(table_element)
26
+ allow(table_element).to receive(:find_elements).and_return(table_element)
27
+ end
28
+
29
+ it "should register with tag_name :table" do
30
+ expect(::PageObject::Elements.element_class_for(:table)).to eql ::PageObject::Elements::Table
31
+ end
32
+
33
+ context "for watir" do
34
+ let(:watir_table) { PageObject::Elements::Table.new(table_element, :platform => :watir_webdriver) }
35
+
36
+ it "should return a table row when indexed" do
37
+ allow(table_element).to receive(:[]).with(1).and_return(table_element)
38
+ expect(watir_table[1]).to be_instance_of PageObject::Elements::TableRow
39
+ end
40
+
41
+ it "should return the first row" do
42
+ allow(table_element).to receive(:[]).with(0).and_return(table_element)
43
+ expect(watir_table.first_row).to be_instance_of PageObject::Elements::TableRow
44
+ end
45
+
46
+ it "shoudl return the last row" do
47
+ allow(table_element).to receive(:[]).with(-1).and_return(table_element)
48
+ expect(watir_table.last_row).to be_instance_of PageObject::Elements::TableRow
49
+ end
50
+
51
+ it "should return the number of rows" do
52
+ allow(table_element).to receive(:wd).and_return(table_element)
53
+ expect(table_element).to receive(:find_elements).with(:xpath, ".//child::tr").and_return(table_element)
54
+ expect(table_element).to receive(:size).and_return(2)
55
+ expect(watir_table.rows).to eql 2
56
+ end
57
+
58
+ it "should iterate over the table rows" do
59
+ expect(watir_table).to receive(:rows).and_return(2)
60
+ count = 0
61
+ watir_table.each { |e| count += 1 }
62
+ expect(count).to eql 2
63
+ end
64
+ end
65
+
66
+ context "for selenium" do
67
+ let(:selenium_table) { PageObject::Elements::Table.new(table_element, :platform => :selenium_webdriver) }
68
+
69
+ it "should return a table row when indexed" do
70
+ expect(table_element).to receive(:find_elements).with(:xpath, ".//child::tr").and_return(table_element)
71
+ expect(selenium_table[1]).to be_instance_of PageObject::Elements::TableRow
72
+ end
73
+
74
+ it "should return the first row" do
75
+ allow(table_element).to receive(:[]).with(0).and_return(table_element)
76
+ expect(selenium_table.first_row).to be_instance_of PageObject::Elements::TableRow
77
+ end
78
+
79
+ it "shoudl return the last row" do
80
+ allow(table_element).to receive(:[]).with(-1).and_return(table_element)
81
+ expect(selenium_table.last_row).to be_instance_of PageObject::Elements::TableRow
82
+ end
83
+
84
+ it "should return the number of rows" do
85
+ expect(table_element).to receive(:find_elements).with(:xpath, ".//child::tr").and_return(table_element)
86
+ expect(table_element).to receive(:size).and_return(2)
87
+ expect(selenium_table.rows).to eql 2
88
+ end
89
+
90
+ it "should iterate over the table rows" do
91
+ allow(selenium_table).to receive(:rows).and_return(2)
92
+ count = 0
93
+ selenium_table.each { |e| count += 1 }
94
+ expect(count).to eql 2
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::TextArea do
5
+ let(:textarea) { PageObject::Elements::TextArea }
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 = textarea.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 = textarea.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_name :textarea" do
26
+ expect(::PageObject::Elements.element_class_for(:textarea)).to eql ::PageObject::Elements::TextArea
27
+ end
28
+
29
+ context "for Selenium" do
30
+ it "should set its' value" do
31
+ text_area_element = double('text_area')
32
+ text_area = PageObject::Elements::TextArea.new(text_area_element, :platform => :selenium_webdriver)
33
+ expect(text_area_element).to receive(:clear)
34
+ expect(text_area_element).to receive(:send_keys).with('Joseph')
35
+ text_area.value = 'Joseph'
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements'
3
+
4
+ describe PageObject::Elements::UnorderedList do
5
+ let(:ul) { PageObject::Elements::UnorderedList }
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 = ul.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 = ul.selenium_identifier_for t => 'value'
18
+ expect(key).to eql t
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "interface" do
24
+ let(:ul_element) { double('ul_element') }
25
+
26
+ it "should register with tag_name :ul" do
27
+ expect(::PageObject::Elements.element_class_for(:ul)).to eql ::PageObject::Elements::UnorderedList
28
+ end
29
+
30
+ context "for watir" do
31
+ it "should return a list item when indexed" do
32
+ ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :watir_webdriver)
33
+ allow(ul_element).to receive(:uls).and_return([ul_element])
34
+ allow(ul_element).to receive(:find_elements).and_return(ul_element)
35
+ allow(ul_element).to receive(:map).and_return([ul_element])
36
+ allow(ul_element).to receive(:parent).and_return(ul_element)
37
+ allow(ul_element).to receive(:element).and_return(ul_element)
38
+ allow(ul_element).to receive(:==).and_return(true)
39
+ ul[1]
40
+ end
41
+
42
+ it "should know how many items it contains" do
43
+ ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :watir_webdriver)
44
+ allow(ul_element).to receive(:uls).and_return([ul_element])
45
+ allow(ul_element).to receive(:find_elements).and_return(ul_element)
46
+ allow(ul_element).to receive(:map).and_return([ul_element])
47
+ allow(ul_element).to receive(:parent).and_return(ul_element)
48
+ allow(ul_element).to receive(:element).and_return(ul_element)
49
+ allow(ul_element).to receive(:==).and_return(true)
50
+ expect(ul.items).to eql 1
51
+ end
52
+
53
+ it "should know how to iterate over the items" do
54
+ ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :watir_webdriver)
55
+ expect(ul).to receive(:items).and_return(5)
56
+ allow(ul).to receive(:[])
57
+ count = 0
58
+ ul.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
+ ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :selenium_webdriver)
66
+ expect(ul_element).to receive(:find_elements).and_return(ul_element)
67
+ expect(ul_element).to receive(:map).and_return([ul_element])
68
+ expect(ul_element).to receive(:parent).and_return(ul_element)
69
+ expect(ul_element).to receive(:element).and_return(ul_element)
70
+ expect(ul_element).to receive(:==).and_return(true)
71
+ ul[1]
72
+ end
73
+
74
+ it "should know how many items it contains" do
75
+ ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :selenium_webdriver)
76
+ expect(ul_element).to receive(:find_elements).and_return(ul_element)
77
+ expect(ul_element).to receive(:map).and_return([ul_element])
78
+ expect(ul_element).to receive(:parent).and_return(ul_element)
79
+ expect(ul_element).to receive(:element).and_return(ul_element)
80
+ expect(ul_element).to receive(:==).and_return(true)
81
+ expect(ul.items).to eql 1
82
+ end
83
+
84
+ it "should know how to iterate over the items" do
85
+ ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :selenium_webdriver)
86
+ expect(ul).to receive(:items).and_return(5)
87
+ allow(ul).to receive(:[])
88
+ count = 0
89
+ ul.each { |item| count += 1 }
90
+ expect(count).to eql 5
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,145 @@
1
+ require 'spec_helper'
2
+ require 'page-object/elements/element'
3
+
4
+ describe "Element for Watir" do
5
+ let(:watir_driver) { double('watir_driver') }
6
+ let(:watir_element) { ::PageObject::Elements::Element.new(watir_driver, :platform => :watir_webdriver) }
7
+
8
+ before(:each) do
9
+ allow(Selenium::WebDriver::Mouse).to receive(:new).and_return(watir_driver)
10
+ end
11
+
12
+ it "should know when it is visible" do
13
+ allow(watir_driver).to receive(:present?).and_return(true)
14
+ allow(watir_driver).to receive(:displayed?).and_return(true)
15
+ expect(watir_element.visible?).to eql true
16
+ end
17
+
18
+ it "should know when it is not visible" do
19
+ allow(watir_driver).to receive(:present?).and_return(false)
20
+ allow(watir_driver).to receive(:displayed?).and_return(false)
21
+ expect(watir_element.visible?).to eql false
22
+ end
23
+
24
+ it "should know when it exists" do
25
+ allow(watir_driver).to receive(:exists?).and_return(true)
26
+ expect(watir_element.exists?).to eql true
27
+ end
28
+
29
+ it "should know when it does not exist" do
30
+ allow(watir_driver).to receive(:exists?).and_return(false)
31
+ allow(watir_driver).to receive(:nil?).and_return(true)
32
+ expect(watir_element.exists?).to eql false
33
+ end
34
+
35
+ it "should be able to return the text contained in the element" do
36
+ expect(watir_driver).to receive(:text).and_return("my text")
37
+ expect(watir_element.text).to eql "my text"
38
+ end
39
+
40
+ it "should know when it is equal to another" do
41
+ expect(watir_driver).to receive(:==).and_return(true)
42
+ expect(watir_element).to eq watir_element
43
+ end
44
+
45
+ it "should know when it is not equal to another" do
46
+ expect(watir_element).not_to eq 'not an element'
47
+ end
48
+
49
+ it "should return its tag name" do
50
+ expect(watir_driver).to receive(:tag_name).and_return("h1")
51
+ expect(watir_element.tag_name).to eql "h1"
52
+ end
53
+
54
+ it "should know its value" do
55
+ allow(watir_driver).to receive(:value).and_return("value")
56
+ allow(watir_driver).to receive(:attribute).and_return("value")
57
+ expect(watir_element.value).to eql "value"
58
+ end
59
+
60
+ it "should know how to retrieve the value of an attribute" do
61
+ allow(watir_driver).to receive(:attribute_value).and_return(true)
62
+ allow(watir_driver).to receive(:attribute).and_return(true)
63
+ expect(watir_element.attribute("readonly")).to be true
64
+ end
65
+
66
+ it "should be clickable" do
67
+ expect(watir_driver).to receive(:click)
68
+ watir_element.click
69
+ end
70
+
71
+ it "should be double clickable" do
72
+ expect(watir_driver).to receive(:double_click)
73
+ watir_element.double_click
74
+ end
75
+
76
+ it "should be right clickable" do
77
+ allow(watir_driver).to receive(:right_click)
78
+ allow(watir_driver).to receive(:context_click)
79
+ watir_element.right_click
80
+ end
81
+
82
+ it "should be able to block until it is present" do
83
+ allow(watir_driver).to receive(:wait_until_present).with(10)
84
+ watir_element.when_present(10)
85
+ end
86
+
87
+ it "should return the element when it is present" do
88
+ allow(watir_driver).to receive(:wait_until_present).with(10)
89
+ element = watir_element.when_present(10)
90
+ expect(element).to equal watir_element
91
+ end
92
+
93
+ it "should use the overriden wait when set" do
94
+ PageObject.default_element_wait = 20
95
+ allow(watir_driver).to receive(:wait_until_present).with(20)
96
+ watir_element.when_present
97
+ end
98
+
99
+ it "should be able to block until it is visible" do
100
+ allow(::Watir::Wait).to receive(:until).with(10, "Element was not visible in 10 seconds")
101
+ allow(watir_driver).to receive(:displayed?).and_return(true)
102
+ watir_element.when_visible(10)
103
+ end
104
+
105
+ it "should return the element when it is visible" do
106
+ allow(::Watir::Wait).to receive(:until).with(10, "Element was not visible in 10 seconds")
107
+ allow(watir_driver).to receive(:displayed?).and_return(true)
108
+ element = watir_element.when_visible(10)
109
+ expect(element).to equal watir_element
110
+ end
111
+
112
+ it "should be able to block until it is not visible" do
113
+ allow(::Watir::Wait).to receive(:while).with(10, "Element still visible after 10 seconds")
114
+ allow(watir_driver).to receive(:displayed?).and_return(false)
115
+ watir_element.when_not_visible(10)
116
+ end
117
+
118
+ it "should return the element when it is not visible" do
119
+ allow(::Watir::Wait).to receive(:while).with(10, "Element still visible after 10 seconds")
120
+ allow(watir_driver).to receive(:displayed?).and_return(false)
121
+ element = watir_element.when_not_visible(10)
122
+ expect(element).to equal watir_element
123
+ end
124
+
125
+ it "should be able to block until a user define event fires true" do
126
+ allow(::Watir::Wait).to receive(:until).with(10, "Element blah")
127
+ watir_element.wait_until(10, "Element blah") {true}
128
+ end
129
+
130
+ it "should send keys to the element" do
131
+ expect(watir_driver).to receive(:send_keys).with([:control, 'a'])
132
+ watir_element.send_keys([:control, 'a'])
133
+ end
134
+
135
+ it "should clear its' contents" do
136
+ expect(watir_driver).to receive(:clear)
137
+ watir_element.clear
138
+ end
139
+
140
+ it "should scroll into view" do
141
+ allow(watir_driver).to receive(:wd).and_return(watir_driver)
142
+ expect(watir_driver).to receive(:location_once_scrolled_into_view)
143
+ watir_element.scroll_into_view
144
+ end
145
+ end