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