mkuklis-webrat 0.5.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 (213) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +413 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +188 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat/adapters/mechanize.rb +78 -0
  10. data/lib/webrat/adapters/merb.rb +11 -0
  11. data/lib/webrat/adapters/rack.rb +25 -0
  12. data/lib/webrat/adapters/rails.rb +81 -0
  13. data/lib/webrat/adapters/sinatra.rb +9 -0
  14. data/lib/webrat/core/configuration.rb +92 -0
  15. data/lib/webrat/core/elements/area.rb +31 -0
  16. data/lib/webrat/core/elements/element.rb +33 -0
  17. data/lib/webrat/core/elements/field.rb +487 -0
  18. data/lib/webrat/core/elements/form.rb +103 -0
  19. data/lib/webrat/core/elements/label.rb +31 -0
  20. data/lib/webrat/core/elements/link.rb +93 -0
  21. data/lib/webrat/core/elements/select_option.rb +48 -0
  22. data/lib/webrat/core/locators/area_locator.rb +38 -0
  23. data/lib/webrat/core/locators/button_locator.rb +54 -0
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  26. data/lib/webrat/core/locators/field_locator.rb +25 -0
  27. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  28. data/lib/webrat/core/locators/form_locator.rb +19 -0
  29. data/lib/webrat/core/locators/label_locator.rb +34 -0
  30. data/lib/webrat/core/locators/link_locator.rb +74 -0
  31. data/lib/webrat/core/locators/locator.rb +20 -0
  32. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  33. data/lib/webrat/core/locators.rb +20 -0
  34. data/lib/webrat/core/logging.rb +23 -0
  35. data/lib/webrat/core/matchers/have_content.rb +68 -0
  36. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  37. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  38. data/lib/webrat/core/matchers/have_xpath.rb +122 -0
  39. data/lib/webrat/core/matchers.rb +4 -0
  40. data/lib/webrat/core/methods.rb +64 -0
  41. data/lib/webrat/core/mime.rb +18 -0
  42. data/lib/webrat/core/save_and_open_page.rb +48 -0
  43. data/lib/webrat/core/scope.rb +365 -0
  44. data/lib/webrat/core/session.rb +306 -0
  45. data/lib/webrat/core/xml.rb +72 -0
  46. data/lib/webrat/core.rb +13 -0
  47. data/lib/webrat/core_extensions/blank.rb +58 -0
  48. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  49. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  50. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  51. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  52. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  53. data/lib/webrat/integrations/merb.rb +10 -0
  54. data/lib/webrat/integrations/rails.rb +25 -0
  55. data/lib/webrat/integrations/rspec-rails.rb +10 -0
  56. data/lib/webrat/integrations/selenium.rb +11 -0
  57. data/lib/webrat/merb.rb +9 -0
  58. data/lib/webrat/rspec-rails.rb +2 -0
  59. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  60. data/lib/webrat/selenium/application_servers/base.rb +54 -0
  61. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  62. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  63. data/lib/webrat/selenium/application_servers/rails.rb +67 -0
  64. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  65. data/lib/webrat/selenium/application_servers.rb +5 -0
  66. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  67. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
  68. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  72. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  73. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  74. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  75. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  76. data/lib/webrat/selenium/matchers.rb +4 -0
  77. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  78. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  79. data/lib/webrat/selenium/selenium_session.rb +272 -0
  80. data/lib/webrat/selenium/silence_stream.rb +18 -0
  81. data/lib/webrat/selenium.rb +70 -0
  82. data/lib/webrat.rb +18 -0
  83. data/spec/fakes/test_adapter.rb +37 -0
  84. data/spec/integration/mechanize/Rakefile +7 -0
  85. data/spec/integration/mechanize/config.ru +2 -0
  86. data/spec/integration/mechanize/sample_app.rb +20 -0
  87. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  88. data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
  89. data/spec/integration/merb/.gitignore +21 -0
  90. data/spec/integration/merb/Rakefile +35 -0
  91. data/spec/integration/merb/app/controllers/application.rb +2 -0
  92. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  93. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  94. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  95. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  96. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  97. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  98. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  99. data/spec/integration/merb/config/environments/development.rb +15 -0
  100. data/spec/integration/merb/config/environments/rake.rb +11 -0
  101. data/spec/integration/merb/config/environments/test.rb +14 -0
  102. data/spec/integration/merb/config/init.rb +25 -0
  103. data/spec/integration/merb/config/rack.rb +11 -0
  104. data/spec/integration/merb/config/router.rb +34 -0
  105. data/spec/integration/merb/spec/spec.opts +1 -0
  106. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  107. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  108. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  109. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  110. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  111. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  112. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  113. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  114. data/spec/integration/rack/Rakefile +5 -0
  115. data/spec/integration/rack/app.rb +89 -0
  116. data/spec/integration/rack/test/helper.rb +21 -0
  117. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  118. data/spec/integration/rails/.gitignore +3 -0
  119. data/spec/integration/rails/Rakefile +30 -0
  120. data/spec/integration/rails/app/controllers/application.rb +15 -0
  121. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  122. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  123. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  124. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  125. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  126. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  128. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  129. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  131. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  132. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  133. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  134. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  135. data/spec/integration/rails/config/boot.rb +109 -0
  136. data/spec/integration/rails/config/environment.rb +12 -0
  137. data/spec/integration/rails/config/environments/development.rb +17 -0
  138. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  139. data/spec/integration/rails/config/environments/test.rb +22 -0
  140. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  141. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  142. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  143. data/spec/integration/rails/config/locales/en.yml +5 -0
  144. data/spec/integration/rails/config/routes.rb +19 -0
  145. data/spec/integration/rails/public/404.html +30 -0
  146. data/spec/integration/rails/public/422.html +30 -0
  147. data/spec/integration/rails/public/500.html +33 -0
  148. data/spec/integration/rails/script/about +4 -0
  149. data/spec/integration/rails/script/console +3 -0
  150. data/spec/integration/rails/script/dbconsole +3 -0
  151. data/spec/integration/rails/script/destroy +3 -0
  152. data/spec/integration/rails/script/generate +3 -0
  153. data/spec/integration/rails/script/performance/benchmarker +3 -0
  154. data/spec/integration/rails/script/performance/profiler +3 -0
  155. data/spec/integration/rails/script/performance/request +3 -0
  156. data/spec/integration/rails/script/plugin +3 -0
  157. data/spec/integration/rails/script/process/inspector +3 -0
  158. data/spec/integration/rails/script/process/reaper +3 -0
  159. data/spec/integration/rails/script/process/spawner +3 -0
  160. data/spec/integration/rails/script/runner +3 -0
  161. data/spec/integration/rails/script/server +3 -0
  162. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  163. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  164. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  165. data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
  166. data/spec/integration/rails/test/test_helper.rb +26 -0
  167. data/spec/integration/sinatra/Rakefile +5 -0
  168. data/spec/integration/sinatra/classic_app.rb +64 -0
  169. data/spec/integration/sinatra/modular_app.rb +16 -0
  170. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  171. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  172. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  173. data/spec/private/core/configuration_spec.rb +87 -0
  174. data/spec/private/core/field_spec.rb +85 -0
  175. data/spec/private/core/link_spec.rb +24 -0
  176. data/spec/private/core/session_spec.rb +200 -0
  177. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
  178. data/spec/private/nokogiri_spec.rb +77 -0
  179. data/spec/private/rails/attaches_file_spec.rb +81 -0
  180. data/spec/private/rails/rails_adapter_spec.rb +86 -0
  181. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  182. data/spec/public/basic_auth_spec.rb +24 -0
  183. data/spec/public/check_spec.rb +191 -0
  184. data/spec/public/choose_spec.rb +118 -0
  185. data/spec/public/click_area_spec.rb +106 -0
  186. data/spec/public/click_button_spec.rb +494 -0
  187. data/spec/public/click_link_spec.rb +511 -0
  188. data/spec/public/fill_in_spec.rb +224 -0
  189. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  190. data/spec/public/locators/field_labeled_spec.rb +172 -0
  191. data/spec/public/locators/field_with_id_spec.rb +16 -0
  192. data/spec/public/matchers/contain_spec.rb +114 -0
  193. data/spec/public/matchers/have_selector_spec.rb +146 -0
  194. data/spec/public/matchers/have_tag_spec.rb +39 -0
  195. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  196. data/spec/public/reload_spec.rb +10 -0
  197. data/spec/public/save_and_open_spec.rb +70 -0
  198. data/spec/public/select_date_spec.rb +112 -0
  199. data/spec/public/select_datetime_spec.rb +137 -0
  200. data/spec/public/select_spec.rb +455 -0
  201. data/spec/public/select_time_spec.rb +100 -0
  202. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  203. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  204. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  205. data/spec/public/set_hidden_field_spec.rb +5 -0
  206. data/spec/public/submit_form_spec.rb +5 -0
  207. data/spec/public/visit_spec.rb +58 -0
  208. data/spec/public/within_spec.rb +177 -0
  209. data/spec/rcov.opts +1 -0
  210. data/spec/spec.opts +2 -0
  211. data/spec/spec_helper.rb +54 -0
  212. data/vendor/selenium-server.jar +0 -0
  213. metadata +409 -0
