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