webrat 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +140 -30
- data/README.rdoc +85 -0
- data/Rakefile +72 -22
- data/install.rb +1 -1
- data/lib/webrat.rb +12 -17
- data/lib/webrat/core.rb +9 -7
- data/lib/webrat/core/configuration.rb +87 -0
- data/lib/webrat/core/{area.rb → elements/area.rb} +7 -20
- data/lib/webrat/core/elements/element.rb +33 -0
- data/lib/webrat/core/elements/field.rb +394 -0
- data/lib/webrat/core/elements/form.rb +103 -0
- data/lib/webrat/core/elements/label.rb +31 -0
- data/lib/webrat/core/{link.rb → elements/link.rb} +15 -26
- data/lib/webrat/core/elements/select_option.rb +35 -0
- data/lib/webrat/core/locators.rb +13 -85
- 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 +66 -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 +5 -9
- data/lib/webrat/core/matchers/have_content.rb +19 -44
- data/lib/webrat/core/matchers/have_selector.rb +15 -2
- data/lib/webrat/core/matchers/have_tag.rb +15 -2
- data/lib/webrat/core/matchers/have_xpath.rb +21 -28
- data/lib/webrat/core/methods.rb +32 -15
- data/lib/webrat/core/mime.rb +3 -3
- data/lib/webrat/core/save_and_open_page.rb +50 -0
- data/lib/webrat/core/scope.rb +183 -41
- data/lib/webrat/core/session.rb +125 -63
- 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/deprecate.rb +1 -1
- data/lib/webrat/mechanize.rb +58 -12
- data/lib/webrat/merb.rb +7 -73
- data/lib/webrat/merb_session.rb +65 -0
- data/lib/webrat/rack.rb +1 -1
- data/lib/webrat/rails.rb +56 -55
- data/lib/webrat/rspec-rails.rb +13 -0
- data/lib/webrat/selenium.rb +92 -1
- data/lib/webrat/selenium/matchers.rb +146 -0
- data/lib/webrat/selenium/selenium_session.rb +179 -80
- data/lib/webrat/sinatra.rb +14 -4
- data/vendor/selenium-server.jar +0 -0
- metadata +36 -17
- data/README.txt +0 -90
- data/TODO.txt +0 -10
- data/init.rb +0 -3
- data/lib/webrat/core/field.rb +0 -332
- data/lib/webrat/core/flunk.rb +0 -7
- data/lib/webrat/core/form.rb +0 -130
- data/lib/webrat/core/label.rb +0 -18
- data/lib/webrat/core/nokogiri.rb +0 -44
- data/lib/webrat/core/select_option.rb +0 -29
- data/lib/webrat/rails/redirect_actions.rb +0 -18
@@ -0,0 +1,24 @@
|
|
1
|
+
module Webrat
|
2
|
+
|
3
|
+
def self.rexml_document(stringlike)
|
4
|
+
stringlike = stringlike.body.to_s if stringlike.respond_to?(:body)
|
5
|
+
|
6
|
+
case stringlike
|
7
|
+
when REXML::Document
|
8
|
+
stringlike.root
|
9
|
+
when REXML::Node, Array
|
10
|
+
stringlike
|
11
|
+
else
|
12
|
+
begin
|
13
|
+
REXML::Document.new(stringlike.to_s).root
|
14
|
+
rescue REXML::ParseException => e
|
15
|
+
if e.message.include?("second root element")
|
16
|
+
REXML::Document.new("<fake-root-element>#{stringlike}</fake-root-element>").root
|
17
|
+
else
|
18
|
+
raise e
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class Module #:nodoc:
|
2
|
-
def
|
2
|
+
def webrat_deprecate(old_method_name, new_method_name)
|
3
3
|
define_method old_method_name do |*args|
|
4
4
|
warn "#{old_method_name} is deprecated. Use #{new_method_name} instead."
|
5
5
|
__send__(new_method_name, *args)
|
data/lib/webrat/mechanize.rb
CHANGED
@@ -1,28 +1,74 @@
|
|
1
1
|
require "mechanize"
|
2
2
|
|
3
|
-
module Webrat
|
3
|
+
module Webrat #:nodoc:
|
4
4
|
class MechanizeSession < Session #:nodoc:
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
attr_accessor :response
|
7
|
+
alias :page :response
|
8
|
+
|
9
|
+
def request_page(url, http_method, data) #:nodoc:
|
10
|
+
super(absolute_url(url), http_method, data)
|
9
11
|
end
|
10
12
|
|
11
|
-
def get(url, data)
|
12
|
-
@
|
13
|
+
def get(url, data, headers_argument_not_used = nil)
|
14
|
+
@response = mechanize.get(url, data)
|
13
15
|
end
|
14
16
|
|
15
|
-
def post(url, data)
|
16
|
-
|
17
|
+
def post(url, data, headers_argument_not_used = nil)
|
18
|
+
post_data = data.inject({}) do |memo, param|
|
19
|
+
case param.last
|
20
|
+
when Hash
|
21
|
+
param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
|
22
|
+
else
|
23
|
+
memo[param.first] = param.last
|
24
|
+
end
|
25
|
+
memo
|
26
|
+
end
|
27
|
+
@response = mechanize.post(url, post_data)
|
17
28
|
end
|
18
|
-
|
29
|
+
|
19
30
|
def response_body
|
20
|
-
@
|
31
|
+
@response.content
|
21
32
|
end
|
22
33
|
|
23
34
|
def response_code
|
24
|
-
@
|
35
|
+
@response.code.to_i
|
36
|
+
end
|
37
|
+
|
38
|
+
def mechanize
|
39
|
+
@mechanize = WWW::Mechanize.new
|
25
40
|
end
|
41
|
+
|
42
|
+
def_delegators :mechanize, :basic_auth
|
43
|
+
|
44
|
+
def absolute_url(url) #:nodoc:
|
45
|
+
current_host, current_path = split_current_url
|
46
|
+
if url =~ Regexp.new('^https?://')
|
47
|
+
url
|
48
|
+
elsif url =~ Regexp.new('^/')
|
49
|
+
current_host + url
|
50
|
+
elsif url =~ Regexp.new('^\.')
|
51
|
+
current_host + absolute_path(current_path, url)
|
52
|
+
else
|
53
|
+
url
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def split_current_url
|
59
|
+
current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
|
60
|
+
[Regexp.last_match(1), Regexp.last_match(2)]
|
61
|
+
end
|
26
62
|
|
63
|
+
def absolute_path(current_path, url)
|
64
|
+
levels_up = url.split('/').find_all { |x| x == '..' }.size
|
65
|
+
ancestor = if current_path.nil?
|
66
|
+
""
|
67
|
+
else
|
68
|
+
current_path.split("/")[0..(-1 - levels_up)].join("/")
|
69
|
+
end
|
70
|
+
descendent = url.split("/")[levels_up..-1]
|
71
|
+
"#{ancestor}/#{descendent}"
|
72
|
+
end
|
27
73
|
end
|
28
|
-
end
|
74
|
+
end
|
data/lib/webrat/merb.rb
CHANGED
@@ -1,75 +1,9 @@
|
|
1
|
-
require "webrat
|
1
|
+
require "webrat"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require "merb-core"
|
7
|
-
|
8
|
-
HashWithIndifferentAccess = Mash
|
9
|
-
|
10
|
-
module Webrat
|
11
|
-
class MerbSession < Session #:nodoc:
|
12
|
-
include Merb::Test::MakeRequest
|
13
|
-
|
14
|
-
attr_accessor :response
|
15
|
-
|
16
|
-
def get(url, data, headers = nil)
|
17
|
-
do_request(url, data, headers, "GET")
|
18
|
-
end
|
19
|
-
|
20
|
-
def post(url, data, headers = nil)
|
21
|
-
do_request(url, data, headers, "POST")
|
22
|
-
end
|
23
|
-
|
24
|
-
def put(url, data, headers = nil)
|
25
|
-
do_request(url, data, headers, "PUT")
|
26
|
-
end
|
27
|
-
|
28
|
-
def delete(url, data, headers = nil)
|
29
|
-
do_request(url, data, headers, "DELETE")
|
30
|
-
end
|
31
|
-
|
32
|
-
def response_body
|
33
|
-
@response.body.to_s
|
34
|
-
end
|
35
|
-
|
36
|
-
def response_code
|
37
|
-
@response.status
|
38
|
-
end
|
39
|
-
|
40
|
-
def do_request(url, data, headers, method)
|
41
|
-
@response = request(url,
|
42
|
-
:params => (data && data.any?) ? data : nil,
|
43
|
-
:headers => headers,
|
44
|
-
:method => method)
|
45
|
-
follow_redirect
|
46
|
-
end
|
47
|
-
|
48
|
-
def follow_redirect
|
49
|
-
self.get(@response.headers['Location'], nil, @response.headers) if @response.status == 302
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
module Merb
|
56
|
-
module Test
|
57
|
-
module RequestHelper #:nodoc:
|
58
|
-
def request(uri, env = {})
|
59
|
-
@_webrat_session ||= Webrat::MerbSession.new
|
60
|
-
@_webrat_session.response = @_webrat_session.request(uri, env)
|
61
|
-
end
|
62
|
-
|
63
|
-
def follow_redirect
|
64
|
-
@_webrat_session.follow_redirect
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
class Merb::Test::RspecStory #:nodoc:
|
71
|
-
def browser
|
72
|
-
@browser ||= Webrat::MerbSession.new
|
73
|
-
end
|
74
|
-
end
|
3
|
+
# This is a temporary hack to support backwards compatibility
|
4
|
+
# with Merb 1.0.8 until it's updated to use the new Webrat.configure
|
5
|
+
# syntax
|
75
6
|
|
7
|
+
Webrat.configure do |config|
|
8
|
+
config.mode = :merb
|
9
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "webrat"
|
2
|
+
|
3
|
+
require "cgi"
|
4
|
+
gem "extlib"
|
5
|
+
require "extlib"
|
6
|
+
require "merb-core"
|
7
|
+
|
8
|
+
HashWithIndifferentAccess = Mash
|
9
|
+
|
10
|
+
module Webrat
|
11
|
+
class MerbSession < Session #:nodoc:
|
12
|
+
include Merb::Test::MakeRequest
|
13
|
+
|
14
|
+
attr_accessor :response
|
15
|
+
|
16
|
+
def get(url, data, headers = nil)
|
17
|
+
do_request(url, data, headers, "GET")
|
18
|
+
end
|
19
|
+
|
20
|
+
def post(url, data, headers = nil)
|
21
|
+
do_request(url, data, headers, "POST")
|
22
|
+
end
|
23
|
+
|
24
|
+
def put(url, data, headers = nil)
|
25
|
+
do_request(url, data, headers, "PUT")
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete(url, data, headers = nil)
|
29
|
+
do_request(url, data, headers, "DELETE")
|
30
|
+
end
|
31
|
+
|
32
|
+
def response_body
|
33
|
+
@response.body.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def response_code
|
37
|
+
@response.status
|
38
|
+
end
|
39
|
+
|
40
|
+
def do_request(url, data, headers, method)
|
41
|
+
@response = request(url,
|
42
|
+
:params => (data && data.any?) ? data : nil,
|
43
|
+
:headers => headers,
|
44
|
+
:method => method)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module Merb #:nodoc:
|
51
|
+
module Test #:nodoc:
|
52
|
+
module RequestHelper #:nodoc:
|
53
|
+
def request(uri, env = {})
|
54
|
+
@_webrat_session ||= Webrat::MerbSession.new
|
55
|
+
@_webrat_session.response = @_webrat_session.request(uri, env)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Merb::Test::RspecStory #:nodoc:
|
62
|
+
def browser
|
63
|
+
@browser ||= Webrat::MerbSession.new
|
64
|
+
end
|
65
|
+
end
|
data/lib/webrat/rack.rb
CHANGED
data/lib/webrat/rails.rb
CHANGED
@@ -1,102 +1,103 @@
|
|
1
1
|
require "webrat"
|
2
2
|
|
3
|
+
require "action_controller"
|
4
|
+
require "action_controller/integration"
|
5
|
+
require "action_controller/record_identifier"
|
6
|
+
|
3
7
|
module Webrat
|
4
8
|
class RailsSession < Session #:nodoc:
|
9
|
+
include ActionController::RecordIdentifier
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
|
11
|
+
# The Rails version of within supports passing in a model and Webrat
|
12
|
+
# will apply a scope based on Rails' dom_id for that model.
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
# within User.last do
|
16
|
+
# click_link "Delete"
|
17
|
+
# end
|
18
|
+
def within(selector_or_object, &block)
|
19
|
+
if selector_or_object.is_a?(String)
|
20
|
+
super
|
21
|
+
else
|
22
|
+
super('#' + dom_id(selector_or_object), &block)
|
23
|
+
end
|
9
24
|
end
|
10
|
-
|
25
|
+
|
11
26
|
def doc_root
|
12
27
|
File.expand_path(File.join(RAILS_ROOT, 'public'))
|
13
28
|
end
|
14
|
-
|
29
|
+
|
15
30
|
def saved_page_dir
|
16
31
|
File.expand_path(File.join(RAILS_ROOT, "tmp"))
|
17
32
|
end
|
18
|
-
|
33
|
+
|
19
34
|
def get(url, data, headers = nil)
|
20
35
|
do_request(:get, url, data, headers)
|
21
36
|
end
|
22
|
-
|
37
|
+
|
23
38
|
def post(url, data, headers = nil)
|
24
39
|
do_request(:post, url, data, headers)
|
25
40
|
end
|
26
|
-
|
41
|
+
|
27
42
|
def put(url, data, headers = nil)
|
28
43
|
do_request(:put, url, data, headers)
|
29
44
|
end
|
30
|
-
|
45
|
+
|
31
46
|
def delete(url, data, headers = nil)
|
32
47
|
do_request(:delete, url, data, headers)
|
33
48
|
end
|
34
|
-
|
49
|
+
|
35
50
|
def response_body
|
36
51
|
response.body
|
37
52
|
end
|
38
|
-
|
53
|
+
|
39
54
|
def response_code
|
40
55
|
response.code.to_i
|
41
56
|
end
|
42
|
-
|
57
|
+
|
58
|
+
def xml_content_type?
|
59
|
+
response.headers["Content-Type"].to_s =~ /xml/
|
60
|
+
end
|
61
|
+
|
43
62
|
protected
|
44
|
-
|
63
|
+
|
64
|
+
def integration_session
|
65
|
+
@context
|
66
|
+
end
|
67
|
+
|
45
68
|
def do_request(http_method, url, data, headers) #:nodoc:
|
46
69
|
update_protocol(url)
|
47
|
-
|
70
|
+
integration_session.send(http_method, normalize_url(url), data, headers)
|
48
71
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
72
|
+
|
73
|
+
# remove protocol, host and anchor
|
74
|
+
def normalize_url(href) #:nodoc:
|
75
|
+
uri = URI.parse(href)
|
76
|
+
normalized_url = uri.path
|
77
|
+
if uri.query
|
78
|
+
normalized_url += "?" + uri.query
|
55
79
|
end
|
80
|
+
normalized_url
|
56
81
|
end
|
57
|
-
|
82
|
+
|
58
83
|
def update_protocol(href) #:nodoc:
|
59
84
|
if href =~ /^https:/
|
60
|
-
|
85
|
+
integration_session.https!(true)
|
61
86
|
elsif href =~ /^http:/
|
62
|
-
|
87
|
+
integration_session.https!(false)
|
63
88
|
end
|
64
89
|
end
|
65
|
-
|
90
|
+
|
66
91
|
def response #:nodoc:
|
67
|
-
|
92
|
+
integration_session.response
|
68
93
|
end
|
69
|
-
|
94
|
+
|
70
95
|
end
|
71
96
|
end
|
72
97
|
|
73
|
-
module ActionController
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
unless instance_methods.include?("put_via_redirect")
|
78
|
-
require "webrat/rails/redirect_actions"
|
79
|
-
include Webrat::RedirectActions
|
80
|
-
end
|
81
|
-
|
82
|
-
def respond_to?(name)
|
83
|
-
super || webrat_session.respond_to?(name)
|
84
|
-
end
|
85
|
-
|
86
|
-
def method_missing(name, *args, &block)
|
87
|
-
if webrat_session.respond_to?(name)
|
88
|
-
webrat_session.send(name, *args, &block)
|
89
|
-
else
|
90
|
-
super
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
protected
|
95
|
-
|
96
|
-
def webrat_session
|
97
|
-
@webrat_session ||= Webrat::RailsSession.new(self)
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
98
|
+
module ActionController #:nodoc:
|
99
|
+
IntegrationTest.class_eval do
|
100
|
+
include Webrat::Methods
|
101
|
+
include Webrat::Matchers
|
101
102
|
end
|
102
|
-
end
|
103
|
+
end
|
@@ -0,0 +1,13 @@
|
|
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
|
+
# rspec should support :type => [:controller, :helper, :view] - but until it does ...
|
10
|
+
config.include(Webrat::Matchers, :type => :controller)
|
11
|
+
config.include(Webrat::Matchers, :type => :helper)
|
12
|
+
config.include(Webrat::Matchers, :type => :view)
|
13
|
+
end
|