dstrelau-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 +381 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +181 -0
- data/VERSION +1 -0
- data/install.rb +1 -0
- data/lib/webrat.rb +10 -0
- data/lib/webrat/core.rb +14 -0
- data/lib/webrat/core/configuration.rb +102 -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 +411 -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 +35 -0
- data/lib/webrat/core/locators.rb +20 -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/logging.rb +24 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/matchers/have_content.rb +73 -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 +147 -0
- data/lib/webrat/core/methods.rb +63 -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 +350 -0
- data/lib/webrat/core/session.rb +308 -0
- data/lib/webrat/core/xml.rb +115 -0
- data/lib/webrat/core/xml/hpricot.rb +19 -0
- data/lib/webrat/core/xml/nokogiri.rb +76 -0
- data/lib/webrat/core/xml/rexml.rb +24 -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/culerity.rb +69 -0
- data/lib/webrat/culerity/core_ext/button.rb +6 -0
- data/lib/webrat/culerity/core_ext/container.rb +13 -0
- data/lib/webrat/culerity/core_ext/frame.rb +14 -0
- data/lib/webrat/culerity/core_ext/generic_field.rb +21 -0
- data/lib/webrat/culerity/core_ext/socket.rb +21 -0
- data/lib/webrat/culerity/locator.rb +22 -0
- data/lib/webrat/culerity/scope.rb +97 -0
- data/lib/webrat/culerity/session.rb +155 -0
- data/lib/webrat/mechanize.rb +78 -0
- data/lib/webrat/merb.rb +9 -0
- data/lib/webrat/merb_adapter.rb +82 -0
- data/lib/webrat/merb_multipart_support.rb +27 -0
- data/lib/webrat/rack.rb +25 -0
- data/lib/webrat/rails.rb +106 -0
- data/lib/webrat/rspec-rails.rb +10 -0
- data/lib/webrat/selenium.rb +80 -0
- data/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/lib/webrat/selenium/application_servers.rb +5 -0
- data/lib/webrat/selenium/application_servers/base.rb +46 -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 +44 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -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.rb +4 -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/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
- data/lib/webrat/selenium/selenium_session.rb +248 -0
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- data/lib/webrat/sinatra.rb +11 -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 +43 -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/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 +18 -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 +97 -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 +116 -0
- data/spec/private/core/field_spec.rb +85 -0
- data/spec/private/core/link_spec.rb +24 -0
- data/spec/private/core/logging_spec.rb +10 -0
- data/spec/private/core/session_spec.rb +200 -0
- data/spec/private/mechanize/mechanize_adapter_spec.rb +75 -0
- data/spec/private/merb/attaches_file_spec.rb +93 -0
- data/spec/private/merb/merb_adapter_spec.rb +61 -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 +112 -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 +496 -0
- data/spec/public/click_link_spec.rb +511 -0
- data/spec/public/fill_in_spec.rb +209 -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 +142 -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 +249 -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 +52 -0
- data/vendor/selenium-server.jar +0 -0
- data/webrat.gemspec +365 -0
- metadata +387 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require "mechanize"
|
|
2
|
+
|
|
3
|
+
module Webrat #:nodoc:
|
|
4
|
+
class MechanizeAdapter #:nodoc:
|
|
5
|
+
extend Forwardable
|
|
6
|
+
|
|
7
|
+
attr_accessor :response
|
|
8
|
+
alias :page :response
|
|
9
|
+
|
|
10
|
+
def initialize(*args)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def request_page(url, http_method, data) #:nodoc:
|
|
14
|
+
super(absolute_url(url), http_method, data)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get(url, data, headers_argument_not_used = nil)
|
|
18
|
+
@response = mechanize.get(url, data)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def post(url, data, headers_argument_not_used = nil)
|
|
22
|
+
post_data = data.inject({}) do |memo, param|
|
|
23
|
+
case param.last
|
|
24
|
+
when Hash
|
|
25
|
+
param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
|
|
26
|
+
else
|
|
27
|
+
memo[param.first] = param.last
|
|
28
|
+
end
|
|
29
|
+
memo
|
|
30
|
+
end
|
|
31
|
+
@response = mechanize.post(url, post_data)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def response_body
|
|
35
|
+
@response.content
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def response_code
|
|
39
|
+
@response.code.to_i
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def mechanize
|
|
43
|
+
@mechanize ||= WWW::Mechanize.new
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def_delegators :mechanize, :basic_auth
|
|
47
|
+
|
|
48
|
+
def absolute_url(url) #:nodoc:
|
|
49
|
+
current_host, current_path = split_current_url
|
|
50
|
+
if url =~ Regexp.new('^https?://')
|
|
51
|
+
url
|
|
52
|
+
elsif url =~ Regexp.new('^/')
|
|
53
|
+
current_host + url
|
|
54
|
+
elsif url =~ Regexp.new('^\.')
|
|
55
|
+
current_host + absolute_path(current_path, url)
|
|
56
|
+
else
|
|
57
|
+
url
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
def split_current_url
|
|
63
|
+
current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
|
|
64
|
+
[Regexp.last_match(1), Regexp.last_match(2)]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def absolute_path(current_path, url)
|
|
68
|
+
levels_up = url.split('/').find_all { |x| x == '..' }.size
|
|
69
|
+
ancestor = if current_path.nil?
|
|
70
|
+
""
|
|
71
|
+
else
|
|
72
|
+
current_path.split("/")[0..(-1 - levels_up)].join("/")
|
|
73
|
+
end
|
|
74
|
+
descendent = url.split("/")[levels_up..-1].join
|
|
75
|
+
"#{ancestor}/#{descendent}"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
data/lib/webrat/merb.rb
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require "webrat"
|
|
2
|
+
require "merb-core"
|
|
3
|
+
require "webrat/merb_multipart_support"
|
|
4
|
+
|
|
5
|
+
module Webrat
|
|
6
|
+
class MerbAdapter #:nodoc:
|
|
7
|
+
include Merb::Test::MakeRequest
|
|
8
|
+
|
|
9
|
+
# Include Webrat's own version of multipart_post/put because the officially
|
|
10
|
+
# supported methods in Merb don't perform the request correctly.
|
|
11
|
+
include MerbMultipartSupport
|
|
12
|
+
|
|
13
|
+
attr_accessor :response
|
|
14
|
+
|
|
15
|
+
def initialize(context=nil); end
|
|
16
|
+
|
|
17
|
+
def get(url, data, headers = nil)
|
|
18
|
+
do_request(url, data, headers, "GET")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def post(url, data, headers = nil)
|
|
22
|
+
do_request(url, data, headers, "POST")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def put(url, data, headers = nil)
|
|
26
|
+
do_request(url, data, headers, "PUT")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def delete(url, data, headers = nil)
|
|
30
|
+
do_request(url, data, headers, "DELETE")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def response_body
|
|
34
|
+
@response.body.to_s
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def response_code
|
|
38
|
+
@response.status
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def do_request(url, data, headers, method)
|
|
42
|
+
if method == "POST" && has_file?(data)
|
|
43
|
+
@response = multipart_post(url, data, :headers => headers)
|
|
44
|
+
|
|
45
|
+
elsif method == "PUT" && has_file?(data)
|
|
46
|
+
@response = multipart_put(url, data, :headers => headers)
|
|
47
|
+
|
|
48
|
+
else
|
|
49
|
+
@response = request(url,
|
|
50
|
+
:params => (data && data.any?) ? data : nil,
|
|
51
|
+
:headers => headers,
|
|
52
|
+
:method => method)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
protected
|
|
57
|
+
|
|
58
|
+
# Recursively search the data for a file attachment.
|
|
59
|
+
def has_file?(data)
|
|
60
|
+
data.each do |key, value|
|
|
61
|
+
if value.is_a?(Hash)
|
|
62
|
+
return has_file?(value)
|
|
63
|
+
else
|
|
64
|
+
return true if value.is_a?(File)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
return false
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
module Merb #:nodoc:
|
|
74
|
+
module Test #:nodoc:
|
|
75
|
+
module RequestHelper #:nodoc:
|
|
76
|
+
def request(uri, env = {})
|
|
77
|
+
@_webrat_session ||= Webrat::MerbAdapter.new
|
|
78
|
+
@_webrat_session.response = @_webrat_session.request(uri, env)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Webrat
|
|
2
|
+
|
|
3
|
+
# These methods are copied from merb-core/two-oh.rb which defines new
|
|
4
|
+
# multipart_post and multipart_put methods for Merb::Test::MultipartRequestHelper.
|
|
5
|
+
# We can't require two-oh.rb because it alters Merb's own behavior, causing
|
|
6
|
+
# failing specs in Merb when Webrat is required.
|
|
7
|
+
module MerbMultipartSupport
|
|
8
|
+
def multipart_request(path, params = {}, env = {})
|
|
9
|
+
multipart = Merb::Test::MultipartRequestHelper::Post.new(params)
|
|
10
|
+
body, head = multipart.to_multipart
|
|
11
|
+
env["CONTENT_TYPE"] = head
|
|
12
|
+
env["CONTENT_LENGTH"] = body.size
|
|
13
|
+
env[:input] = StringIO.new(body)
|
|
14
|
+
request(path, env)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def multipart_post(path, params = {}, env = {})
|
|
18
|
+
env[:method] = "POST"
|
|
19
|
+
multipart_request(path, params, env)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def multipart_put(path, params = {}, env = {}, &block)
|
|
23
|
+
env[:method] = "PUT"
|
|
24
|
+
multipart_request(path, params, env)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/lib/webrat/rack.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require "rack/test"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
class RackAdapter
|
|
5
|
+
extend Forwardable
|
|
6
|
+
|
|
7
|
+
def_delegators :@session, :get, :post, :put, :delete
|
|
8
|
+
|
|
9
|
+
def initialize(session) #:nodoc:
|
|
10
|
+
@session = session
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def response_body
|
|
14
|
+
response.body
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def response_code
|
|
18
|
+
response.status
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def response
|
|
22
|
+
@session.last_response
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/webrat/rails.rb
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require "webrat"
|
|
2
|
+
|
|
3
|
+
require "action_controller"
|
|
4
|
+
require "action_controller/integration"
|
|
5
|
+
require "action_controller/record_identifier"
|
|
6
|
+
|
|
7
|
+
module Webrat
|
|
8
|
+
class RailsAdapter #:nodoc:
|
|
9
|
+
include ActionController::RecordIdentifier
|
|
10
|
+
|
|
11
|
+
attr_reader :integration_session
|
|
12
|
+
|
|
13
|
+
def initialize(session)
|
|
14
|
+
@integration_session = session
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# The Rails version of within supports passing in a model and Webrat
|
|
18
|
+
# will apply a scope based on Rails' dom_id for that model.
|
|
19
|
+
#
|
|
20
|
+
# Example:
|
|
21
|
+
# within User.last do
|
|
22
|
+
# click_link "Delete"
|
|
23
|
+
# end
|
|
24
|
+
def within(selector_or_object, &block)
|
|
25
|
+
if selector_or_object.is_a?(String)
|
|
26
|
+
super
|
|
27
|
+
else
|
|
28
|
+
super('#' + dom_id(selector_or_object), &block)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def doc_root
|
|
33
|
+
File.expand_path(File.join(RAILS_ROOT, 'public'))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def saved_page_dir
|
|
37
|
+
File.expand_path(File.join(RAILS_ROOT, "tmp"))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def get(url, data, headers = nil)
|
|
41
|
+
do_request(:get, url, data, headers)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def post(url, data, headers = nil)
|
|
45
|
+
do_request(:post, url, data, headers)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def put(url, data, headers = nil)
|
|
49
|
+
do_request(:put, url, data, headers)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def delete(url, data, headers = nil)
|
|
53
|
+
do_request(:delete, url, data, headers)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def response_body
|
|
57
|
+
response.body
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def response_code
|
|
61
|
+
response.code.to_i
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def xml_content_type?
|
|
65
|
+
response.headers["Content-Type"].to_s =~ /xml/
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
protected
|
|
69
|
+
|
|
70
|
+
def do_request(http_method, url, data, headers) #:nodoc:
|
|
71
|
+
update_protocol(url)
|
|
72
|
+
integration_session.send(http_method, normalize_url(url), data, headers)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# remove protocol, host and anchor
|
|
76
|
+
def normalize_url(href) #:nodoc:
|
|
77
|
+
uri = URI.parse(href)
|
|
78
|
+
normalized_url = []
|
|
79
|
+
normalized_url << "#{uri.scheme}://" if uri.scheme
|
|
80
|
+
normalized_url << uri.host if uri.host
|
|
81
|
+
normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
|
|
82
|
+
normalized_url << uri.path if uri.path
|
|
83
|
+
normalized_url << "?#{uri.query}" if uri.query
|
|
84
|
+
normalized_url.join
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def update_protocol(href) #:nodoc:
|
|
88
|
+
if href =~ /^https:/
|
|
89
|
+
integration_session.https!(true)
|
|
90
|
+
elsif href =~ /^http:/
|
|
91
|
+
integration_session.https!(false)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def response #:nodoc:
|
|
96
|
+
integration_session.response
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
module ActionController #:nodoc:
|
|
102
|
+
IntegrationTest.class_eval do
|
|
103
|
+
include Webrat::Methods
|
|
104
|
+
include Webrat::Matchers
|
|
105
|
+
end
|
|
106
|
+
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,80 @@
|
|
|
1
|
+
require "webrat"
|
|
2
|
+
require "selenium/client"
|
|
3
|
+
require "webrat/selenium/silence_stream"
|
|
4
|
+
require "webrat/selenium/selenium_session"
|
|
5
|
+
require "webrat/selenium/matchers"
|
|
6
|
+
require "webrat/core_extensions/tcp_socket"
|
|
7
|
+
|
|
8
|
+
module Webrat
|
|
9
|
+
# To use Webrat's Selenium support, you'll need the selenium-client gem installed.
|
|
10
|
+
# Activate it with (for example, in your <tt>env.rb</tt>):
|
|
11
|
+
#
|
|
12
|
+
# require "webrat"
|
|
13
|
+
#
|
|
14
|
+
# Webrat.configure do |config|
|
|
15
|
+
# config.mode = :selenium
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
# == Dropping down to the selenium-client API
|
|
19
|
+
#
|
|
20
|
+
# If you ever need to do something with Selenium not provided in the Webrat API,
|
|
21
|
+
# you can always drop down to the selenium-client API using the <tt>selenium</tt> method.
|
|
22
|
+
# For example:
|
|
23
|
+
#
|
|
24
|
+
# When "I drag the photo to the left" do
|
|
25
|
+
# selenium.dragdrop("id=photo_123", "+350, 0")
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# == Choosing the underlying framework to test
|
|
29
|
+
#
|
|
30
|
+
# Webrat assumes you're using rails by default but it can also work with sinatra
|
|
31
|
+
# and merb. To take advantage of this you can use the configuration block to
|
|
32
|
+
# set the application_framework variable.
|
|
33
|
+
# require "webrat"
|
|
34
|
+
#
|
|
35
|
+
# Webrat.configure do |config|
|
|
36
|
+
# config.mode = :selenium
|
|
37
|
+
# config.application_port = 4567
|
|
38
|
+
# config.application_framework = :sinatra # could also be :merb
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
# == Auto-starting of the appserver and java server
|
|
42
|
+
#
|
|
43
|
+
# Webrat will automatically start the Selenium Java server process and an instance
|
|
44
|
+
# of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
|
|
45
|
+
# instead of "test", so ensure you've got that defined, and will run on port
|
|
46
|
+
# Webrat.configuration.application_port.
|
|
47
|
+
#
|
|
48
|
+
# == Waiting
|
|
49
|
+
#
|
|
50
|
+
# In order to make writing Selenium tests as easy as possible, Webrat will automatically
|
|
51
|
+
# wait for the correct elements to exist on the page when trying to manipulate them
|
|
52
|
+
# with methods like <tt>fill_in</tt>, etc. In general, this means you should be able to write
|
|
53
|
+
# your Webrat::Selenium tests ignoring the concurrency issues that can plague in-browser
|
|
54
|
+
# testing, so long as you're using the Webrat API.
|
|
55
|
+
module Selenium
|
|
56
|
+
module Methods
|
|
57
|
+
def response
|
|
58
|
+
webrat_session.response
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def wait_for(*args, &block)
|
|
62
|
+
webrat_session.wait_for(*args, &block)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def save_and_open_screengrab
|
|
66
|
+
webrat_session.save_and_open_screengrab
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
if defined?(ActionController::IntegrationTest)
|
|
73
|
+
module ActionController #:nodoc:
|
|
74
|
+
IntegrationTest.class_eval do
|
|
75
|
+
include Webrat::Methods
|
|
76
|
+
include Webrat::Selenium::Methods
|
|
77
|
+
include Webrat::Selenium::Matchers
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -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
|