@@ -0,0 +1,306 @@
1
+ require "forwardable"
2
+ require "ostruct"
3
+
4
+ require "webrat/core/mime"
5
+ require "webrat/core/save_and_open_page"
6
+
7
+ module Webrat
8
+ # A page load or form submission returned an unsuccessful response code (500-599)
9
+ class PageLoadError < WebratError
10
+ end
11
+
12
+ class InfiniteRedirectError < WebratError
13
+ end
14
+
15
+ def self.session_class
16
+ if Webrat.configuration.mode == :selenium
17
+ SeleniumSession
18
+ else
19
+ Session
20
+ end
21
+ end
22
+
23
+ def self.adapter_class
24
+ case Webrat.configuration.mode
25
+ when :rails
26
+ RailsAdapter
27
+ when :merb
28
+ MerbAdapter
29
+ when :rack
30
+ RackAdapter
31
+ when :rack_test
32
+ warn("The :rack_test mode is deprecated. Please use :rack instead")
33
+ require "webrat/rack"
34
+ RackAdapter
35
+ when :sinatra
36
+ warn("The :sinatra mode is deprecated. Please use :rack instead")
37
+ SinatraAdapter
38
+ when :mechanize
39
+ MechanizeAdapter
40
+ else
41
+ raise WebratError.new(<<-STR)
42
+ Unknown Webrat mode: #{Webrat.configuration.mode.inspect}
43
+
44
+ Please ensure you have a Webrat configuration block that specifies a mode
45
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
46
+
47
+ This configure block supercedes the need to require "webrat/<framework>".
48
+
49
+ For example:
50
+
51
+ Webrat.configure do |config|
52
+ config.mode = :rails
53
+ end
54
+ STR
55
+ end
56
+ end
57
+
58
+ class Session
59
+ extend Forwardable
60
+ include Logging
61
+ include SaveAndOpenPage
62
+
63
+ attr_accessor :adapter
64
+
65
+ attr_reader :current_url
66
+ attr_reader :elements
67
+
68
+ def_delegators :@adapter, :response, :response_code, :response_body,
69
+ :response_body=, :response_code=,
70
+ :get, :post, :put, :delete
71
+
72
+ def initialize(adapter = nil)
73
+ @adapter = adapter
74
+ @http_method = :get
75
+ @data = {}
76
+ @default_headers = {}
77
+ @custom_headers = {}
78
+ reset
79
+ end
80
+
81
+ def current_dom #:nodoc:
82
+ current_scope.dom
83
+ end
84
+
85
+ # For backwards compatibility -- removing in 1.0
86
+ def current_page #:nodoc:
87
+ warn "current_page is deprecated and will be going away in the next release. Use current_url instead."
88
+ page = OpenStruct.new
89
+ page.url = @current_url
90
+ page.http_method = @http_method
91
+ page.data = @data
92
+ page
93
+ end
94
+
95
+ def doc_root #:nodoc:
96
+ nil
97
+ end
98
+
99
+ def header(key, value)
100
+ @custom_headers[key] = value
101
+ end
102
+
103
+ def http_accept(mime_type)
104
+ header('Accept', Webrat::MIME.mime_type(mime_type))
105
+ end
106
+
107
+ def basic_auth(user, pass)
108
+ encoded_login = ["#{user}:#{pass}"].pack("m*")
109
+ header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
110
+ end
111
+
112
+ def headers #:nodoc:
113
+ @default_headers.dup.merge(@custom_headers.dup)
114
+ end
115
+
116
+ def request_page(url, http_method, data) #:nodoc:
117
+ h = headers
118
+ h['HTTP_REFERER'] = @current_url if @current_url
119
+
120
+ debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}"
121
+
122
+ process_request(http_method, url, data, h)
123
+
124
+ save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
125
+ raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
126
+
127
+ reset
128
+
129
+ @current_url = url
130
+ @http_method = http_method
131
+ @data = data
132
+
133
+ if internal_redirect?
134
+ check_for_infinite_redirects
135
+ request_page(response_location, :get, {})
136
+ end
137
+
138
+ return response
139
+ end
140
+
141
+ def check_for_infinite_redirects
142
+ if current_url == response_location
143
+ @_identical_redirect_count ||= 0
144
+ @_identical_redirect_count += 1
145
+ end
146
+
147
+ if infinite_redirect_limit_exceeded?
148
+ raise InfiniteRedirectError.new("#{Webrat.configuration.infinite_redirect_limit} redirects to the same URL (#{current_url.inspect})")
149
+ end
150
+ end
151
+
152
+ def infinite_redirect_limit_exceeded?
153
+ Webrat.configuration.infinite_redirect_limit &&
154
+ (@_identical_redirect_count || 0) > Webrat.configuration.infinite_redirect_limit
155
+ end
156
+
157
+ def success_code? #:nodoc:
158
+ (200..499).include?(response_code)
159
+ end
160
+
161
+ def redirect? #:nodoc:
162
+ (response_code / 100).to_i == 3
163
+ end
164
+
165
+ def internal_redirect?
166
+ return false unless redirect?
167
+ #should keep internal_redirects if the subdomain changes
168
+ current_host_domain = current_host.split('.')[-2..-1].join('.') rescue current_host
169
+ response_location_host_domain = response_location_host.split('.')[-2..-1].join('.') rescue response_location_host
170
+ current_host_domain == response_location_host_domain
171
+ end
172
+
173
+ #easy helper to pull out where we were redirected to
174
+ def redirected_to
175
+ redirect? ? response_location : nil
176
+ end
177
+
178
+ def exception_caught? #:nodoc:
179
+ response_body =~ /Exception caught/
180
+ end
181
+
182
+ def current_scope #:nodoc:
183
+ scopes.last || page_scope
184
+ end
185
+
186
+ # Reloads the last page requested. Note that this will resubmit forms
187
+ # and their data.
188
+ def reload
189
+ request_page(@current_url, @http_method, @data)
190
+ end
191
+
192
+ webrat_deprecate :reloads, :reload
193
+
194
+
195
+ # Works like click_link, but only looks for the link text within a given selector
196
+ #
197
+ # Example:
198
+ # click_link_within "#user_12", "Vote"
199
+ def click_link_within(selector, link_text)
200
+ within(selector) do
201
+ click_link(link_text)
202
+ end
203
+ end
204
+
205
+ webrat_deprecate :clicks_link_within, :click_link_within
206
+
207
+ def within(selector)
208
+ scopes.push(Scope.from_scope(self, current_scope, selector))
209
+ ret = yield(current_scope)
210
+ scopes.pop
211
+ return ret
212
+ end
213
+
214
+ # Issues a GET request for a page, follows any redirects, and verifies the final page
215
+ # load was successful.
216
+ #
217
+ # Example:
218
+ # visit "/"
219
+ def visit(url = nil, http_method = :get, data = {})
220
+ request_page(url, http_method, data)
221
+ end
222
+
223
+ webrat_deprecate :visits, :visit
224
+
225
+ # Subclasses can override this to show error messages without html
226
+ def formatted_error #:nodoc:
227
+ response_body
228
+ end
229
+
230
+ def scopes #:nodoc:
231
+ @_scopes ||= []
232
+ end
233
+
234
+ def page_scope #:nodoc:
235
+ @_page_scope ||= Scope.from_page(self, response, response_body)
236
+ end
237
+
238
+ def dom
239
+ page_scope.dom
240
+ end
241
+
242
+ def xml_content_type?
243
+ false
244
+ end
245
+
246
+ def simulate
247
+ return if Webrat.configuration.mode == :selenium
248
+ yield
249
+ end
250
+
251
+ def automate
252
+ return unless Webrat.configuration.mode == :selenium
253
+ yield
254
+ end
255
+
256
+ def_delegators :current_scope, :fill_in, :fills_in
257
+ def_delegators :current_scope, :set_hidden_field
258
+ def_delegators :current_scope, :submit_form
259
+ def_delegators :current_scope, :check, :checks
260
+ def_delegators :current_scope, :uncheck, :unchecks
261
+ def_delegators :current_scope, :choose, :chooses
262
+ def_delegators :current_scope, :select, :selects
263
+ def_delegators :current_scope, :unselect, :unselects
264
+ def_delegators :current_scope, :select_datetime, :selects_datetime
265
+ def_delegators :current_scope, :select_date, :selects_date
266
+ def_delegators :current_scope, :select_time, :selects_time
267
+ def_delegators :current_scope, :attach_file, :attaches_file
268
+ def_delegators :current_scope, :click_area, :clicks_area
269
+ def_delegators :current_scope, :click_link, :clicks_link
270
+ def_delegators :current_scope, :click_button, :clicks_button
271
+ def_delegators :current_scope, :field_labeled
272
+ def_delegators :current_scope, :field_by_xpath
273
+ def_delegators :current_scope, :field_with_id
274
+ def_delegators :current_scope, :select_option
275
+ def_delegators :current_scope, :field_named
276
+
277
+ private
278
+
279
+ def process_request(http_method, url, data, headers)
280
+ if headers.empty?
281
+ send "#{http_method}", url, data || {}
282
+ else
283
+ send "#{http_method}", url, data || {}, headers
284
+ end
285
+ end
286
+
287
+ def response_location
288
+ response.headers["Location"]
289
+ end
290
+
291
+ def current_host
292
+ URI.parse(current_url).host || @custom_headers["Host"] || "www.example.com"
293
+ end
294
+
295
+ def response_location_host
296
+ URI.parse(response_location).host || "www.example.com"
297
+ end
298
+
299
+ def reset
300
+ @elements = {}
301
+ @_scopes = nil
302
+ @_page_scope = nil
303
+ end
304
+
305
+ end
306
+ end
@@ -0,0 +1,72 @@
1
+ require "webrat/core_extensions/meta_class"
2
+
3
+ module Webrat #:nodoc:
4
+ module XML #:nodoc:
5
+
6
+ def self.document(stringlike) #:nodoc:
7
+ return stringlike.dom if stringlike.respond_to?(:dom)
8
+
9
+ if Nokogiri::HTML::Document === stringlike
10
+ stringlike
11
+ elsif Nokogiri::XML::NodeSet === stringlike
12
+ stringlike
13
+ elsif stringlike.respond_to?(:body)
14
+ Nokogiri::HTML(stringlike.body.to_s)
15
+ else
16
+ Nokogiri::HTML(stringlike.to_s)
17
+ end
18
+ end
19
+
20
+ def self.html_document(stringlike) #:nodoc:
21
+ return stringlike.dom if stringlike.respond_to?(:dom)
22
+
23
+ if Nokogiri::HTML::Document === stringlike
24
+ stringlike
25
+ elsif Nokogiri::XML::NodeSet === stringlike
26
+ stringlike
27
+ elsif stringlike.respond_to?(:body)
28
+ Nokogiri::HTML(stringlike.body.to_s)
29
+ else
30
+ Nokogiri::HTML(stringlike.to_s)
31
+ end
32
+ end
33
+
34
+ def self.xml_document(stringlike) #:nodoc:
35
+ return stringlike.dom if stringlike.respond_to?(:dom)
36
+
37
+ if Nokogiri::HTML::Document === stringlike
38
+ stringlike
39
+ elsif Nokogiri::XML::NodeSet === stringlike
40
+ stringlike
41
+ elsif stringlike.respond_to?(:body)
42
+ Nokogiri::XML(stringlike.body.to_s)
43
+ else
44
+ Nokogiri::XML(stringlike.to_s)
45
+ end
46
+ end
47
+
48
+ def self.define_dom_method(object, dom) #:nodoc:
49
+ object.meta_class.send(:define_method, :dom) do
50
+ dom
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+
57
+ module Nokogiri #:nodoc:
58
+ module CSS #:nodoc:
59
+ class XPathVisitor #:nodoc:
60
+
61
+ def visit_pseudo_class_text(node) #:nodoc:
62
+ "@type='text'"
63
+ end
64
+
65
+ def visit_pseudo_class_password(node) #:nodoc:
66
+ "@type='password'"
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+
@@ -0,0 +1,13 @@
1
+ require "webrat/core/configuration"
2
+ require "webrat/core/xml"
3
+ require "webrat/core/logging"
4
+ require "webrat/core/elements/form"
5
+ require "webrat/core/scope"
6
+ require "webrat/core/elements/link"
7
+ require "webrat/core/elements/area"
8
+ require "webrat/core/elements/label"
9
+ require "webrat/core/elements/select_option"
10
+ require "webrat/core/session"
11
+ require "webrat/core/methods"
12
+ require "webrat/core/matchers"
13
+ require "webrat/core/save_and_open_page"
@@ -0,0 +1,58 @@
1
+ class Object #:nodoc:
2
+ # An object is blank if it's false, empty, or a whitespace string.
3
+ # For example, "", " ", +nil+, [], and {} are blank.
4
+ #
5
+ # This simplifies
6
+ #
7
+ # if !address.nil? && !address.empty?
8
+ #
9
+ # to
10
+ #
11
+ # if !address.blank?
12
+ def blank?
13
+ respond_to?(:empty?) ? empty? : !self
14
+ end
15
+
16
+ # An object is present if it's not blank.
17
+ def present?
18
+ !blank?
19
+ end
20
+ end
21
+
22
+ class NilClass #:nodoc:
23
+ def blank?
24
+ true
25
+ end
26
+ end
27
+
28
+ class FalseClass #:nodoc:
29
+ def blank?
30
+ true
31
+ end
32
+ end
33
+
34
+ class TrueClass #:nodoc:
35
+ def blank?
36
+ false
37
+ end
38
+ end
39
+
40
+ class Array #:nodoc:
41
+ alias_method :blank?, :empty?
42
+ end
43
+
44
+ class Hash #:nodoc:
45
+ alias_method :blank?, :empty?
46
+ end
47
+
48
+ class String #:nodoc:
49
+ def blank?
50
+ self !~ /\S/
51
+ end
52
+ end
53
+
54
+ class Numeric #:nodoc:
55
+ def blank?
56
+ false
57
+ end
58
+ end
@@ -0,0 +1,8 @@
1
+ class Module #:nodoc:
2
+ def webrat_deprecate(old_method_name, new_method_name)
3
+ define_method old_method_name do |*args|
4
+ warn "#{old_method_name} is deprecated. Use #{new_method_name} instead."
5
+ __send__(new_method_name, *args)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ class Array #:nodoc:
2
+
3
+ def detect_mapped
4
+ each do |element|
5
+ result = yield element
6
+ return result if result
7
+ end
8
+
9
+ return nil
10
+ end
11
+
12
+ end
@@ -0,0 +1,6 @@
1
+ class ::Object #:nodoc:
2
+ def meta_class
3
+ class << self; self end
4
+ end
5
+ end
6
+
@@ -0,0 +1,5 @@
1
+ class NilClass #:nodoc:
2
+ def to_param
3
+ nil
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ class TCPSocket
2
+
3
+ def self.wait_for_service_with_timeout(options)
4
+ start_time = Time.now
5
+
6
+ until listening_service?(options)
7
+ verbose_wait
8
+
9
+ if options[:timeout] && (Time.now > start_time + options[:timeout])
10
+ raise SocketError.new("Socket did not open within #{options[:timeout]} seconds")
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.wait_for_service_termination_with_timeout(options)
16
+ start_time = Time.now
17
+
18
+ while listening_service?(options)
19
+ verbose_wait
20
+
21
+ if options[:timeout] && (Time.now > start_time + options[:timeout])
22
+ raise SocketError.new("Socket did not terminate within #{options[:timeout]} seconds")
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,10 @@
1
+ module Merb #:nodoc:
2
+ module Test #:nodoc:
3
+ module RequestHelper #:nodoc:
4
+ def request(uri, env = {})
5
+ @_webrat_session ||= Webrat::MerbAdapter.new
6
+ @_webrat_session.response = @_webrat_session.request(uri, env)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ require "action_controller"
2
+ require "action_controller/integration"
3
+
4
+ module ActionController #:nodoc:
5
+ IntegrationTest.class_eval do
6
+ include Webrat::Methods
7
+ include Webrat::Matchers
8
+
9
+ # The Rails version of within supports passing in a model and Webrat
10
+ # will apply a scope based on Rails' dom_id for that model.
11
+ #
12
+ # Example:
13
+ # within User.last do
14
+ # click_link "Delete"
15
+ # end
16
+ def within(selector_or_object, &block)
17
+ if selector_or_object.is_a?(String)
18
+ super
19
+ else
20
+ super('#' + RecordIdentifier.dom_id(selector_or_object), &block)
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ # Supports using the matchers in controller, helper, and view specs if you're
2
+ # using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
3
+ #
4
+ # require 'webrat/rspec-rails'
5
+ #
6
+ require "webrat/core/matchers"
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.include(Webrat::Matchers, :type => [:controller, :helper, :view])
10
+ end
@@ -0,0 +1,11 @@
1
+ require "webrat/selenium"
2
+
3
+ if defined?(ActionController::IntegrationTest)
4
+ module ActionController #:nodoc:
5
+ IntegrationTest.class_eval do
6
+ include Webrat::Methods
7
+ include Webrat::Selenium::Methods
8
+ include Webrat::Selenium::Matchers
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ require "webrat"
2
+
3
+ # This is a temporary hack to support backwards compatibility
4
+ # with Merb 1.0.8 until it's updated to use the new Webrat.configure
5
+ # syntax
6
+
7
+ Webrat.configure do |config|
8
+ config.mode = :merb
9
+ end
@@ -0,0 +1,2 @@
1
+ warn("Requiring 'webrat/rspec-rails' is deprecated. Please require 'webrat/integrations/rspec-rails' instead")
2
+ require "webrat/integrations/rspec-rails"
@@ -0,0 +1,40 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class ApplicationServerFactory
5
+
6
+ def self.app_server_instance
7
+ case Webrat.configuration.application_framework
8
+ when :sinatra
9
+ require "webrat/selenium/application_servers/sinatra"
10
+ return Webrat::Selenium::ApplicationServers::Sinatra.new
11
+ when :merb
12
+ require "webrat/selenium/application_servers/merb"
13
+ return Webrat::Selenium::ApplicationServers::Merb.new
14
+ when :rails
15
+ require "webrat/selenium/application_servers/rails"
16
+ return Webrat::Selenium::ApplicationServers::Rails.new
17
+ when :external
18
+ require "webrat/selenium/application_servers/external"
19
+ return Webrat::Selenium::ApplicationServers::External.new
20
+ else
21
+ raise WebratError.new(<<-STR)
22
+ Unknown Webrat application_framework: #{Webrat.configuration.application_framework.inspect}
23
+
24
+ Please ensure you have a Webrat configuration block that specifies an application_framework
25
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
26
+
27
+ For example:
28
+
29
+ Webrat.configure do |config|
30
+ # ...
31
+ config.application_framework = :rails
32
+ end
33
+ STR
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ require "webrat/selenium/silence_stream"
2
+ require "selenium/client"
3
+ module Webrat
4
+ module Selenium
5
+ module ApplicationServers
6
+ class Base
7
+ include Webrat::Selenium::SilenceStream
8
+
9
+ def initialize
10
+ @shell = Nautilus::Shell.new
11
+ end
12
+
13
+ def boot
14
+ start
15
+ wait
16
+ stop_at_exit
17
+ end
18
+
19
+ def stop_at_exit
20
+ at_exit do
21
+ stop
22
+ end
23
+ end
24
+
25
+ def wait
26
+ $stderr.print "==> Waiting for #{Webrat.configuration.application_framework} application server on port #{Webrat.configuration.application_port}... "
27
+ wait_for_socket
28
+ $stderr.print "Ready!\n"
29
+ end
30
+
31
+ def wait_for_socket
32
+ silence_stream(STDOUT) do
33
+ TCPSocket.wait_for_service_with_timeout \
34
+ :host => "127.0.0.1",
35
+ :port => Webrat.configuration.application_port.to_i,
36
+ :timeout => 30 # seconds
37
+ end
38
+ rescue SocketError
39
+ fail
40
+ end
41
+
42
+ def prepare_pid_file(file_path, pid_file_name)
43
+ FileUtils.mkdir_p File.expand_path(file_path)
44
+ File.expand_path("#{file_path}/#{pid_file_name}")
45
+ end
46
+
47
+ def windows?
48
+ RUBY_PLATFORM =~ /mswin/
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end