aslakhellesoy-webrat 0.3.2.2 → 0.4.4.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/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/mechanize.rb
CHANGED
@@ -2,14 +2,14 @@ require "mechanize"
|
|
2
2
|
|
3
3
|
module Webrat #:nodoc:
|
4
4
|
class MechanizeSession < Session #:nodoc:
|
5
|
-
|
5
|
+
|
6
6
|
attr_accessor :response
|
7
7
|
alias :page :response
|
8
|
-
|
8
|
+
|
9
9
|
def request_page(url, http_method, data) #:nodoc:
|
10
10
|
super(absolute_url(url), http_method, data)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def get(url, data, headers_argument_not_used = nil)
|
14
14
|
@response = mechanize.get(url, data)
|
15
15
|
end
|
@@ -26,7 +26,7 @@ module Webrat #:nodoc:
|
|
26
26
|
end
|
27
27
|
@response = mechanize.post(url, post_data)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def response_body
|
31
31
|
@response.content
|
32
32
|
end
|
@@ -34,13 +34,13 @@ module Webrat #:nodoc:
|
|
34
34
|
def response_code
|
35
35
|
@response.code.to_i
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def mechanize
|
39
|
-
@mechanize
|
39
|
+
@mechanize ||= WWW::Mechanize.new
|
40
40
|
end
|
41
41
|
|
42
42
|
def_delegators :mechanize, :basic_auth
|
43
|
-
|
43
|
+
|
44
44
|
def absolute_url(url) #:nodoc:
|
45
45
|
current_host, current_path = split_current_url
|
46
46
|
if url =~ Regexp.new('^https?://')
|
@@ -53,13 +53,13 @@ module Webrat #:nodoc:
|
|
53
53
|
url
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
private
|
58
58
|
def split_current_url
|
59
59
|
current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
|
60
60
|
[Regexp.last_match(1), Regexp.last_match(2)]
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def absolute_path(current_path, url)
|
64
64
|
levels_up = url.split('/').find_all { |x| x == '..' }.size
|
65
65
|
ancestor = if current_path.nil?
|
data/lib/webrat/merb.rb
CHANGED
@@ -1,65 +1,9 @@
|
|
1
1
|
require "webrat"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require "merb-core"
|
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
|
7
6
|
|
8
|
-
|
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
|
7
|
+
Webrat.configure do |config|
|
8
|
+
config.mode = :merb
|
65
9
|
end
|
@@ -0,0 +1,67 @@
|
|
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 #:nodoc:
|
12
|
+
include Merb::Test::MakeRequest
|
13
|
+
|
14
|
+
attr_accessor :response
|
15
|
+
|
16
|
+
def initialize(context=nil); end
|
17
|
+
|
18
|
+
def get(url, data, headers = nil)
|
19
|
+
do_request(url, data, headers, "GET")
|
20
|
+
end
|
21
|
+
|
22
|
+
def post(url, data, headers = nil)
|
23
|
+
do_request(url, data, headers, "POST")
|
24
|
+
end
|
25
|
+
|
26
|
+
def put(url, data, headers = nil)
|
27
|
+
do_request(url, data, headers, "PUT")
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete(url, data, headers = nil)
|
31
|
+
do_request(url, data, headers, "DELETE")
|
32
|
+
end
|
33
|
+
|
34
|
+
def response_body
|
35
|
+
@response.body.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def response_code
|
39
|
+
@response.status
|
40
|
+
end
|
41
|
+
|
42
|
+
def do_request(url, data, headers, method)
|
43
|
+
@response = request(url,
|
44
|
+
:params => (data && data.any?) ? data : nil,
|
45
|
+
:headers => headers,
|
46
|
+
:method => method)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module Merb #:nodoc:
|
53
|
+
module Test #:nodoc:
|
54
|
+
module RequestHelper #:nodoc:
|
55
|
+
def request(uri, env = {})
|
56
|
+
@_webrat_session ||= Webrat::MerbSession.new
|
57
|
+
@_webrat_session.response = @_webrat_session.request(uri, env)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class Merb::Test::RspecStory #:nodoc:
|
64
|
+
def browser
|
65
|
+
@browser ||= Webrat::MerbSession.new
|
66
|
+
end
|
67
|
+
end
|
data/lib/webrat/rack.rb
CHANGED
@@ -1,24 +1,55 @@
|
|
1
|
-
require
|
1
|
+
require "rack/test"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module Webrat
|
4
|
+
class RackSession
|
5
|
+
def initialize(context) #:nodoc:
|
6
|
+
@session = Rack::Test::Session.new(context.app, "www.example.com")
|
7
|
+
end
|
8
|
+
|
9
|
+
def get(url, data = {}, headers = {})
|
10
|
+
process_request(:get, url, data, headers)
|
11
|
+
end
|
12
|
+
|
13
|
+
def post(url, data = {}, headers = {})
|
14
|
+
process_request(:post, url, data, headers)
|
15
|
+
end
|
16
|
+
|
17
|
+
def put(url, data = {}, headers = {})
|
18
|
+
process_request(:put, url, data, headers)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete(url, data = {}, headers = {})
|
22
|
+
process_request(:delete, url, data, headers)
|
9
23
|
end
|
10
|
-
hash
|
11
|
-
end
|
12
|
-
end
|
13
24
|
|
14
|
-
module Webrat
|
15
|
-
class RackSession < Session #:nodoc:
|
16
25
|
def response_body
|
17
|
-
|
26
|
+
response.body
|
18
27
|
end
|
19
28
|
|
20
29
|
def response_code
|
21
|
-
|
30
|
+
response.status
|
31
|
+
end
|
32
|
+
|
33
|
+
def response
|
34
|
+
@session.last_response
|
35
|
+
end
|
36
|
+
|
37
|
+
def request
|
38
|
+
@session.last_request
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def process_request(http_method, url, data = {}, headers = {})
|
44
|
+
headers ||= {}
|
45
|
+
data ||= {}
|
46
|
+
|
47
|
+
params = data.inject({}) { |acc, (k,v)|
|
48
|
+
acc.update(k => Rack::Utils.unescape(v))
|
49
|
+
}
|
50
|
+
|
51
|
+
env = headers.merge(:params => params, :method => http_method.to_s.upcase)
|
52
|
+
@session.request(url, env)
|
22
53
|
end
|
23
54
|
end
|
24
55
|
end
|
data/lib/webrat/rails.rb
CHANGED
@@ -2,9 +2,32 @@ require "webrat"
|
|
2
2
|
|
3
3
|
require "action_controller"
|
4
4
|
require "action_controller/integration"
|
5
|
+
require "action_controller/record_identifier"
|
5
6
|
|
6
7
|
module Webrat
|
7
|
-
class RailsSession
|
8
|
+
class RailsSession #: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
|
8
31
|
|
9
32
|
def doc_root
|
10
33
|
File.expand_path(File.join(RAILS_ROOT, 'public'))
|
@@ -44,10 +67,6 @@ module Webrat
|
|
44
67
|
|
45
68
|
protected
|
46
69
|
|
47
|
-
def integration_session
|
48
|
-
@context
|
49
|
-
end
|
50
|
-
|
51
70
|
def do_request(http_method, url, data, headers) #:nodoc:
|
52
71
|
update_protocol(url)
|
53
72
|
integration_session.send(http_method, normalize_url(url), data, headers)
|
@@ -56,11 +75,13 @@ module Webrat
|
|
56
75
|
# remove protocol, host and anchor
|
57
76
|
def normalize_url(href) #:nodoc:
|
58
77
|
uri = URI.parse(href)
|
59
|
-
normalized_url =
|
60
|
-
if uri.
|
61
|
-
|
62
|
-
|
63
|
-
normalized_url
|
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
|
64
85
|
end
|
65
86
|
|
66
87
|
def update_protocol(href) #:nodoc:
|
@@ -74,7 +95,6 @@ module Webrat
|
|
74
95
|
def response #:nodoc:
|
75
96
|
integration_session.response
|
76
97
|
end
|
77
|
-
|
78
98
|
end
|
79
99
|
end
|
80
100
|
|
data/lib/webrat/rspec-rails.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Supports using the matchers in controller, helper, and view specs if you're
|
2
2
|
# using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# require 'webrat/rspec-rails'
|
5
5
|
#
|
6
6
|
require "webrat/core/matchers"
|
@@ -10,4 +10,4 @@ Spec::Runner.configure do |config|
|
|
10
10
|
config.include(Webrat::Matchers, :type => :controller)
|
11
11
|
config.include(Webrat::Matchers, :type => :helper)
|
12
12
|
config.include(Webrat::Matchers, :type => :view)
|
13
|
-
end
|
13
|
+
end
|
data/lib/webrat/selenium.rb
CHANGED
@@ -1,45 +1,17 @@
|
|
1
1
|
require "webrat"
|
2
|
-
gem "selenium-client", ">=1.2.
|
2
|
+
gem "selenium-client", ">=1.2.14"
|
3
3
|
require "selenium/client"
|
4
|
+
require "webrat/selenium/silence_stream"
|
4
5
|
require "webrat/selenium/selenium_session"
|
5
6
|
require "webrat/selenium/matchers"
|
7
|
+
require "webrat/core_extensions/tcp_socket"
|
6
8
|
|
7
9
|
module Webrat
|
8
|
-
|
9
|
-
def self.with_selenium_server #:nodoc:
|
10
|
-
start_selenium_server
|
11
|
-
yield
|
12
|
-
stop_selenium_server
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.start_selenium_server #:nodoc:
|
16
|
-
remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5)
|
17
|
-
remote_control.jar_file = File.expand_path(__FILE__ + "../../../../vendor/selenium-server.jar")
|
18
|
-
remote_control.start :background => true
|
19
|
-
TCPSocket.wait_for_service :host => "0.0.0.0", :port => 4444
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.stop_selenium_server #:nodoc:
|
23
|
-
remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5)
|
24
|
-
remote_control.stop
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.start_app_server #:nodoc:
|
28
|
-
pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
|
29
|
-
system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.selenium_port} --environment=#{Webrat.configuration.selenium_environment} --pid #{pid_file} &")
|
30
|
-
TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.selenium_port.to_i
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.stop_app_server #:nodoc:
|
34
|
-
pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
|
35
|
-
system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
|
36
|
-
end
|
37
|
-
|
38
10
|
# To use Webrat's Selenium support, you'll need the selenium-client gem installed.
|
39
11
|
# Activate it with (for example, in your <tt>env.rb</tt>):
|
40
12
|
#
|
41
13
|
# require "webrat"
|
42
|
-
#
|
14
|
+
#
|
43
15
|
# Webrat.configure do |config|
|
44
16
|
# config.mode = :selenium
|
45
17
|
# end
|
@@ -54,11 +26,25 @@ module Webrat
|
|
54
26
|
# selenium.dragdrop("id=photo_123", "+350, 0")
|
55
27
|
# end
|
56
28
|
#
|
57
|
-
# ==
|
29
|
+
# == Choosing the underlying framework to test
|
30
|
+
#
|
31
|
+
# Webrat assumes you're using rails by default but it can also work with sinatra
|
32
|
+
# and merb. To take advantage of this you can use the configuration block to
|
33
|
+
# set the application_framework variable.
|
34
|
+
# require "webrat"
|
35
|
+
#
|
36
|
+
# Webrat.configure do |config|
|
37
|
+
# config.mode = :selenium
|
38
|
+
# config.application_port = 4567
|
39
|
+
# config.application_framework = :sinatra # could also be :merb
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# == Auto-starting of the appserver and java server
|
58
43
|
#
|
59
44
|
# Webrat will automatically start the Selenium Java server process and an instance
|
60
45
|
# of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
|
61
|
-
# instead of "test", so ensure you've got that defined, and will run on port
|
46
|
+
# instead of "test", so ensure you've got that defined, and will run on port
|
47
|
+
# Webrat.configuration.application_port.
|
62
48
|
#
|
63
49
|
# == Waiting
|
64
50
|
#
|
@@ -84,10 +70,12 @@ module Webrat
|
|
84
70
|
end
|
85
71
|
end
|
86
72
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
73
|
+
if defined?(ActionController::IntegrationTest)
|
74
|
+
module ActionController #:nodoc:
|
75
|
+
IntegrationTest.class_eval do
|
76
|
+
include Webrat::Methods
|
77
|
+
include Webrat::Selenium::Methods
|
78
|
+
include Webrat::Selenium::Matchers
|
79
|
+
end
|
92
80
|
end
|
93
81
|
end
|