dbrady-webrat 0.4.4
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 +325 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +156 -0
- data/install.rb +1 -0
- data/lib/webrat.rb +34 -0
- data/lib/webrat/core.rb +14 -0
- data/lib/webrat/core/configuration.rb +98 -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 +403 -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 +92 -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 +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 +21 -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 +61 -0
- data/lib/webrat/core/mime.rb +29 -0
- data/lib/webrat/core/save_and_open_page.rb +50 -0
- data/lib/webrat/core/scope.rb +350 -0
- data/lib/webrat/core/session.rb +281 -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/mechanize.rb +74 -0
- data/lib/webrat/merb.rb +9 -0
- data/lib/webrat/merb_session.rb +65 -0
- data/lib/webrat/rack.rb +24 -0
- data/lib/webrat/rails.rb +105 -0
- data/lib/webrat/rspec-rails.rb +13 -0
- data/lib/webrat/selenium.rb +80 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -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 +9 -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_session.rb +241 -0
- data/lib/webrat/sinatra.rb +53 -0
- data/vendor/selenium-server.jar +0 -0
- metadata +141 -0
@@ -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
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class Object #:nodoc:
|
2
|
+
# An object is blank if it's false, empty, or a whitespace string.
|
3
|
+
# For example, "", " ", +nil+, [], and {} are blank.
|
4
|
+
#
|
5
|
+
# This simplifies
|
6
|
+
#
|
7
|
+
# if !address.nil? && !address.empty?
|
8
|
+
#
|
9
|
+
# to
|
10
|
+
#
|
11
|
+
# if !address.blank?
|
12
|
+
def blank?
|
13
|
+
respond_to?(:empty?) ? empty? : !self
|
14
|
+
end
|
15
|
+
|
16
|
+
# An object is present if it's not blank.
|
17
|
+
def present?
|
18
|
+
!blank?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class NilClass #:nodoc:
|
23
|
+
def blank?
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class FalseClass #:nodoc:
|
29
|
+
def blank?
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class TrueClass #:nodoc:
|
35
|
+
def blank?
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Array #:nodoc:
|
41
|
+
alias_method :blank?, :empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
class Hash #:nodoc:
|
45
|
+
alias_method :blank?, :empty?
|
46
|
+
end
|
47
|
+
|
48
|
+
class String #:nodoc:
|
49
|
+
def blank?
|
50
|
+
self !~ /\S/
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Numeric #:nodoc:
|
55
|
+
def blank?
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "mechanize"
|
2
|
+
|
3
|
+
module Webrat #:nodoc:
|
4
|
+
class MechanizeSession < Session #:nodoc:
|
5
|
+
|
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)
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(url, data, headers_argument_not_used = nil)
|
14
|
+
@response = mechanize.get(url, data)
|
15
|
+
end
|
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)
|
28
|
+
end
|
29
|
+
|
30
|
+
def response_body
|
31
|
+
@response.content
|
32
|
+
end
|
33
|
+
|
34
|
+
def response_code
|
35
|
+
@response.code.to_i
|
36
|
+
end
|
37
|
+
|
38
|
+
def mechanize
|
39
|
+
@mechanize ||= WWW::Mechanize.new
|
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
|
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
|
73
|
+
end
|
74
|
+
end
|
data/lib/webrat/merb.rb
ADDED
@@ -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
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'webrat'
|
2
|
+
|
3
|
+
class CGIMethods #:nodoc:
|
4
|
+
def self.parse_query_parameters(params)
|
5
|
+
hash = {}
|
6
|
+
params.split('&').each do |p|
|
7
|
+
pair = p.split('=')
|
8
|
+
hash[pair[0]] = pair[1]
|
9
|
+
end
|
10
|
+
hash
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module Webrat
|
15
|
+
class RackSession < Session #:nodoc:
|
16
|
+
def response_body
|
17
|
+
@response.body
|
18
|
+
end
|
19
|
+
|
20
|
+
def response_code
|
21
|
+
@response.status
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/webrat/rails.rb
ADDED
@@ -0,0 +1,105 @@
|
|
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 RailsSession < Session #:nodoc:
|
9
|
+
include ActionController::RecordIdentifier
|
10
|
+
|
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
|
24
|
+
end
|
25
|
+
|
26
|
+
def doc_root
|
27
|
+
File.expand_path(File.join(RAILS_ROOT, 'public'))
|
28
|
+
end
|
29
|
+
|
30
|
+
def saved_page_dir
|
31
|
+
File.expand_path(File.join(RAILS_ROOT, "tmp"))
|
32
|
+
end
|
33
|
+
|
34
|
+
def get(url, data, headers = nil)
|
35
|
+
do_request(:get, url, data, headers)
|
36
|
+
end
|
37
|
+
|
38
|
+
def post(url, data, headers = nil)
|
39
|
+
do_request(:post, url, data, headers)
|
40
|
+
end
|
41
|
+
|
42
|
+
def put(url, data, headers = nil)
|
43
|
+
do_request(:put, url, data, headers)
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete(url, data, headers = nil)
|
47
|
+
do_request(:delete, url, data, headers)
|
48
|
+
end
|
49
|
+
|
50
|
+
def response_body
|
51
|
+
response.body
|
52
|
+
end
|
53
|
+
|
54
|
+
def response_code
|
55
|
+
response.code.to_i
|
56
|
+
end
|
57
|
+
|
58
|
+
def xml_content_type?
|
59
|
+
response.headers["Content-Type"].to_s =~ /xml/
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
def integration_session
|
65
|
+
@context
|
66
|
+
end
|
67
|
+
|
68
|
+
def do_request(http_method, url, data, headers) #:nodoc:
|
69
|
+
update_protocol(url)
|
70
|
+
integration_session.send(http_method, normalize_url(url), data, headers)
|
71
|
+
end
|
72
|
+
|
73
|
+
# remove protocol, host and anchor
|
74
|
+
def normalize_url(href) #:nodoc:
|
75
|
+
uri = URI.parse(href)
|
76
|
+
normalized_url = []
|
77
|
+
normalized_url << "#{uri.scheme}://" if uri.scheme
|
78
|
+
normalized_url << uri.host if uri.host
|
79
|
+
normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
|
80
|
+
normalized_url << uri.path if uri.path
|
81
|
+
normalized_url << "?#{uri.query}" if uri.query
|
82
|
+
normalized_url.join
|
83
|
+
end
|
84
|
+
|
85
|
+
def update_protocol(href) #:nodoc:
|
86
|
+
if href =~ /^https:/
|
87
|
+
integration_session.https!(true)
|
88
|
+
elsif href =~ /^http:/
|
89
|
+
integration_session.https!(false)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def response #:nodoc:
|
94
|
+
integration_session.response
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
module ActionController #:nodoc:
|
101
|
+
IntegrationTest.class_eval do
|
102
|
+
include Webrat::Methods
|
103
|
+
include Webrat::Matchers
|
104
|
+
end
|
105
|
+
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
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "webrat"
|
2
|
+
gem "selenium-client", ">=1.2.14"
|
3
|
+
require "selenium/client"
|
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
|