revo-webrat 0.7.0

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 (215) hide show
  1. data/.document +4 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +19 -0
  4. data/History.txt +437 -0
  5. data/MIT-LICENSE.txt +19 -0
  6. data/README.rdoc +85 -0
  7. data/Rakefile +145 -0
  8. data/Thorfile +118 -0
  9. data/install.rb +1 -0
  10. data/lib/webrat.rb +18 -0
  11. data/lib/webrat/adapters/mechanize.rb +78 -0
  12. data/lib/webrat/adapters/merb.rb +11 -0
  13. data/lib/webrat/adapters/rack.rb +25 -0
  14. data/lib/webrat/adapters/rails.rb +73 -0
  15. data/lib/webrat/adapters/sinatra.rb +9 -0
  16. data/lib/webrat/core.rb +13 -0
  17. data/lib/webrat/core/configuration.rb +106 -0
  18. data/lib/webrat/core/elements/area.rb +31 -0
  19. data/lib/webrat/core/elements/element.rb +33 -0
  20. data/lib/webrat/core/elements/field.rb +487 -0
  21. data/lib/webrat/core/elements/form.rb +103 -0
  22. data/lib/webrat/core/elements/label.rb +31 -0
  23. data/lib/webrat/core/elements/link.rb +93 -0
  24. data/lib/webrat/core/elements/select_option.rb +48 -0
  25. data/lib/webrat/core/locators.rb +20 -0
  26. data/lib/webrat/core/locators/area_locator.rb +38 -0
  27. data/lib/webrat/core/locators/button_locator.rb +54 -0
  28. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  29. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  30. data/lib/webrat/core/locators/field_locator.rb +25 -0
  31. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  32. data/lib/webrat/core/locators/form_locator.rb +19 -0
  33. data/lib/webrat/core/locators/label_locator.rb +34 -0
  34. data/lib/webrat/core/locators/link_locator.rb +74 -0
  35. data/lib/webrat/core/locators/locator.rb +20 -0
  36. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  37. data/lib/webrat/core/logging.rb +23 -0
  38. data/lib/webrat/core/matchers.rb +4 -0
  39. data/lib/webrat/core/matchers/have_content.rb +68 -0
  40. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +122 -0
  43. data/lib/webrat/core/methods.rb +64 -0
  44. data/lib/webrat/core/mime.rb +18 -0
  45. data/lib/webrat/core/save_and_open_page.rb +28 -0
  46. data/lib/webrat/core/scope.rb +365 -0
  47. data/lib/webrat/core/session.rb +302 -0
  48. data/lib/webrat/core/xml.rb +76 -0
  49. data/lib/webrat/core_extensions/blank.rb +58 -0
  50. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  51. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  52. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  53. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  54. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  55. data/lib/webrat/integrations/merb.rb +10 -0
  56. data/lib/webrat/integrations/rails.rb +25 -0
  57. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  58. data/lib/webrat/integrations/selenium.rb +11 -0
  59. data/lib/webrat/merb.rb +9 -0
  60. data/lib/webrat/rspec-rails.rb +2 -0
  61. data/lib/webrat/selenium.rb +70 -0
  62. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  63. data/lib/webrat/selenium/application_servers.rb +5 -0
  64. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  65. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  66. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  67. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  68. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  75. data/lib/webrat/selenium/matchers.rb +4 -0
  76. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  77. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  78. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  79. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  80. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  81. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  82. data/lib/webrat/selenium/selenium_session.rb +267 -0
  83. data/lib/webrat/selenium/silence_stream.rb +18 -0
  84. data/revo-webrat.gemspec +351 -0
  85. data/spec/fakes/test_adapter.rb +33 -0
  86. data/spec/integration/mechanize/Rakefile +7 -0
  87. data/spec/integration/mechanize/config.ru +2 -0
  88. data/spec/integration/mechanize/sample_app.rb +20 -0
  89. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  90. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  91. data/spec/integration/merb/.gitignore +21 -0
  92. data/spec/integration/merb/Rakefile +35 -0
  93. data/spec/integration/merb/app/controllers/application.rb +2 -0
  94. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  95. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  96. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  97. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  98. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  99. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  100. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  101. data/spec/integration/merb/config/environments/development.rb +15 -0
  102. data/spec/integration/merb/config/environments/rake.rb +11 -0
  103. data/spec/integration/merb/config/environments/test.rb +14 -0
  104. data/spec/integration/merb/config/init.rb +25 -0
  105. data/spec/integration/merb/config/rack.rb +11 -0
  106. data/spec/integration/merb/config/router.rb +34 -0
  107. data/spec/integration/merb/spec/spec.opts +1 -0
  108. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  109. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  110. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  111. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  112. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  113. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  114. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  115. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  116. data/spec/integration/rack/Rakefile +5 -0
  117. data/spec/integration/rack/app.rb +89 -0
  118. data/spec/integration/rack/test/helper.rb +21 -0
  119. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  120. data/spec/integration/rails/.gitignore +3 -0
  121. data/spec/integration/rails/Rakefile +30 -0
  122. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  123. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  124. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  125. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  126. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  127. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  128. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  129. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  130. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  131. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  132. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  133. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  134. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  135. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  136. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  137. data/spec/integration/rails/config/boot.rb +109 -0
  138. data/spec/integration/rails/config/environment.rb +12 -0
  139. data/spec/integration/rails/config/environments/development.rb +17 -0
  140. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  141. data/spec/integration/rails/config/environments/test.rb +22 -0
  142. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  143. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  144. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  145. data/spec/integration/rails/config/locales/en.yml +5 -0
  146. data/spec/integration/rails/config/routes.rb +19 -0
  147. data/spec/integration/rails/public/404.html +30 -0
  148. data/spec/integration/rails/public/422.html +30 -0
  149. data/spec/integration/rails/public/500.html +33 -0
  150. data/spec/integration/rails/script/about +4 -0
  151. data/spec/integration/rails/script/console +3 -0
  152. data/spec/integration/rails/script/dbconsole +3 -0
  153. data/spec/integration/rails/script/destroy +3 -0
  154. data/spec/integration/rails/script/generate +3 -0
  155. data/spec/integration/rails/script/performance/benchmarker +3 -0
  156. data/spec/integration/rails/script/performance/profiler +3 -0
  157. data/spec/integration/rails/script/performance/request +3 -0
  158. data/spec/integration/rails/script/plugin +3 -0
  159. data/spec/integration/rails/script/process/inspector +3 -0
  160. data/spec/integration/rails/script/process/reaper +3 -0
  161. data/spec/integration/rails/script/process/spawner +3 -0
  162. data/spec/integration/rails/script/runner +3 -0
  163. data/spec/integration/rails/script/server +3 -0
  164. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  165. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  166. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  167. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  168. data/spec/integration/rails/test/test_helper.rb +27 -0
  169. data/spec/integration/sinatra/Rakefile +5 -0
  170. data/spec/integration/sinatra/classic_app.rb +64 -0
  171. data/spec/integration/sinatra/modular_app.rb +16 -0
  172. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  173. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  174. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  175. data/spec/private/core/configuration_spec.rb +87 -0
  176. data/spec/private/core/field_spec.rb +83 -0
  177. data/spec/private/core/link_spec.rb +24 -0
  178. data/spec/private/core/session_spec.rb +195 -0
  179. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
  180. data/spec/private/nokogiri_spec.rb +77 -0
  181. data/spec/private/rails/attaches_file_spec.rb +81 -0
  182. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  183. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  184. data/spec/public/basic_auth_spec.rb +35 -0
  185. data/spec/public/check_spec.rb +191 -0
  186. data/spec/public/choose_spec.rb +118 -0
  187. data/spec/public/click_area_spec.rb +106 -0
  188. data/spec/public/click_button_spec.rb +494 -0
  189. data/spec/public/click_link_spec.rb +532 -0
  190. data/spec/public/fill_in_spec.rb +224 -0
  191. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  192. data/spec/public/locators/field_labeled_spec.rb +172 -0
  193. data/spec/public/locators/field_with_id_spec.rb +16 -0
  194. data/spec/public/matchers/contain_spec.rb +107 -0
  195. data/spec/public/matchers/have_selector_spec.rb +146 -0
  196. data/spec/public/matchers/have_tag_spec.rb +39 -0
  197. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  198. data/spec/public/reload_spec.rb +10 -0
  199. data/spec/public/save_and_open_spec.rb +49 -0
  200. data/spec/public/select_date_spec.rb +112 -0
  201. data/spec/public/select_datetime_spec.rb +137 -0
  202. data/spec/public/select_spec.rb +455 -0
  203. data/spec/public/select_time_spec.rb +100 -0
  204. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  205. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  206. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  207. data/spec/public/set_hidden_field_spec.rb +5 -0
  208. data/spec/public/submit_form_spec.rb +5 -0
  209. data/spec/public/visit_spec.rb +58 -0
  210. data/spec/public/within_spec.rb +177 -0
  211. data/spec/rcov.opts +1 -0
  212. data/spec/spec.opts +2 -0
  213. data/spec/spec_helper.rb +54 -0
  214. data/vendor/selenium-server.jar +0 -0
  215. metadata +392 -0
