brynary-webrat 0.3.2.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +58 -15
- data/README.rdoc +6 -2
- data/Rakefile +43 -8
- data/lib/webrat.rb +1 -1
- data/lib/webrat/core/configuration.rb +56 -13
- data/lib/webrat/core/elements/field.rb +9 -1
- data/lib/webrat/core/locators/field_labeled_locator.rb +8 -2
- data/lib/webrat/core/matchers/have_content.rb +14 -0
- data/lib/webrat/core/matchers/have_selector.rb +15 -0
- data/lib/webrat/core/matchers/have_tag.rb +14 -0
- data/lib/webrat/core/matchers/have_xpath.rb +10 -0
- data/lib/webrat/core/methods.rb +1 -0
- data/lib/webrat/core/scope.rb +30 -10
- data/lib/webrat/core/session.rb +64 -32
- data/lib/webrat/core/xml/nokogiri.rb +3 -3
- data/lib/webrat/mechanize.rb +33 -2
- data/lib/webrat/merb.rb +6 -74
- data/lib/webrat/merb_session.rb +65 -0
- data/lib/webrat/rack.rb +0 -2
- data/lib/webrat/rails.rb +36 -29
- data/lib/webrat/selenium.rb +30 -43
- data/lib/webrat/selenium/matchers.rb +38 -0
- data/lib/webrat/selenium/selenium_session.rb +52 -46
- data/lib/webrat/sinatra.rb +13 -5
- metadata +4 -5
- data/lib/webrat/rails/redirect_actions.rb +0 -18
@@ -52,6 +52,20 @@ module Webrat
|
|
52
52
|
end
|
53
53
|
|
54
54
|
alias_method :match_tag, :have_tag
|
55
|
+
|
56
|
+
# Asserts that the body of the response contains
|
57
|
+
# the supplied tag with the associated selectors
|
58
|
+
def assert_have_tag(name, attributes = {})
|
59
|
+
ht = HaveTag.new([name, attributes])
|
60
|
+
assert ht.matches?(response_body), ht.failure_message
|
61
|
+
end
|
62
|
+
|
63
|
+
# Asserts that the body of the response
|
64
|
+
# does not contain the supplied string or regepx
|
65
|
+
def assert_have_no_tag(name, attributes = {})
|
66
|
+
ht = HaveTag.new([name, attributes])
|
67
|
+
assert !ht.matches?(response_body), ht.negative_failure_message
|
68
|
+
end
|
55
69
|
|
56
70
|
end
|
57
71
|
end
|
@@ -79,5 +79,15 @@ module Webrat
|
|
79
79
|
end
|
80
80
|
alias_method :match_xpath, :have_xpath
|
81
81
|
|
82
|
+
def assert_have_xpath(expected, &block)
|
83
|
+
hs = HaveXpath.new(expected, &block)
|
84
|
+
assert hs.matches?(response_body), hs.failure_message
|
85
|
+
end
|
86
|
+
|
87
|
+
def assert_have_no_xpath(expected, &block)
|
88
|
+
hs = HaveXpath.new(expected, &block)
|
89
|
+
assert !hs.matches?(response_body), hs.negative_failure_message
|
90
|
+
end
|
91
|
+
|
82
92
|
end
|
83
93
|
end
|
data/lib/webrat/core/methods.rb
CHANGED
data/lib/webrat/core/scope.rb
CHANGED
@@ -30,6 +30,10 @@ module Webrat
|
|
30
30
|
def initialize(session, &block) #:nodoc:
|
31
31
|
@session = session
|
32
32
|
instance_eval(&block) if block_given?
|
33
|
+
|
34
|
+
if @selector && scoped_dom.nil?
|
35
|
+
raise Webrat::NotFoundError.new("The scope was not found on the page: #{@selector.inspect}")
|
36
|
+
end
|
33
37
|
end
|
34
38
|
|
35
39
|
# Verifies an input field or textarea exists on the current page, and stores a value for
|
@@ -50,6 +54,11 @@ module Webrat
|
|
50
54
|
|
51
55
|
webrat_deprecate :fills_in, :fill_in
|
52
56
|
|
57
|
+
# Verifies that a hidden field exists on the current page and sets
|
58
|
+
# the value to that given by the <tt>:to</tt> option.
|
59
|
+
#
|
60
|
+
# Example:
|
61
|
+
# set_hidden_field 'user_id', :to => 1
|
53
62
|
def set_hidden_field(field_locator, options = {})
|
54
63
|
field = locate_field(field_locator, HiddenField)
|
55
64
|
field.set(options[:to])
|
@@ -207,7 +216,16 @@ module Webrat
|
|
207
216
|
end
|
208
217
|
|
209
218
|
webrat_deprecate :attaches_file, :attach_file
|
210
|
-
|
219
|
+
|
220
|
+
# Issues a request for the URL pointed to by an <tt>area</tt> tag
|
221
|
+
# on the current page, follows any redirects, and verifies the
|
222
|
+
# final page load was successful.
|
223
|
+
#
|
224
|
+
# The area used is the first area whose title or id contains the
|
225
|
+
# given +area_name+ (case is ignored).
|
226
|
+
#
|
227
|
+
# Example:
|
228
|
+
# click_area 'Australia'
|
211
229
|
def click_area(area_name)
|
212
230
|
find_area(area_name).click
|
213
231
|
end
|
@@ -258,7 +276,15 @@ module Webrat
|
|
258
276
|
end
|
259
277
|
|
260
278
|
webrat_deprecate :clicks_button, :click_button
|
261
|
-
|
279
|
+
|
280
|
+
# Submit the form with the given id.
|
281
|
+
#
|
282
|
+
# Note that +click_button+ is usually preferrable for simulating
|
283
|
+
# form submissions, as you may specify part of the button text
|
284
|
+
# rather than the form id.
|
285
|
+
#
|
286
|
+
# Example:
|
287
|
+
# submit_form 'login'
|
262
288
|
def submit_form(id)
|
263
289
|
FormLocator.new(@session, dom, id).locate.submit
|
264
290
|
end
|
@@ -290,14 +316,8 @@ module Webrat
|
|
290
316
|
return dom
|
291
317
|
end
|
292
318
|
|
293
|
-
def scoped_dom
|
294
|
-
|
295
|
-
|
296
|
-
if @session.xml_content_type?
|
297
|
-
Webrat::XML.xml_document(source)
|
298
|
-
else
|
299
|
-
Webrat::XML.html_document(source)
|
300
|
-
end
|
319
|
+
def scoped_dom
|
320
|
+
Webrat::XML.css_at(@scope.dom, @selector)
|
301
321
|
end
|
302
322
|
|
303
323
|
def locate_field(field_locator, *field_types) #:nodoc:
|
data/lib/webrat/core/session.rb
CHANGED
@@ -8,7 +8,7 @@ module Webrat
|
|
8
8
|
# A page load or form submission returned an unsuccessful response code (500-599)
|
9
9
|
class PageLoadError < WebratError
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def self.session_class
|
13
13
|
case Webrat.configuration.mode
|
14
14
|
when :rails
|
@@ -24,32 +24,44 @@ module Webrat
|
|
24
24
|
when :mechanize
|
25
25
|
MechanizeSession
|
26
26
|
else
|
27
|
-
raise WebratError.new(
|
27
|
+
raise WebratError.new(<<-STR)
|
28
|
+
Unknown Webrat mode: #{Webrat.configuration.mode.inspect}
|
29
|
+
|
30
|
+
Please ensure you have a Webrat configuration block that specifies a mode
|
31
|
+
in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
|
32
|
+
|
33
|
+
This configure block supercedes the need to require "webrat/<framework>".
|
34
|
+
|
35
|
+
For example:
|
36
|
+
|
37
|
+
Webrat.configure do |config|
|
38
|
+
config.mode = :rails
|
39
|
+
end
|
40
|
+
STR
|
28
41
|
end
|
29
42
|
end
|
30
|
-
|
43
|
+
|
31
44
|
class Session
|
32
45
|
extend Forwardable
|
33
46
|
include Logging
|
34
47
|
include SaveAndOpenPage
|
35
|
-
|
36
48
|
attr_reader :current_url
|
37
49
|
attr_reader :elements
|
38
|
-
|
50
|
+
|
39
51
|
def initialize(context = nil) #:nodoc:
|
40
52
|
@http_method = :get
|
41
53
|
@data = {}
|
42
54
|
@default_headers = {}
|
43
55
|
@custom_headers = {}
|
44
56
|
@context = context
|
45
|
-
|
57
|
+
|
46
58
|
reset
|
47
59
|
end
|
48
|
-
|
60
|
+
|
49
61
|
def current_dom #:nodoc:
|
50
62
|
current_scope.dom
|
51
63
|
end
|
52
|
-
|
64
|
+
|
53
65
|
# For backwards compatibility -- removing in 1.0
|
54
66
|
def current_page #:nodoc:
|
55
67
|
page = OpenStruct.new
|
@@ -58,7 +70,7 @@ module Webrat
|
|
58
70
|
page.data = @data
|
59
71
|
page
|
60
72
|
end
|
61
|
-
|
73
|
+
|
62
74
|
def doc_root #:nodoc:
|
63
75
|
nil
|
64
76
|
end
|
@@ -70,7 +82,7 @@ module Webrat
|
|
70
82
|
def http_accept(mime_type)
|
71
83
|
header('Accept', Webrat::MIME.mime_type(mime_type))
|
72
84
|
end
|
73
|
-
|
85
|
+
|
74
86
|
def basic_auth(user, pass)
|
75
87
|
encoded_login = ["#{user}:#{pass}"].pack("m*")
|
76
88
|
header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
|
@@ -93,28 +105,38 @@ module Webrat
|
|
93
105
|
|
94
106
|
save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
|
95
107
|
raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
|
96
|
-
|
108
|
+
|
97
109
|
reset
|
98
|
-
|
110
|
+
|
99
111
|
@current_url = url
|
100
112
|
@http_method = http_method
|
101
113
|
@data = data
|
102
|
-
|
114
|
+
|
115
|
+
request_page(response_location, :get, data) if internal_redirect?
|
116
|
+
|
103
117
|
return response
|
104
118
|
end
|
105
|
-
|
119
|
+
|
106
120
|
def success_code? #:nodoc:
|
107
121
|
(200..499).include?(response_code)
|
108
122
|
end
|
109
|
-
|
123
|
+
|
124
|
+
def redirect? #:nodoc:
|
125
|
+
response_code / 100 == 3
|
126
|
+
end
|
127
|
+
|
128
|
+
def internal_redirect? #:nodoc:
|
129
|
+
redirect? && current_host == response_location_host
|
130
|
+
end
|
131
|
+
|
110
132
|
def exception_caught? #:nodoc:
|
111
133
|
response_body =~ /Exception caught/
|
112
134
|
end
|
113
|
-
|
135
|
+
|
114
136
|
def current_scope #:nodoc:
|
115
137
|
scopes.last || page_scope
|
116
138
|
end
|
117
|
-
|
139
|
+
|
118
140
|
# Reloads the last page requested. Note that this will resubmit forms
|
119
141
|
# and their data.
|
120
142
|
def reloads
|
@@ -122,10 +144,10 @@ module Webrat
|
|
122
144
|
end
|
123
145
|
|
124
146
|
webrat_deprecate :reload, :reloads
|
125
|
-
|
126
|
-
|
147
|
+
|
148
|
+
|
127
149
|
# Works like click_link, but only looks for the link text within a given selector
|
128
|
-
#
|
150
|
+
#
|
129
151
|
# Example:
|
130
152
|
# click_link_within "#user_12", "Vote"
|
131
153
|
def click_link_within(selector, link_text)
|
@@ -135,14 +157,14 @@ module Webrat
|
|
135
157
|
end
|
136
158
|
|
137
159
|
webrat_deprecate :clicks_link_within, :click_link_within
|
138
|
-
|
160
|
+
|
139
161
|
def within(selector)
|
140
162
|
scopes.push(Scope.from_scope(self, current_scope, selector))
|
141
163
|
ret = yield(current_scope)
|
142
164
|
scopes.pop
|
143
165
|
return ret
|
144
166
|
end
|
145
|
-
|
167
|
+
|
146
168
|
# Issues a GET request for a page, follows any redirects, and verifies the final page
|
147
169
|
# load was successful.
|
148
170
|
#
|
@@ -151,7 +173,7 @@ module Webrat
|
|
151
173
|
def visit(url = nil, http_method = :get, data = {})
|
152
174
|
request_page(url, http_method, data)
|
153
175
|
end
|
154
|
-
|
176
|
+
|
155
177
|
webrat_deprecate :visits, :visit
|
156
178
|
|
157
179
|
# Subclasses can override this to show error messages without html
|
@@ -166,25 +188,25 @@ module Webrat
|
|
166
188
|
def page_scope #:nodoc:
|
167
189
|
@_page_scope ||= Scope.from_page(self, response, response_body)
|
168
190
|
end
|
169
|
-
|
191
|
+
|
170
192
|
def dom
|
171
193
|
page_scope.dom
|
172
194
|
end
|
173
|
-
|
195
|
+
|
174
196
|
def xml_content_type?
|
175
197
|
false
|
176
198
|
end
|
177
|
-
|
199
|
+
|
178
200
|
def simulate
|
179
201
|
return if Webrat.configuration.mode == :selenium
|
180
202
|
yield
|
181
203
|
end
|
182
|
-
|
204
|
+
|
183
205
|
def automate
|
184
206
|
return unless Webrat.configuration.mode == :selenium
|
185
207
|
yield
|
186
208
|
end
|
187
|
-
|
209
|
+
|
188
210
|
def_delegators :current_scope, :fill_in, :fills_in
|
189
211
|
def_delegators :current_scope, :set_hidden_field
|
190
212
|
def_delegators :current_scope, :submit_form
|
@@ -199,15 +221,25 @@ module Webrat
|
|
199
221
|
def_delegators :current_scope, :click_area, :clicks_area
|
200
222
|
def_delegators :current_scope, :click_link, :clicks_link
|
201
223
|
def_delegators :current_scope, :click_button, :clicks_button
|
202
|
-
def_delegators :current_scope, :should_see
|
203
|
-
def_delegators :current_scope, :should_not_see
|
204
224
|
def_delegators :current_scope, :field_labeled
|
205
225
|
def_delegators :current_scope, :field_by_xpath
|
206
226
|
def_delegators :current_scope, :field_with_id
|
207
227
|
def_delegators :current_scope, :select_option
|
208
|
-
|
228
|
+
|
209
229
|
private
|
210
|
-
|
230
|
+
|
231
|
+
def response_location
|
232
|
+
response.headers["Location"]
|
233
|
+
end
|
234
|
+
|
235
|
+
def current_host
|
236
|
+
URI.parse(current_url).host || "www.example.com"
|
237
|
+
end
|
238
|
+
|
239
|
+
def response_location_host
|
240
|
+
URI.parse(response_location).host || "www.example.com"
|
241
|
+
end
|
242
|
+
|
211
243
|
def reset
|
212
244
|
@elements = {}
|
213
245
|
@_scopes = nil
|
@@ -10,11 +10,11 @@ module Webrat
|
|
10
10
|
elsif Nokogiri::XML::NodeSet === stringlike
|
11
11
|
stringlike
|
12
12
|
elsif StringIO === stringlike
|
13
|
-
Nokogiri
|
13
|
+
Nokogiri::HTML(stringlike.string)
|
14
14
|
elsif stringlike.respond_to?(:body)
|
15
|
-
Nokogiri
|
15
|
+
Nokogiri::HTML(stringlike.body.to_s)
|
16
16
|
else
|
17
|
-
Nokogiri
|
17
|
+
Nokogiri::HTML(stringlike.to_s)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/lib/webrat/mechanize.rb
CHANGED
@@ -6,6 +6,10 @@ module Webrat #:nodoc:
|
|
6
6
|
attr_accessor :response
|
7
7
|
alias :page :response
|
8
8
|
|
9
|
+
def request_page(url, http_method, data) #:nodoc:
|
10
|
+
super(absolute_url(url), http_method, data)
|
11
|
+
end
|
12
|
+
|
9
13
|
def get(url, data, headers_argument_not_used = nil)
|
10
14
|
@response = mechanize.get(url, data)
|
11
15
|
end
|
@@ -36,8 +40,35 @@ module Webrat #:nodoc:
|
|
36
40
|
end
|
37
41
|
|
38
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
|
39
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
|
40
73
|
end
|
41
74
|
end
|
42
|
-
|
43
|
-
Webrat.configuration.mode = :mechanize
|
data/lib/webrat/merb.rb
CHANGED
@@ -1,77 +1,9 @@
|
|
1
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 #:nodoc:
|
56
|
-
module Test #:nodoc:
|
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
|
75
|
-
|
76
|
-
Webrat.configuration.mode = :merb
|
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
|
77
6
|
|
7
|
+
Webrat.configure do |config|
|
8
|
+
config.mode = :merb
|
9
|
+
end
|