mkuklis-webrat 0.5.1 → 0.6.rc1

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 (211) hide show
  1. data/.document +3 -3
  2. data/.gitignore +14 -14
  3. data/History.txt +413 -413
  4. data/MIT-LICENSE.txt +19 -19
  5. data/README.rdoc +84 -84
  6. data/Rakefile +187 -187
  7. data/VERSION +1 -1
  8. data/install.rb +1 -1
  9. data/lib/webrat/adapters/mechanize.rb +78 -78
  10. data/lib/webrat/adapters/merb.rb +11 -11
  11. data/lib/webrat/adapters/rack.rb +25 -25
  12. data/lib/webrat/adapters/rails.rb +81 -81
  13. data/lib/webrat/adapters/sinatra.rb +9 -9
  14. data/lib/webrat/core/configuration.rb +92 -92
  15. data/lib/webrat/core/elements/area.rb +31 -31
  16. data/lib/webrat/core/elements/element.rb +33 -33
  17. data/lib/webrat/core/elements/field.rb +487 -487
  18. data/lib/webrat/core/elements/form.rb +103 -103
  19. data/lib/webrat/core/elements/label.rb +31 -31
  20. data/lib/webrat/core/elements/link.rb +93 -93
  21. data/lib/webrat/core/elements/select_option.rb +48 -48
  22. data/lib/webrat/core/locators/area_locator.rb +38 -38
  23. data/lib/webrat/core/locators/button_locator.rb +54 -54
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -37
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -56
  26. data/lib/webrat/core/locators/field_locator.rb +25 -25
  27. data/lib/webrat/core/locators/field_named_locator.rb +41 -41
  28. data/lib/webrat/core/locators/form_locator.rb +19 -19
  29. data/lib/webrat/core/locators/label_locator.rb +34 -34
  30. data/lib/webrat/core/locators/link_locator.rb +74 -74
  31. data/lib/webrat/core/locators/locator.rb +20 -20
  32. data/lib/webrat/core/locators/select_option_locator.rb +59 -59
  33. data/lib/webrat/core/locators.rb +20 -20
  34. data/lib/webrat/core/logging.rb +23 -23
  35. data/lib/webrat/core/matchers/have_content.rb +68 -68
  36. data/lib/webrat/core/matchers/have_selector.rb +74 -74
  37. data/lib/webrat/core/matchers/have_tag.rb +21 -21
  38. data/lib/webrat/core/matchers/have_xpath.rb +122 -122
  39. data/lib/webrat/core/matchers.rb +4 -4
  40. data/lib/webrat/core/methods.rb +64 -64
  41. data/lib/webrat/core/mime.rb +18 -18
  42. data/lib/webrat/core/save_and_open_page.rb +48 -48
  43. data/lib/webrat/core/scope.rb +365 -365
  44. data/lib/webrat/core/session.rb +306 -306
  45. data/lib/webrat/core/xml.rb +72 -72
  46. data/lib/webrat/core.rb +13 -13
  47. data/lib/webrat/core_extensions/blank.rb +58 -58
  48. data/lib/webrat/core_extensions/deprecate.rb +8 -8
  49. data/lib/webrat/core_extensions/detect_mapped.rb +12 -12
  50. data/lib/webrat/core_extensions/meta_class.rb +6 -6
  51. data/lib/webrat/core_extensions/nil_to_param.rb +5 -5
  52. data/lib/webrat/core_extensions/tcp_socket.rb +27 -27
  53. data/lib/webrat/integrations/merb.rb +10 -10
  54. data/lib/webrat/integrations/rails.rb +25 -25
  55. data/lib/webrat/integrations/rspec-rails.rb +10 -10
  56. data/lib/webrat/integrations/selenium.rb +11 -11
  57. data/lib/webrat/merb.rb +9 -9
  58. data/lib/webrat/rspec-rails.rb +2 -2
  59. data/lib/webrat/selenium/application_server_factory.rb +40 -40
  60. data/lib/webrat/selenium/application_servers/external.rb +26 -26
  61. data/lib/webrat/selenium/application_servers/merb.rb +50 -50
  62. data/lib/webrat/selenium/application_servers/rails.rb +3 -6
  63. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -37
  64. data/lib/webrat/selenium/application_servers.rb +5 -5
  65. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -19
  66. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -42
  67. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -6
  68. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -32
  69. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -15
  70. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -5
  71. data/lib/webrat/selenium/matchers/have_content.rb +66 -66
  72. data/lib/webrat/selenium/matchers/have_selector.rb +49 -49
  73. data/lib/webrat/selenium/matchers/have_tag.rb +72 -72
  74. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -45
  75. data/lib/webrat/selenium/matchers.rb +4 -4
  76. data/lib/webrat/selenium/selenium_extensions.js +5 -5
  77. data/lib/webrat/selenium/selenium_rc_server.rb +86 -86
  78. data/lib/webrat/selenium/selenium_session.rb +267 -272
  79. data/lib/webrat/selenium/silence_stream.rb +18 -18
  80. data/lib/webrat/selenium.rb +70 -70
  81. data/lib/webrat.rb +18 -18
  82. data/spec/fakes/test_adapter.rb +37 -37
  83. data/spec/integration/mechanize/Rakefile +6 -6
  84. data/spec/integration/mechanize/config.ru +1 -1
  85. data/spec/integration/mechanize/sample_app.rb +20 -20
  86. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -22
  87. data/spec/integration/mechanize/spec/spec_helper.rb +27 -27
  88. data/spec/integration/merb/.gitignore +20 -20
  89. data/spec/integration/merb/Rakefile +35 -35
  90. data/spec/integration/merb/app/controllers/application.rb +2 -2
  91. data/spec/integration/merb/app/controllers/exceptions.rb +13 -13
  92. data/spec/integration/merb/app/controllers/testing.rb +27 -27
  93. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -63
  94. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -47
  95. data/spec/integration/merb/app/views/layout/application.html.erb +11 -11
  96. data/spec/integration/merb/app/views/testing/show_form.html.erb +26 -26
  97. data/spec/integration/merb/app/views/testing/upload.html.erb +8 -8
  98. data/spec/integration/merb/config/environments/development.rb +15 -15
  99. data/spec/integration/merb/config/environments/rake.rb +11 -11
  100. data/spec/integration/merb/config/environments/test.rb +14 -14
  101. data/spec/integration/merb/config/init.rb +25 -25
  102. data/spec/integration/merb/config/rack.rb +11 -11
  103. data/spec/integration/merb/config/router.rb +34 -34
  104. data/spec/integration/merb/spec/spec.opts +1 -1
  105. data/spec/integration/merb/spec/spec_helper.rb +26 -26
  106. data/spec/integration/merb/spec/webrat_spec.rb +39 -39
  107. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -31
  108. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -64
  109. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -124
  110. data/spec/integration/merb/tasks/merb.thor/main.thor +149 -149
  111. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -93
  112. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -40
  113. data/spec/integration/rack/Rakefile +5 -5
  114. data/spec/integration/rack/app.rb +89 -89
  115. data/spec/integration/rack/test/helper.rb +21 -21
  116. data/spec/integration/rack/test/webrat_rack_test.rb +73 -73
  117. data/spec/integration/rails/.gitignore +3 -3
  118. data/spec/integration/rails/Rakefile +30 -30
  119. data/spec/integration/rails/app/controllers/application.rb +15 -15
  120. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -7
  121. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -4
  122. data/spec/integration/rails/app/controllers/links_controller.rb +7 -7
  123. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -46
  124. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -2
  125. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -2
  126. data/spec/integration/rails/app/helpers/links_helper.rb +2 -2
  127. data/spec/integration/rails/app/views/buttons/show.html.erb +10 -10
  128. data/spec/integration/rails/app/views/fields/show.html.erb +8 -8
  129. data/spec/integration/rails/app/views/links/show.html.erb +5 -5
  130. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +3 -3
  131. data/spec/integration/rails/app/views/webrat/buttons.html.erb +10 -10
  132. data/spec/integration/rails/app/views/webrat/form.html.erb +27 -27
  133. data/spec/integration/rails/app/views/webrat/within.html.erb +2 -2
  134. data/spec/integration/rails/config/boot.rb +109 -109
  135. data/spec/integration/rails/config/environment.rb +12 -12
  136. data/spec/integration/rails/config/environments/development.rb +17 -17
  137. data/spec/integration/rails/config/environments/selenium.rb +22 -22
  138. data/spec/integration/rails/config/environments/test.rb +22 -22
  139. data/spec/integration/rails/config/initializers/inflections.rb +10 -10
  140. data/spec/integration/rails/config/initializers/mime_types.rb +5 -5
  141. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -17
  142. data/spec/integration/rails/config/locales/en.yml +4 -4
  143. data/spec/integration/rails/config/routes.rb +19 -19
  144. data/spec/integration/rails/public/404.html +29 -29
  145. data/spec/integration/rails/public/422.html +29 -29
  146. data/spec/integration/rails/public/500.html +33 -33
  147. data/spec/integration/rails/script/about +3 -3
  148. data/spec/integration/rails/script/console +3 -3
  149. data/spec/integration/rails/script/dbconsole +3 -3
  150. data/spec/integration/rails/script/destroy +3 -3
  151. data/spec/integration/rails/script/generate +3 -3
  152. data/spec/integration/rails/script/performance/benchmarker +3 -3
  153. data/spec/integration/rails/script/performance/profiler +3 -3
  154. data/spec/integration/rails/script/performance/request +3 -3
  155. data/spec/integration/rails/script/plugin +3 -3
  156. data/spec/integration/rails/script/process/inspector +3 -3
  157. data/spec/integration/rails/script/process/reaper +3 -3
  158. data/spec/integration/rails/script/process/spawner +3 -3
  159. data/spec/integration/rails/script/runner +3 -3
  160. data/spec/integration/rails/script/server +3 -3
  161. data/spec/integration/rails/test/integration/button_click_test.rb +80 -80
  162. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -24
  163. data/spec/integration/rails/test/integration/link_click_test.rb +27 -27
  164. data/spec/integration/rails/test/integration/webrat_test.rb +122 -122
  165. data/spec/integration/rails/test/test_helper.rb +26 -26
  166. data/spec/integration/sinatra/Rakefile +5 -5
  167. data/spec/integration/sinatra/classic_app.rb +64 -64
  168. data/spec/integration/sinatra/modular_app.rb +16 -16
  169. data/spec/integration/sinatra/test/classic_app_test.rb +37 -37
  170. data/spec/integration/sinatra/test/modular_app_test.rb +18 -18
  171. data/spec/integration/sinatra/test/test_helper.rb +17 -17
  172. data/spec/private/core/configuration_spec.rb +87 -87
  173. data/spec/private/core/field_spec.rb +85 -85
  174. data/spec/private/core/link_spec.rb +24 -24
  175. data/spec/private/core/session_spec.rb +200 -200
  176. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -73
  177. data/spec/private/nokogiri_spec.rb +77 -77
  178. data/spec/private/rails/attaches_file_spec.rb +81 -81
  179. data/spec/private/rails/rails_adapter_spec.rb +86 -86
  180. data/spec/private/selenium/application_servers/rails_spec.rb +26 -26
  181. data/spec/public/basic_auth_spec.rb +24 -24
  182. data/spec/public/check_spec.rb +191 -191
  183. data/spec/public/choose_spec.rb +118 -118
  184. data/spec/public/click_area_spec.rb +106 -106
  185. data/spec/public/click_button_spec.rb +494 -494
  186. data/spec/public/click_link_spec.rb +511 -511
  187. data/spec/public/fill_in_spec.rb +224 -224
  188. data/spec/public/locators/field_by_xpath_spec.rb +19 -19
  189. data/spec/public/locators/field_labeled_spec.rb +172 -172
  190. data/spec/public/locators/field_with_id_spec.rb +16 -16
  191. data/spec/public/matchers/contain_spec.rb +114 -114
  192. data/spec/public/matchers/have_selector_spec.rb +146 -146
  193. data/spec/public/matchers/have_tag_spec.rb +39 -39
  194. data/spec/public/matchers/have_xpath_spec.rb +136 -136
  195. data/spec/public/reload_spec.rb +10 -10
  196. data/spec/public/save_and_open_spec.rb +70 -70
  197. data/spec/public/select_date_spec.rb +112 -112
  198. data/spec/public/select_datetime_spec.rb +137 -137
  199. data/spec/public/select_spec.rb +455 -455
  200. data/spec/public/select_time_spec.rb +100 -100
  201. data/spec/public/selenium/application_server_factory_spec.rb +49 -49
  202. data/spec/public/selenium/application_servers/external_spec.rb +12 -12
  203. data/spec/public/selenium/selenium_session_spec.rb +37 -37
  204. data/spec/public/set_hidden_field_spec.rb +5 -5
  205. data/spec/public/submit_form_spec.rb +5 -5
  206. data/spec/public/visit_spec.rb +58 -58
  207. data/spec/public/within_spec.rb +177 -177
  208. data/spec/spec.opts +1 -1
  209. data/spec/spec_helper.rb +54 -54
  210. data/webrat.gemspec +360 -0
  211. metadata +6 -5
@@ -1,306 +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
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