aslakhellesoy-webrat 0.3.2.2 → 0.4.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +158 -19
- data/Rakefile +36 -11
- data/lib/webrat.rb +8 -11
- data/lib/webrat/core/configuration.rb +67 -25
- data/lib/webrat/core/elements/area.rb +7 -7
- data/lib/webrat/core/elements/element.rb +11 -11
- data/lib/webrat/core/elements/field.rb +70 -51
- data/lib/webrat/core/elements/form.rb +17 -17
- data/lib/webrat/core/elements/label.rb +8 -8
- data/lib/webrat/core/elements/link.rb +13 -11
- data/lib/webrat/core/elements/select_option.rb +9 -9
- data/lib/webrat/core/locators.rb +2 -2
- data/lib/webrat/core/locators/area_locator.rb +10 -10
- data/lib/webrat/core/locators/button_locator.rb +13 -13
- data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
- data/lib/webrat/core/locators/field_labeled_locator.rb +19 -13
- data/lib/webrat/core/locators/field_locator.rb +7 -7
- data/lib/webrat/core/locators/field_named_locator.rb +10 -10
- data/lib/webrat/core/locators/form_locator.rb +6 -6
- data/lib/webrat/core/locators/label_locator.rb +9 -9
- data/lib/webrat/core/locators/link_locator.rb +12 -12
- data/lib/webrat/core/locators/locator.rb +5 -5
- data/lib/webrat/core/locators/select_option_locator.rb +11 -11
- data/lib/webrat/core/logging.rb +7 -4
- data/lib/webrat/core/matchers/have_content.rb +19 -15
- data/lib/webrat/core/matchers/have_selector.rb +44 -22
- data/lib/webrat/core/matchers/have_tag.rb +11 -61
- data/lib/webrat/core/matchers/have_xpath.rb +89 -35
- data/lib/webrat/core/methods.rb +13 -11
- data/lib/webrat/core/mime.rb +3 -3
- data/lib/webrat/core/save_and_open_page.rb +9 -9
- data/lib/webrat/core/scope.rb +82 -62
- data/lib/webrat/core/session.rb +61 -18
- data/lib/webrat/core/xml.rb +16 -16
- data/lib/webrat/core/xml/hpricot.rb +3 -3
- data/lib/webrat/core/xml/nokogiri.rb +14 -14
- data/lib/webrat/core/xml/rexml.rb +3 -3
- data/lib/webrat/core_extensions/blank.rb +1 -1
- data/lib/webrat/core_extensions/deprecate.rb +1 -1
- data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
- data/lib/webrat/core_extensions/meta_class.rb +1 -1
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/lib/webrat/mechanize.rb +9 -9
- data/lib/webrat/merb.rb +5 -61
- data/lib/webrat/merb_session.rb +67 -0
- data/lib/webrat/rack.rb +45 -14
- data/lib/webrat/rails.rb +31 -11
- data/lib/webrat/rspec-rails.rb +2 -2
- data/lib/webrat/selenium.rb +27 -39
- 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 +44 -0
- data/lib/webrat/selenium/application_servers/external.rb +24 -0
- data/lib/webrat/selenium/application_servers/merb.rb +48 -0
- data/lib/webrat/selenium/application_servers/rails.rb +42 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +35 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
- data/lib/webrat/selenium/location_strategy_javascript/label.js +1 -2
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
- data/lib/webrat/selenium/matchers.rb +4 -108
- 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_rc_server.rb +84 -0
- data/lib/webrat/selenium/selenium_session.rb +86 -68
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- metadata +21 -16
- data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +0 -131
- data/lib/webrat/sinatra.rb +0 -29
data/lib/webrat/core/session.rb
CHANGED
@@ -9,6 +9,9 @@ module Webrat
|
|
9
9
|
class PageLoadError < WebratError
|
10
10
|
end
|
11
11
|
|
12
|
+
class InfiniteRedirectError < WebratError
|
13
|
+
end
|
14
|
+
|
12
15
|
def self.session_class
|
13
16
|
case Webrat.configuration.mode
|
14
17
|
when :rails
|
@@ -17,18 +20,19 @@ module Webrat
|
|
17
20
|
MerbSession
|
18
21
|
when :selenium
|
19
22
|
SeleniumSession
|
20
|
-
when :rack
|
21
|
-
RackSession
|
22
|
-
when :sinatra
|
23
|
-
SinatraSession
|
24
23
|
when :mechanize
|
25
24
|
MechanizeSession
|
25
|
+
when :rack, :sinatra
|
26
|
+
RackSession
|
26
27
|
else
|
27
28
|
raise WebratError.new(<<-STR)
|
28
29
|
Unknown Webrat mode: #{Webrat.configuration.mode.inspect}
|
29
30
|
|
30
31
|
Please ensure you have a Webrat configuration block that specifies a mode
|
31
32
|
in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
|
33
|
+
|
34
|
+
This configure block supercedes the need to require "webrat/<framework>".
|
35
|
+
|
32
36
|
For example:
|
33
37
|
|
34
38
|
Webrat.configure do |config|
|
@@ -45,12 +49,16 @@ For example:
|
|
45
49
|
attr_reader :current_url
|
46
50
|
attr_reader :elements
|
47
51
|
|
48
|
-
|
52
|
+
def_delegators :@adapter, :response, :request,
|
53
|
+
:response_code, :response_body, :response_body=, :response_code=,
|
54
|
+
:get, :post, :put, :delete
|
55
|
+
|
56
|
+
def initialize(adapter=nil)
|
49
57
|
@http_method = :get
|
50
58
|
@data = {}
|
51
59
|
@default_headers = {}
|
52
60
|
@custom_headers = {}
|
53
|
-
@
|
61
|
+
@adapter = adapter
|
54
62
|
|
55
63
|
reset
|
56
64
|
end
|
@@ -61,6 +69,7 @@ For example:
|
|
61
69
|
|
62
70
|
# For backwards compatibility -- removing in 1.0
|
63
71
|
def current_page #:nodoc:
|
72
|
+
warn "current_page is deprecated and will be going away in the next release. Use current_url instead."
|
64
73
|
page = OpenStruct.new
|
65
74
|
page.url = @current_url
|
66
75
|
page.http_method = @http_method
|
@@ -71,7 +80,7 @@ For example:
|
|
71
80
|
def doc_root #:nodoc:
|
72
81
|
nil
|
73
82
|
end
|
74
|
-
|
83
|
+
|
75
84
|
def header(key, value)
|
76
85
|
@custom_headers[key] = value
|
77
86
|
end
|
@@ -94,11 +103,8 @@ For example:
|
|
94
103
|
h['HTTP_REFERER'] = @current_url if @current_url
|
95
104
|
|
96
105
|
debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}"
|
97
|
-
|
98
|
-
|
99
|
-
else
|
100
|
-
send "#{http_method}", url, data || {}, h
|
101
|
-
end
|
106
|
+
|
107
|
+
process_request(http_method, url, data, h)
|
102
108
|
|
103
109
|
save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
|
104
110
|
raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
|
@@ -109,11 +115,30 @@ For example:
|
|
109
115
|
@http_method = http_method
|
110
116
|
@data = data
|
111
117
|
|
112
|
-
|
118
|
+
if internal_redirect?
|
119
|
+
check_for_infinite_redirects
|
120
|
+
request_page(response_location, :get, {})
|
121
|
+
end
|
113
122
|
|
114
123
|
return response
|
115
124
|
end
|
116
125
|
|
126
|
+
def check_for_infinite_redirects
|
127
|
+
if current_url == response_location
|
128
|
+
@_identical_redirect_count ||= 0
|
129
|
+
@_identical_redirect_count += 1
|
130
|
+
end
|
131
|
+
|
132
|
+
if infinite_redirect_limit_exceeded?
|
133
|
+
raise InfiniteRedirectError.new("#{Webrat.configuration.infinite_redirect_limit} redirects to the same URL (#{current_url.inspect})")
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def infinite_redirect_limit_exceeded?
|
138
|
+
Webrat.configuration.infinite_redirect_limit &&
|
139
|
+
(@_identical_redirect_count || 0) > Webrat.configuration.infinite_redirect_limit
|
140
|
+
end
|
141
|
+
|
117
142
|
def success_code? #:nodoc:
|
118
143
|
(200..499).include?(response_code)
|
119
144
|
end
|
@@ -122,8 +147,17 @@ For example:
|
|
122
147
|
response_code / 100 == 3
|
123
148
|
end
|
124
149
|
|
125
|
-
def internal_redirect?
|
126
|
-
|
150
|
+
def internal_redirect?
|
151
|
+
return false unless redirect?
|
152
|
+
#should keep internal_redirects if the subdomain changes
|
153
|
+
current_host_domain = current_host.split('.')[-2..-1].join('.') rescue current_host
|
154
|
+
response_location_host_domain = response_location_host.split('.')[-2..-1].join('.') rescue response_location_host
|
155
|
+
current_host_domain == response_location_host_domain
|
156
|
+
end
|
157
|
+
|
158
|
+
#easy helper to pull out where we were redirected to
|
159
|
+
def redirected_to
|
160
|
+
redirect? ? response_location : nil
|
127
161
|
end
|
128
162
|
|
129
163
|
def exception_caught? #:nodoc:
|
@@ -136,11 +170,11 @@ For example:
|
|
136
170
|
|
137
171
|
# Reloads the last page requested. Note that this will resubmit forms
|
138
172
|
# and their data.
|
139
|
-
def
|
173
|
+
def reload
|
140
174
|
request_page(@current_url, @http_method, @data)
|
141
175
|
end
|
142
176
|
|
143
|
-
webrat_deprecate :
|
177
|
+
webrat_deprecate :reloads, :reload
|
144
178
|
|
145
179
|
|
146
180
|
# Works like click_link, but only looks for the link text within a given selector
|
@@ -222,9 +256,18 @@ For example:
|
|
222
256
|
def_delegators :current_scope, :field_by_xpath
|
223
257
|
def_delegators :current_scope, :field_with_id
|
224
258
|
def_delegators :current_scope, :select_option
|
259
|
+
def_delegators :current_scope, :field_named
|
225
260
|
|
226
261
|
private
|
227
262
|
|
263
|
+
def process_request(http_method, url, data, headers)
|
264
|
+
if headers.empty?
|
265
|
+
send "#{http_method}", url, data || {}
|
266
|
+
else
|
267
|
+
send "#{http_method}", url, data || {}, headers
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
228
271
|
def response_location
|
229
272
|
response.headers["Location"]
|
230
273
|
end
|
@@ -242,6 +285,6 @@ For example:
|
|
242
285
|
@_scopes = nil
|
243
286
|
@_page_scope = nil
|
244
287
|
end
|
245
|
-
|
288
|
+
|
246
289
|
end
|
247
290
|
end
|
data/lib/webrat/core/xml.rb
CHANGED
@@ -4,7 +4,7 @@ require "webrat/core/xml/rexml"
|
|
4
4
|
|
5
5
|
module Webrat #:nodoc:
|
6
6
|
module XML #:nodoc:
|
7
|
-
|
7
|
+
|
8
8
|
def self.document(stringlike) #:nodoc:
|
9
9
|
if Webrat.configuration.parse_with_nokogiri?
|
10
10
|
Webrat.nokogiri_document(stringlike)
|
@@ -12,7 +12,7 @@ module Webrat #:nodoc:
|
|
12
12
|
Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def self.html_document(stringlike) #:nodoc:
|
17
17
|
if Webrat.configuration.parse_with_nokogiri?
|
18
18
|
Webrat.html_nokogiri_document(stringlike)
|
@@ -20,7 +20,7 @@ module Webrat #:nodoc:
|
|
20
20
|
Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def self.xml_document(stringlike) #:nodoc:
|
25
25
|
if Webrat.configuration.parse_with_nokogiri?
|
26
26
|
Webrat.xml_nokogiri_document(stringlike)
|
@@ -36,7 +36,7 @@ module Webrat #:nodoc:
|
|
36
36
|
element.to_s
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def self.inner_html(element)
|
41
41
|
if Webrat.configuration.parse_with_nokogiri?
|
42
42
|
element.inner_html
|
@@ -44,7 +44,7 @@ module Webrat #:nodoc:
|
|
44
44
|
element.text
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def self.all_inner_text(element)
|
49
49
|
if Webrat.configuration.parse_with_nokogiri?
|
50
50
|
element.inner_text
|
@@ -52,7 +52,7 @@ module Webrat #:nodoc:
|
|
52
52
|
Hpricot(element.to_s).children.first.inner_text
|
53
53
|
end
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def self.inner_text(element)
|
57
57
|
if Webrat.configuration.parse_with_nokogiri?
|
58
58
|
element.inner_text
|
@@ -64,7 +64,7 @@ module Webrat #:nodoc:
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def self.xpath_to(element)
|
69
69
|
if Webrat.configuration.parse_with_nokogiri?
|
70
70
|
element.path
|
@@ -72,25 +72,25 @@ module Webrat #:nodoc:
|
|
72
72
|
element.xpath
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
def self.attribute(element, attribute_name)
|
77
77
|
return element[attribute_name] if element.is_a?(Hash)
|
78
|
-
|
78
|
+
|
79
79
|
if Webrat.configuration.parse_with_nokogiri?
|
80
80
|
element[attribute_name]
|
81
81
|
else
|
82
82
|
element.attributes[attribute_name]
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
def self.xpath_at(*args)
|
87
87
|
xpath_search(*args).first
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
def self.css_at(*args)
|
91
91
|
css_search(*args).first
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
def self.xpath_search(element, *searches)
|
95
95
|
searches.flatten.map do |search|
|
96
96
|
if Webrat.configuration.parse_with_nokogiri?
|
@@ -100,16 +100,16 @@ module Webrat #:nodoc:
|
|
100
100
|
end
|
101
101
|
end.flatten.compact
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
def self.css_search(element, *searches) #:nodoc:
|
105
105
|
xpath_search(element, css_to_xpath(*searches))
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
def self.css_to_xpath(*selectors)
|
109
109
|
selectors.map do |rule|
|
110
110
|
Nokogiri::CSS.xpath_for(rule, :prefix => ".//")
|
111
111
|
end.flatten.uniq
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
end
|
115
|
-
end
|
115
|
+
end
|
@@ -1,26 +1,26 @@
|
|
1
1
|
require "webrat/core_extensions/meta_class"
|
2
2
|
|
3
3
|
module Webrat
|
4
|
-
|
4
|
+
|
5
5
|
def self.nokogiri_document(stringlike) #:nodoc:
|
6
6
|
return stringlike.dom if stringlike.respond_to?(:dom)
|
7
|
-
|
7
|
+
|
8
8
|
if Nokogiri::HTML::Document === stringlike
|
9
9
|
stringlike
|
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
|
+
|
21
21
|
def self.html_nokogiri_document(stringlike) #:nodoc:
|
22
22
|
return stringlike.dom if stringlike.respond_to?(:dom)
|
23
|
-
|
23
|
+
|
24
24
|
if Nokogiri::HTML::Document === stringlike
|
25
25
|
stringlike
|
26
26
|
elsif Nokogiri::XML::NodeSet === stringlike
|
@@ -33,10 +33,10 @@ module Webrat
|
|
33
33
|
Nokogiri::HTML(stringlike.to_s)
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def self.xml_nokogiri_document(stringlike) #:nodoc:
|
38
38
|
return stringlike.dom if stringlike.respond_to?(:dom)
|
39
|
-
|
39
|
+
|
40
40
|
if Nokogiri::HTML::Document === stringlike
|
41
41
|
stringlike
|
42
42
|
elsif Nokogiri::XML::NodeSet === stringlike
|
@@ -49,20 +49,20 @@ module Webrat
|
|
49
49
|
Nokogiri::XML(stringlike.to_s)
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
def self.define_dom_method(object, dom) #:nodoc:
|
54
54
|
object.meta_class.send(:define_method, :dom) do
|
55
55
|
dom
|
56
56
|
end
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
end
|
60
60
|
|
61
61
|
|
62
62
|
module Nokogiri #:nodoc:
|
63
63
|
module CSS #:nodoc:
|
64
64
|
class XPathVisitor #:nodoc:
|
65
|
-
|
65
|
+
|
66
66
|
def visit_pseudo_class_text(node) #:nodoc:
|
67
67
|
"@type='text'"
|
68
68
|
end
|
@@ -70,7 +70,7 @@ module Nokogiri #:nodoc:
|
|
70
70
|
def visit_pseudo_class_password(node) #:nodoc:
|
71
71
|
"@type='password'"
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
end
|
75
75
|
end
|
76
|
-
end
|
76
|
+
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
|