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.
- data/.document +3 -3
- data/.gitignore +14 -14
- data/History.txt +413 -413
- data/MIT-LICENSE.txt +19 -19
- data/README.rdoc +84 -84
- data/Rakefile +187 -187
- data/VERSION +1 -1
- data/install.rb +1 -1
- data/lib/webrat/adapters/mechanize.rb +78 -78
- data/lib/webrat/adapters/merb.rb +11 -11
- data/lib/webrat/adapters/rack.rb +25 -25
- data/lib/webrat/adapters/rails.rb +81 -81
- data/lib/webrat/adapters/sinatra.rb +9 -9
- data/lib/webrat/core/configuration.rb +92 -92
- data/lib/webrat/core/elements/area.rb +31 -31
- data/lib/webrat/core/elements/element.rb +33 -33
- data/lib/webrat/core/elements/field.rb +487 -487
- data/lib/webrat/core/elements/form.rb +103 -103
- data/lib/webrat/core/elements/label.rb +31 -31
- data/lib/webrat/core/elements/link.rb +93 -93
- data/lib/webrat/core/elements/select_option.rb +48 -48
- data/lib/webrat/core/locators/area_locator.rb +38 -38
- data/lib/webrat/core/locators/button_locator.rb +54 -54
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -37
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -56
- data/lib/webrat/core/locators/field_locator.rb +25 -25
- data/lib/webrat/core/locators/field_named_locator.rb +41 -41
- data/lib/webrat/core/locators/form_locator.rb +19 -19
- data/lib/webrat/core/locators/label_locator.rb +34 -34
- data/lib/webrat/core/locators/link_locator.rb +74 -74
- data/lib/webrat/core/locators/locator.rb +20 -20
- data/lib/webrat/core/locators/select_option_locator.rb +59 -59
- data/lib/webrat/core/locators.rb +20 -20
- data/lib/webrat/core/logging.rb +23 -23
- data/lib/webrat/core/matchers/have_content.rb +68 -68
- data/lib/webrat/core/matchers/have_selector.rb +74 -74
- data/lib/webrat/core/matchers/have_tag.rb +21 -21
- data/lib/webrat/core/matchers/have_xpath.rb +122 -122
- data/lib/webrat/core/matchers.rb +4 -4
- data/lib/webrat/core/methods.rb +64 -64
- data/lib/webrat/core/mime.rb +18 -18
- data/lib/webrat/core/save_and_open_page.rb +48 -48
- data/lib/webrat/core/scope.rb +365 -365
- data/lib/webrat/core/session.rb +306 -306
- data/lib/webrat/core/xml.rb +72 -72
- data/lib/webrat/core.rb +13 -13
- data/lib/webrat/core_extensions/blank.rb +58 -58
- data/lib/webrat/core_extensions/deprecate.rb +8 -8
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -12
- data/lib/webrat/core_extensions/meta_class.rb +6 -6
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -5
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -27
- data/lib/webrat/integrations/merb.rb +10 -10
- data/lib/webrat/integrations/rails.rb +25 -25
- data/lib/webrat/integrations/rspec-rails.rb +10 -10
- data/lib/webrat/integrations/selenium.rb +11 -11
- data/lib/webrat/merb.rb +9 -9
- data/lib/webrat/rspec-rails.rb +2 -2
- data/lib/webrat/selenium/application_server_factory.rb +40 -40
- data/lib/webrat/selenium/application_servers/external.rb +26 -26
- data/lib/webrat/selenium/application_servers/merb.rb +50 -50
- data/lib/webrat/selenium/application_servers/rails.rb +3 -6
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -37
- data/lib/webrat/selenium/application_servers.rb +5 -5
- data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -19
- data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -42
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -6
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -32
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -15
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -5
- data/lib/webrat/selenium/matchers/have_content.rb +66 -66
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -49
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -72
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -45
- data/lib/webrat/selenium/matchers.rb +4 -4
- data/lib/webrat/selenium/selenium_extensions.js +5 -5
- data/lib/webrat/selenium/selenium_rc_server.rb +86 -86
- data/lib/webrat/selenium/selenium_session.rb +267 -272
- data/lib/webrat/selenium/silence_stream.rb +18 -18
- data/lib/webrat/selenium.rb +70 -70
- data/lib/webrat.rb +18 -18
- data/spec/fakes/test_adapter.rb +37 -37
- data/spec/integration/mechanize/Rakefile +6 -6
- data/spec/integration/mechanize/config.ru +1 -1
- data/spec/integration/mechanize/sample_app.rb +20 -20
- data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -22
- data/spec/integration/mechanize/spec/spec_helper.rb +27 -27
- data/spec/integration/merb/.gitignore +20 -20
- data/spec/integration/merb/Rakefile +35 -35
- data/spec/integration/merb/app/controllers/application.rb +2 -2
- data/spec/integration/merb/app/controllers/exceptions.rb +13 -13
- data/spec/integration/merb/app/controllers/testing.rb +27 -27
- data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -63
- data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -47
- data/spec/integration/merb/app/views/layout/application.html.erb +11 -11
- data/spec/integration/merb/app/views/testing/show_form.html.erb +26 -26
- data/spec/integration/merb/app/views/testing/upload.html.erb +8 -8
- data/spec/integration/merb/config/environments/development.rb +15 -15
- data/spec/integration/merb/config/environments/rake.rb +11 -11
- data/spec/integration/merb/config/environments/test.rb +14 -14
- data/spec/integration/merb/config/init.rb +25 -25
- data/spec/integration/merb/config/rack.rb +11 -11
- data/spec/integration/merb/config/router.rb +34 -34
- data/spec/integration/merb/spec/spec.opts +1 -1
- data/spec/integration/merb/spec/spec_helper.rb +26 -26
- data/spec/integration/merb/spec/webrat_spec.rb +39 -39
- data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -31
- data/spec/integration/merb/tasks/merb.thor/common.rb +64 -64
- data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -124
- data/spec/integration/merb/tasks/merb.thor/main.thor +149 -149
- data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -93
- data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -40
- data/spec/integration/rack/Rakefile +5 -5
- data/spec/integration/rack/app.rb +89 -89
- data/spec/integration/rack/test/helper.rb +21 -21
- data/spec/integration/rack/test/webrat_rack_test.rb +73 -73
- data/spec/integration/rails/.gitignore +3 -3
- data/spec/integration/rails/Rakefile +30 -30
- data/spec/integration/rails/app/controllers/application.rb +15 -15
- data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -7
- data/spec/integration/rails/app/controllers/fields_controller.rb +4 -4
- data/spec/integration/rails/app/controllers/links_controller.rb +7 -7
- data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -46
- data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -2
- data/spec/integration/rails/app/helpers/fields_helper.rb +2 -2
- data/spec/integration/rails/app/helpers/links_helper.rb +2 -2
- data/spec/integration/rails/app/views/buttons/show.html.erb +10 -10
- data/spec/integration/rails/app/views/fields/show.html.erb +8 -8
- data/spec/integration/rails/app/views/links/show.html.erb +5 -5
- data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +3 -3
- data/spec/integration/rails/app/views/webrat/buttons.html.erb +10 -10
- data/spec/integration/rails/app/views/webrat/form.html.erb +27 -27
- data/spec/integration/rails/app/views/webrat/within.html.erb +2 -2
- data/spec/integration/rails/config/boot.rb +109 -109
- data/spec/integration/rails/config/environment.rb +12 -12
- data/spec/integration/rails/config/environments/development.rb +17 -17
- data/spec/integration/rails/config/environments/selenium.rb +22 -22
- data/spec/integration/rails/config/environments/test.rb +22 -22
- data/spec/integration/rails/config/initializers/inflections.rb +10 -10
- data/spec/integration/rails/config/initializers/mime_types.rb +5 -5
- data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -17
- data/spec/integration/rails/config/locales/en.yml +4 -4
- data/spec/integration/rails/config/routes.rb +19 -19
- data/spec/integration/rails/public/404.html +29 -29
- data/spec/integration/rails/public/422.html +29 -29
- data/spec/integration/rails/public/500.html +33 -33
- data/spec/integration/rails/script/about +3 -3
- data/spec/integration/rails/script/console +3 -3
- data/spec/integration/rails/script/dbconsole +3 -3
- data/spec/integration/rails/script/destroy +3 -3
- data/spec/integration/rails/script/generate +3 -3
- data/spec/integration/rails/script/performance/benchmarker +3 -3
- data/spec/integration/rails/script/performance/profiler +3 -3
- data/spec/integration/rails/script/performance/request +3 -3
- data/spec/integration/rails/script/plugin +3 -3
- data/spec/integration/rails/script/process/inspector +3 -3
- data/spec/integration/rails/script/process/reaper +3 -3
- data/spec/integration/rails/script/process/spawner +3 -3
- data/spec/integration/rails/script/runner +3 -3
- data/spec/integration/rails/script/server +3 -3
- data/spec/integration/rails/test/integration/button_click_test.rb +80 -80
- data/spec/integration/rails/test/integration/fill_in_test.rb +24 -24
- data/spec/integration/rails/test/integration/link_click_test.rb +27 -27
- data/spec/integration/rails/test/integration/webrat_test.rb +122 -122
- data/spec/integration/rails/test/test_helper.rb +26 -26
- data/spec/integration/sinatra/Rakefile +5 -5
- data/spec/integration/sinatra/classic_app.rb +64 -64
- data/spec/integration/sinatra/modular_app.rb +16 -16
- data/spec/integration/sinatra/test/classic_app_test.rb +37 -37
- data/spec/integration/sinatra/test/modular_app_test.rb +18 -18
- data/spec/integration/sinatra/test/test_helper.rb +17 -17
- data/spec/private/core/configuration_spec.rb +87 -87
- data/spec/private/core/field_spec.rb +85 -85
- data/spec/private/core/link_spec.rb +24 -24
- data/spec/private/core/session_spec.rb +200 -200
- data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -73
- data/spec/private/nokogiri_spec.rb +77 -77
- data/spec/private/rails/attaches_file_spec.rb +81 -81
- data/spec/private/rails/rails_adapter_spec.rb +86 -86
- data/spec/private/selenium/application_servers/rails_spec.rb +26 -26
- data/spec/public/basic_auth_spec.rb +24 -24
- data/spec/public/check_spec.rb +191 -191
- data/spec/public/choose_spec.rb +118 -118
- data/spec/public/click_area_spec.rb +106 -106
- data/spec/public/click_button_spec.rb +494 -494
- data/spec/public/click_link_spec.rb +511 -511
- data/spec/public/fill_in_spec.rb +224 -224
- data/spec/public/locators/field_by_xpath_spec.rb +19 -19
- data/spec/public/locators/field_labeled_spec.rb +172 -172
- data/spec/public/locators/field_with_id_spec.rb +16 -16
- data/spec/public/matchers/contain_spec.rb +114 -114
- data/spec/public/matchers/have_selector_spec.rb +146 -146
- data/spec/public/matchers/have_tag_spec.rb +39 -39
- data/spec/public/matchers/have_xpath_spec.rb +136 -136
- data/spec/public/reload_spec.rb +10 -10
- data/spec/public/save_and_open_spec.rb +70 -70
- data/spec/public/select_date_spec.rb +112 -112
- data/spec/public/select_datetime_spec.rb +137 -137
- data/spec/public/select_spec.rb +455 -455
- data/spec/public/select_time_spec.rb +100 -100
- data/spec/public/selenium/application_server_factory_spec.rb +49 -49
- data/spec/public/selenium/application_servers/external_spec.rb +12 -12
- data/spec/public/selenium/selenium_session_spec.rb +37 -37
- data/spec/public/set_hidden_field_spec.rb +5 -5
- data/spec/public/submit_form_spec.rb +5 -5
- data/spec/public/visit_spec.rb +58 -58
- data/spec/public/within_spec.rb +177 -177
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +54 -54
- data/webrat.gemspec +360 -0
- metadata +6 -5
data/lib/webrat/core/session.rb
CHANGED
@@ -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
|