@@ -0,0 +1,302 @@
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 header(key, value)
96
+ @custom_headers[key] = value
97
+ end
98
+
99
+ def http_accept(mime_type)
100
+ header('Accept', Webrat::MIME.mime_type(mime_type))
101
+ end
102
+
103
+ def basic_auth(user, pass)
104
+ encoded_login = ["#{user}:#{pass}"].pack("m*").gsub(/\n/, '')
105
+ header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
106
+ end
107
+
108
+ def headers #:nodoc:
109
+ @default_headers.dup.merge(@custom_headers.dup)
110
+ end
111
+
112
+ def request_page(url, http_method, data) #:nodoc:
113
+ h = headers
114
+ h['HTTP_REFERER'] = @current_url if @current_url
115
+
116
+ debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}"
117
+
118
+ process_request(http_method, url, data, h)
119
+
120
+ save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
121
+ raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
122
+
123
+ reset
124
+
125
+ @current_url = url
126
+ @http_method = http_method
127
+ @data = data
128
+
129
+ if internal_redirect?
130
+ check_for_infinite_redirects
131
+ request_page(response_location, :get, {})
132
+ end
133
+
134
+ return response
135
+ end
136
+
137
+ def check_for_infinite_redirects
138
+ if current_url == response_location
139
+ @_identical_redirect_count ||= 0
140
+ @_identical_redirect_count += 1
141
+ end
142
+
143
+ if infinite_redirect_limit_exceeded?
144
+ raise InfiniteRedirectError.new("#{Webrat.configuration.infinite_redirect_limit} redirects to the same URL (#{current_url.inspect})")
145
+ end
146
+ end
147
+
148
+ def infinite_redirect_limit_exceeded?
149
+ Webrat.configuration.infinite_redirect_limit &&
150
+ (@_identical_redirect_count || 0) > Webrat.configuration.infinite_redirect_limit
151
+ end
152
+
153
+ def success_code? #:nodoc:
154
+ (200..499).include?(response_code)
155
+ end
156
+
157
+ def redirect? #:nodoc:
158
+ (response_code / 100).to_i == 3
159
+ end
160
+
161
+ def internal_redirect?
162
+ return false unless redirect?
163
+ #should keep internal_redirects if the subdomain changes
164
+ current_host_domain = current_host.split('.')[-2..-1].join('.') rescue current_host
165
+ response_location_host_domain = response_location_host.split('.')[-2..-1].join('.') rescue response_location_host
166
+ current_host_domain == response_location_host_domain
167
+ end
168
+
169
+ #easy helper to pull out where we were redirected to
170
+ def redirected_to
171
+ redirect? ? response_location : nil
172
+ end
173
+
174
+ def exception_caught? #:nodoc:
175
+ response_body =~ /Exception caught/
176
+ end
177
+
178
+ def current_scope #:nodoc:
179
+ scopes.last || page_scope
180
+ end
181
+
182
+ # Reloads the last page requested. Note that this will resubmit forms
183
+ # and their data.
184
+ def reload
185
+ request_page(@current_url, @http_method, @data)
186
+ end
187
+
188
+ webrat_deprecate :reloads, :reload
189
+
190
+
191
+ # Works like click_link, but only looks for the link text within a given selector
192
+ #
193
+ # Example:
194
+ # click_link_within "#user_12", "Vote"
195
+ def click_link_within(selector, link_text)
196
+ within(selector) do
197
+ click_link(link_text)
198
+ end
199
+ end
200
+
201
+ webrat_deprecate :clicks_link_within, :click_link_within
202
+
203
+ def within(selector)
204
+ scopes.push(Scope.from_scope(self, current_scope, selector))
205
+ ret = yield(current_scope)
206
+ scopes.pop
207
+ return ret
208
+ end
209
+
210
+ # Issues a GET request for a page, follows any redirects, and verifies the final page
211
+ # load was successful.
212
+ #
213
+ # Example:
214
+ # visit "/"
215
+ def visit(url = nil, http_method = :get, data = {})
216
+ request_page(url, http_method, data)
217
+ end
218
+
219
+ webrat_deprecate :visits, :visit
220
+
221
+ # Subclasses can override this to show error messages without html
222
+ def formatted_error #:nodoc:
223
+ response_body
224
+ end
225
+
226
+ def scopes #:nodoc:
227
+ @_scopes ||= []
228
+ end
229
+
230
+ def page_scope #:nodoc:
231
+ @_page_scope ||= Scope.from_page(self, response, response_body)
232
+ end
233
+
234
+ def dom
235
+ page_scope.dom
236
+ end
237
+
238
+ def xml_content_type?
239
+ false
240
+ end
241
+
242
+ def simulate
243
+ return if Webrat.configuration.mode == :selenium
244
+ yield
245
+ end
246
+
247
+ def automate
248
+ return unless Webrat.configuration.mode == :selenium
249
+ yield
250
+ end
251
+
252
+ def_delegators :current_scope, :fill_in, :fills_in
253
+ def_delegators :current_scope, :set_hidden_field
254
+ def_delegators :current_scope, :submit_form
255
+ def_delegators :current_scope, :check, :checks
256
+ def_delegators :current_scope, :uncheck, :unchecks
257
+ def_delegators :current_scope, :choose, :chooses
258
+ def_delegators :current_scope, :select, :selects
259
+ def_delegators :current_scope, :unselect, :unselects
260
+ def_delegators :current_scope, :select_datetime, :selects_datetime
261
+ def_delegators :current_scope, :select_date, :selects_date
262
+ def_delegators :current_scope, :select_time, :selects_time
263
+ def_delegators :current_scope, :attach_file, :attaches_file
264
+ def_delegators :current_scope, :click_area, :clicks_area
265
+ def_delegators :current_scope, :click_link, :clicks_link
266
+ def_delegators :current_scope, :click_button, :clicks_button
267
+ def_delegators :current_scope, :field_labeled
268
+ def_delegators :current_scope, :field_by_xpath
269
+ def_delegators :current_scope, :field_with_id
270
+ def_delegators :current_scope, :select_option
271
+ def_delegators :current_scope, :field_named
272
+
273
+ private
274
+
275
+ def process_request(http_method, url, data, headers)
276
+ if headers.empty?
277
+ send "#{http_method}", url, data || {}
278
+ else
279
+ send "#{http_method}", url, data || {}, headers
280
+ end
281
+ end
282
+
283
+ def response_location
284
+ response.headers["Location"]
285
+ end
286
+
287
+ def current_host
288
+ URI.parse(current_url).host || @custom_headers["Host"] || "www.example.com"
289
+ end
290
+
291
+ def response_location_host
292
+ URI.parse(response_location).host || "www.example.com"
293
+ end
294
+
295
+ def reset
296
+ @elements = {}
297
+ @_scopes = nil
298
+ @_page_scope = nil
299
+ end
300
+
301
+ end
302
+ end
@@ -0,0 +1,76 @@
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, nil, detect_encoding(stringlike.body.to_s))
15
+ else
16
+ Nokogiri::HTML(stringlike.to_s, nil, detect_encoding(stringlike.to_s))
17
+ end
18
+ end
19
+
20
+ def self.detect_encoding(string)
21
+ string.isutf8 ? "UTF-8" : nil if string.respond_to?(:isutf8)
22
+ end
23
+
24
+ def self.html_document(stringlike) #:nodoc:
25
+ return stringlike.dom if stringlike.respond_to?(:dom)
26
+
27
+ if Nokogiri::HTML::Document === stringlike
28
+ stringlike
29
+ elsif Nokogiri::XML::NodeSet === stringlike
30
+ stringlike
31
+ elsif stringlike.respond_to?(:body)
32
+ Nokogiri::HTML(stringlike.body.to_s, nil, detect_encoding(stringlike.body.to_s))
33
+ else
34
+ Nokogiri::HTML(stringlike.to_s, nil, detect_encoding(stringlike.to_s))
35
+ end
36
+ end
37
+
38
+ def self.xml_document(stringlike) #:nodoc:
39
+ return stringlike.dom if stringlike.respond_to?(:dom)
40
+
41
+ if Nokogiri::HTML::Document === stringlike
42
+ stringlike
43
+ elsif Nokogiri::XML::NodeSet === stringlike
44
+ stringlike
45
+ elsif stringlike.respond_to?(:body)
46
+ Nokogiri::XML(stringlike.body.to_s, nil, detect_encoding(stringlike.body.to_s))
47
+ else
48
+ Nokogiri::XML(stringlike.to_s, nil, detect_encoding(stringlike.body.to_s))
49
+ end
50
+ end
51
+
52
+ def self.define_dom_method(object, dom) #:nodoc:
53
+ object.meta_class.send(:define_method, :dom) do
54
+ dom
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+
61
+ module Nokogiri #:nodoc:
62
+ module CSS #:nodoc:
63
+ class XPathVisitor #:nodoc:
64
+
65
+ def visit_pseudo_class_text(node) #:nodoc:
66
+ "@type='text'"
67
+ end
68
+
69
+ def visit_pseudo_class_password(node) #:nodoc:
70
+ "@type='password'"
71
+ end
72
+
73
+ end
74
+ end
75
+ end
76
+
@@ -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