webrat 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +27 -0
- data/Rakefile +18 -6
- data/lib/webrat.rb +1 -1
- data/lib/webrat/core/configuration.rb +2 -0
- data/lib/webrat/core/elements/field.rb +6 -4
- data/lib/webrat/core/elements/label.rb +1 -1
- data/lib/webrat/core/session.rb +12 -3
- data/lib/webrat/rails.rb +7 -5
- data/lib/webrat/selenium.rb +6 -1
- data/lib/webrat/selenium/matchers.rb +4 -146
- 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_session.rb +2 -1
- data/lib/webrat/sinatra.rb +4 -3
- metadata +7 -2
data/History.txt
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
== 0.4.1 / 2009-01-31
|
2
|
+
|
3
|
+
* Minor enhancements
|
4
|
+
|
5
|
+
* Support Sinatra 0.9 (Harry Vangberg)
|
6
|
+
* Update query param parsing to work with latest Edge Rails
|
7
|
+
* Added #redirected_to method to easily check where an external redirect was
|
8
|
+
redirected to (Adam Greene)
|
9
|
+
* Recognize input tags with type button (Lena Herrmann)
|
10
|
+
* Add uncheck method to Selenium mode (Lee Bankewitz)
|
11
|
+
|
12
|
+
* Bug fixes
|
13
|
+
|
14
|
+
* Make requests to a Rails app using a full URL instead of a relative path. This change
|
15
|
+
is helpful for Rails apps that use subdomains. (John Hwang and Zach Dennis)
|
16
|
+
* Follow redirects that are on the same domain but a different subdomain
|
17
|
+
(Adam Greene)
|
18
|
+
* rescue from Webrat::TimeoutError in selenium matchers which allows NegativeMatchers
|
19
|
+
to behave correctly (Noah Davis)
|
20
|
+
* Switch to using selenium.click instead of .check when checking a checkbox
|
21
|
+
(Noah Davis)
|
22
|
+
* Create tmp/pids directory if directory does not exist. (Amos King and Mike Gaffney)
|
23
|
+
* Setup deprecated writers for the selenium_environment= and selenium_port= config
|
24
|
+
* Ensure the previous pages params aren't passed through redirect (Daniel Lucraft and
|
25
|
+
Bryan Helmkamp)
|
26
|
+
* Labels should only search for fields within the current scope (Kyle Hargraves)
|
27
|
+
|
1
28
|
== 0.4.0 / 2009-01-18
|
2
29
|
|
3
30
|
* _IMPORTANT_ Breaking change:
|
data/Rakefile
CHANGED
@@ -72,7 +72,7 @@ end
|
|
72
72
|
desc 'Install the package as a gem.'
|
73
73
|
task :install_gem => [:clean, :package] do
|
74
74
|
gem_filename = Dir['pkg/*.gem'].first
|
75
|
-
sh "sudo gem install --local #{gem_filename}"
|
75
|
+
sh "sudo gem install --no-rdoc --no-ri --local #{gem_filename}"
|
76
76
|
end
|
77
77
|
|
78
78
|
desc "Delete generated RDoc"
|
@@ -87,7 +87,8 @@ end
|
|
87
87
|
|
88
88
|
desc "Run specs using jruby"
|
89
89
|
task "spec:jruby" do
|
90
|
-
system "jruby -S rake spec"
|
90
|
+
result = system "jruby -S rake spec"
|
91
|
+
raise "JRuby tests failed" unless result
|
91
92
|
end
|
92
93
|
|
93
94
|
desc "Run each spec in isolation to test for dependency issues"
|
@@ -109,10 +110,21 @@ namespace :spec do
|
|
109
110
|
|
110
111
|
namespace :integration do
|
111
112
|
desc "Run the Rails integration specs"
|
112
|
-
task :rails
|
113
|
-
|
114
|
-
|
115
|
-
|
113
|
+
task :rails => ['rails:webrat'] #,'rails:selenium'] currently not running selenium as it doesn't pass.
|
114
|
+
|
115
|
+
namespace :rails do
|
116
|
+
task :selenium do
|
117
|
+
Dir.chdir "spec/integration/rails" do
|
118
|
+
result = system "rake test_unit:selenium"
|
119
|
+
raise "Rails integration tests failed" unless result
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
task :webrat do
|
124
|
+
Dir.chdir "spec/integration/rails" do
|
125
|
+
result = system "rake test_unit:rails"
|
126
|
+
raise "Rails integration tests failed" unless result
|
127
|
+
end
|
116
128
|
end
|
117
129
|
end
|
118
130
|
|
data/lib/webrat.rb
CHANGED
@@ -32,10 +32,12 @@ module Webrat
|
|
32
32
|
# Which rails environment should the selenium tests be run in? Defaults to selenium.
|
33
33
|
attr_accessor :application_environment
|
34
34
|
webrat_deprecate :selenium_environment, :application_environment
|
35
|
+
webrat_deprecate :selenium_environment=, :application_environment=
|
35
36
|
|
36
37
|
# Which port is the application running on for selenium testing? Defaults to 3001.
|
37
38
|
attr_accessor :application_port
|
38
39
|
webrat_deprecate :selenium_port, :application_port
|
40
|
+
webrat_deprecate :selenium_port=, :application_port=
|
39
41
|
|
40
42
|
# Which server the application is running on for selenium testing? Defaults to localhost
|
41
43
|
attr_accessor :application_address
|
@@ -45,6 +45,7 @@ module Webrat
|
|
45
45
|
when "file" then FileField
|
46
46
|
when "reset" then ResetField
|
47
47
|
when "submit" then ButtonField
|
48
|
+
when "button" then ButtonField
|
48
49
|
when "image" then ButtonField
|
49
50
|
else TextField
|
50
51
|
end
|
@@ -98,10 +99,11 @@ module Webrat
|
|
98
99
|
protected
|
99
100
|
|
100
101
|
def rails_request_parser
|
101
|
-
if defined?(ActionController::
|
102
|
-
ActionController::RequestParser
|
103
|
-
else
|
102
|
+
if defined?(ActionController::AbstractRequest)
|
104
103
|
ActionController::AbstractRequest
|
104
|
+
else
|
105
|
+
# For Rails > 2.2
|
106
|
+
ActionController::UrlEncodedPairParser
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
@@ -176,7 +178,7 @@ module Webrat
|
|
176
178
|
class ButtonField < Field #:nodoc:
|
177
179
|
|
178
180
|
def self.xpath_search
|
179
|
-
[".//button", ".//input[@type = 'submit']", ".//input[@type = 'image']"]
|
181
|
+
[".//button", ".//input[@type = 'submit']", ".//input[@type = 'button']", ".//input[@type = 'image']"]
|
180
182
|
end
|
181
183
|
|
182
184
|
def to_param
|
data/lib/webrat/core/session.rb
CHANGED
@@ -112,7 +112,7 @@ For example:
|
|
112
112
|
@http_method = http_method
|
113
113
|
@data = data
|
114
114
|
|
115
|
-
request_page(response_location, :get,
|
115
|
+
request_page(response_location, :get, {}) if internal_redirect?
|
116
116
|
|
117
117
|
return response
|
118
118
|
end
|
@@ -125,8 +125,17 @@ For example:
|
|
125
125
|
response_code / 100 == 3
|
126
126
|
end
|
127
127
|
|
128
|
-
def internal_redirect?
|
129
|
-
|
128
|
+
def internal_redirect?
|
129
|
+
return false unless redirect?
|
130
|
+
#should keep internal_redirects if the subdomain changes
|
131
|
+
current_host_domain = current_host.split('.')[-2..-1].join('.') rescue current_host
|
132
|
+
response_location_host_domain = response_location_host.split('.')[-2..-1].join('.') rescue response_location_host
|
133
|
+
current_host_domain == response_location_host_domain
|
134
|
+
end
|
135
|
+
|
136
|
+
#easy helper to pull out where we were redirected to
|
137
|
+
def redirected_to
|
138
|
+
redirect? ? response_location : nil
|
130
139
|
end
|
131
140
|
|
132
141
|
def exception_caught? #:nodoc:
|
data/lib/webrat/rails.rb
CHANGED
@@ -73,11 +73,13 @@ module Webrat
|
|
73
73
|
# remove protocol, host and anchor
|
74
74
|
def normalize_url(href) #:nodoc:
|
75
75
|
uri = URI.parse(href)
|
76
|
-
normalized_url =
|
77
|
-
if uri.
|
78
|
-
|
79
|
-
|
80
|
-
normalized_url
|
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
|
81
83
|
end
|
82
84
|
|
83
85
|
def update_protocol(href) #:nodoc:
|
data/lib/webrat/selenium.rb
CHANGED
@@ -26,7 +26,7 @@ module Webrat
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def self.start_app_server #:nodoc:
|
29
|
-
pid_file =
|
29
|
+
pid_file = prepare_pid_file("#{RAILS_ROOT}/tmp/pids", "mongrel_selenium.pid")
|
30
30
|
system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &")
|
31
31
|
TCPSocket.wait_for_service :host => Webrat.configuration.application_address, :port => Webrat.configuration.application_port.to_i
|
32
32
|
end
|
@@ -36,6 +36,11 @@ module Webrat
|
|
36
36
|
system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
|
37
37
|
end
|
38
38
|
|
39
|
+
def self.prepare_pid_file(file_path, pid_file_name)
|
40
|
+
FileUtils.mkdir_p File.expand_path(file_path)
|
41
|
+
File.expand_path("#{file_path}/#{pid_file_name}")
|
42
|
+
end
|
43
|
+
|
39
44
|
# To use Webrat's Selenium support, you'll need the selenium-client gem installed.
|
40
45
|
# Activate it with (for example, in your <tt>env.rb</tt>):
|
41
46
|
#
|
@@ -1,146 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
class HaveXpath
|
6
|
-
def initialize(expected)
|
7
|
-
@expected = expected
|
8
|
-
end
|
9
|
-
|
10
|
-
def matches?(response)
|
11
|
-
response.session.wait_for do
|
12
|
-
response.selenium.is_element_present("xpath=#{@expected}")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# ==== Returns
|
17
|
-
# String:: The failure message.
|
18
|
-
def failure_message
|
19
|
-
"expected following text to match xpath #{@expected}:\n#{@document}"
|
20
|
-
end
|
21
|
-
|
22
|
-
# ==== Returns
|
23
|
-
# String:: The failure message to be displayed in negative matches.
|
24
|
-
def negative_failure_message
|
25
|
-
"expected following text to not match xpath #{@expected}:\n#{@document}"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def have_xpath(xpath)
|
30
|
-
HaveXpath.new(xpath)
|
31
|
-
end
|
32
|
-
|
33
|
-
def assert_have_xpath(expected)
|
34
|
-
hs = HaveXpath.new(expected)
|
35
|
-
assert hs.matches?(response), hs.failure_message
|
36
|
-
end
|
37
|
-
|
38
|
-
def assert_have_no_xpath(expected)
|
39
|
-
hs = HaveXpath.new(expected)
|
40
|
-
assert !hs.matches?(response), hs.negative_failure_message
|
41
|
-
end
|
42
|
-
|
43
|
-
class HaveSelector
|
44
|
-
def initialize(expected)
|
45
|
-
@expected = expected
|
46
|
-
end
|
47
|
-
|
48
|
-
def matches?(response)
|
49
|
-
response.session.wait_for do
|
50
|
-
response.selenium.is_element_present("css=#{@expected}")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# ==== Returns
|
55
|
-
# String:: The failure message.
|
56
|
-
def failure_message
|
57
|
-
"expected following text to match selector #{@expected}:\n#{@document}"
|
58
|
-
end
|
59
|
-
|
60
|
-
# ==== Returns
|
61
|
-
# String:: The failure message to be displayed in negative matches.
|
62
|
-
def negative_failure_message
|
63
|
-
"expected following text to not match selector #{@expected}:\n#{@document}"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def have_selector(content)
|
68
|
-
HaveSelector.new(content)
|
69
|
-
end
|
70
|
-
|
71
|
-
# Asserts that the body of the response contains
|
72
|
-
# the supplied selector
|
73
|
-
def assert_have_selector(expected)
|
74
|
-
hs = HaveSelector.new(expected)
|
75
|
-
assert hs.matches?(response), hs.failure_message
|
76
|
-
end
|
77
|
-
|
78
|
-
# Asserts that the body of the response
|
79
|
-
# does not contain the supplied string or regepx
|
80
|
-
def assert_have_no_selector(expected)
|
81
|
-
hs = HaveSelector.new(expected)
|
82
|
-
assert !hs.matches?(response), hs.negative_failure_message
|
83
|
-
end
|
84
|
-
|
85
|
-
class HasContent #:nodoc:
|
86
|
-
def initialize(content)
|
87
|
-
@content = content
|
88
|
-
end
|
89
|
-
|
90
|
-
def matches?(response)
|
91
|
-
if @content.is_a?(Regexp)
|
92
|
-
text_finder = "regexp:#{@content.source}"
|
93
|
-
else
|
94
|
-
text_finder = @content
|
95
|
-
end
|
96
|
-
|
97
|
-
response.session.wait_for do
|
98
|
-
response.selenium.is_text_present(text_finder)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# ==== Returns
|
103
|
-
# String:: The failure message.
|
104
|
-
def failure_message
|
105
|
-
"expected the following element's content to #{content_message}:\n#{@element}"
|
106
|
-
end
|
107
|
-
|
108
|
-
# ==== Returns
|
109
|
-
# String:: The failure message to be displayed in negative matches.
|
110
|
-
def negative_failure_message
|
111
|
-
"expected the following element's content to not #{content_message}:\n#{@element}"
|
112
|
-
end
|
113
|
-
|
114
|
-
def content_message
|
115
|
-
case @content
|
116
|
-
when String
|
117
|
-
"include \"#{@content}\""
|
118
|
-
when Regexp
|
119
|
-
"match #{@content.inspect}"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
# Matches the contents of an HTML document with
|
125
|
-
# whatever string is supplied
|
126
|
-
def contain(content)
|
127
|
-
HasContent.new(content)
|
128
|
-
end
|
129
|
-
|
130
|
-
# Asserts that the body of the response contain
|
131
|
-
# the supplied string or regexp
|
132
|
-
def assert_contain(content)
|
133
|
-
hc = HasContent.new(content)
|
134
|
-
assert hc.matches?(response), hc.failure_message
|
135
|
-
end
|
136
|
-
|
137
|
-
# Asserts that the body of the response
|
138
|
-
# does not contain the supplied string or regepx
|
139
|
-
def assert_not_contain(content)
|
140
|
-
hc = HasContent.new(content)
|
141
|
-
assert !hc.matches?(response), hc.negative_failure_message
|
142
|
-
end
|
143
|
-
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
1
|
+
require "webrat/selenium/matchers/have_xpath"
|
2
|
+
require "webrat/selenium/matchers/have_selector"
|
3
|
+
# require "webrat/selenium/matchers/have_tag"
|
4
|
+
require "webrat/selenium/matchers/have_content"
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Webrat
|
2
|
+
module Selenium
|
3
|
+
module Matchers
|
4
|
+
class HasContent #:nodoc:
|
5
|
+
def initialize(content)
|
6
|
+
@content = content
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(response)
|
10
|
+
if @content.is_a?(Regexp)
|
11
|
+
text_finder = "regexp:#{@content.source}"
|
12
|
+
else
|
13
|
+
text_finder = @content
|
14
|
+
end
|
15
|
+
|
16
|
+
response.session.wait_for do
|
17
|
+
response.selenium.is_text_present(text_finder)
|
18
|
+
end
|
19
|
+
rescue Webrat::TimeoutError
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
# ==== Returns
|
24
|
+
# String:: The failure message.
|
25
|
+
def failure_message
|
26
|
+
"expected the following element's content to #{content_message}:\n#{@element}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# ==== Returns
|
30
|
+
# String:: The failure message to be displayed in negative matches.
|
31
|
+
def negative_failure_message
|
32
|
+
"expected the following element's content to not #{content_message}:\n#{@element}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def content_message
|
36
|
+
case @content
|
37
|
+
when String
|
38
|
+
"include \"#{@content}\""
|
39
|
+
when Regexp
|
40
|
+
"match #{@content.inspect}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Matches the contents of an HTML document with
|
46
|
+
# whatever string is supplied
|
47
|
+
def contain(content)
|
48
|
+
HasContent.new(content)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Asserts that the body of the response contain
|
52
|
+
# the supplied string or regexp
|
53
|
+
def assert_contain(content)
|
54
|
+
hc = HasContent.new(content)
|
55
|
+
assert hc.matches?(response), hc.failure_message
|
56
|
+
end
|
57
|
+
|
58
|
+
# Asserts that the body of the response
|
59
|
+
# does not contain the supplied string or regepx
|
60
|
+
def assert_not_contain(content)
|
61
|
+
hc = HasContent.new(content)
|
62
|
+
assert !hc.matches?(response), hc.negative_failure_message
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Webrat
|
2
|
+
module Selenium
|
3
|
+
module Matchers
|
4
|
+
class HaveSelector
|
5
|
+
def initialize(expected)
|
6
|
+
@expected = expected
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(response)
|
10
|
+
response.session.wait_for do
|
11
|
+
response.selenium.is_element_present("css=#{@expected}")
|
12
|
+
end
|
13
|
+
rescue Webrat::TimeoutError
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
# ==== Returns
|
18
|
+
# String:: The failure message.
|
19
|
+
def failure_message
|
20
|
+
"expected following text to match selector #{@expected}:\n#{@document}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# ==== Returns
|
24
|
+
# String:: The failure message to be displayed in negative matches.
|
25
|
+
def negative_failure_message
|
26
|
+
"expected following text to not match selector #{@expected}:\n#{@document}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def have_selector(content)
|
31
|
+
HaveSelector.new(content)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Asserts that the body of the response contains
|
35
|
+
# the supplied selector
|
36
|
+
def assert_have_selector(expected)
|
37
|
+
hs = HaveSelector.new(expected)
|
38
|
+
assert hs.matches?(response), hs.failure_message
|
39
|
+
end
|
40
|
+
|
41
|
+
# Asserts that the body of the response
|
42
|
+
# does not contain the supplied string or regepx
|
43
|
+
def assert_have_no_selector(expected)
|
44
|
+
hs = HaveSelector.new(expected)
|
45
|
+
assert !hs.matches?(response), hs.negative_failure_message
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Webrat
|
2
|
+
module Selenium
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
class HaveTag < HaveSelector #:nodoc:
|
6
|
+
# ==== Returns
|
7
|
+
# String:: The failure message.
|
8
|
+
def failure_message
|
9
|
+
"expected following output to contain a #{tag_inspect} tag:\n#{@document}"
|
10
|
+
end
|
11
|
+
|
12
|
+
# ==== Returns
|
13
|
+
# String:: The failure message to be displayed in negative matches.
|
14
|
+
def negative_failure_message
|
15
|
+
"expected following output to omit a #{tag_inspect}:\n#{@document}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def tag_inspect
|
19
|
+
options = @expected.last.dup
|
20
|
+
content = options.delete(:content)
|
21
|
+
|
22
|
+
html = "<#{@expected.first}"
|
23
|
+
options.each do |k,v|
|
24
|
+
html << " #{k}='#{v}'"
|
25
|
+
end
|
26
|
+
|
27
|
+
if content
|
28
|
+
html << ">#{content}</#{@expected.first}>"
|
29
|
+
else
|
30
|
+
html << "/>"
|
31
|
+
end
|
32
|
+
|
33
|
+
html
|
34
|
+
end
|
35
|
+
|
36
|
+
def query
|
37
|
+
options = @expected.last.dup
|
38
|
+
selector = @expected.first.to_s
|
39
|
+
|
40
|
+
selector << ":contains('#{options.delete(:content)}')" if options[:content]
|
41
|
+
|
42
|
+
options.each do |key, value|
|
43
|
+
selector << "[#{key}='#{value}']"
|
44
|
+
end
|
45
|
+
|
46
|
+
Nokogiri::CSS::Parser.parse(selector).map { |ast| ast.to_xpath }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def have_tag(name, attributes = {}, &block)
|
51
|
+
HaveTag.new([name, attributes], &block)
|
52
|
+
end
|
53
|
+
|
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), 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), ht.negative_failure_message
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Webrat
|
2
|
+
module Selenium
|
3
|
+
module Matchers
|
4
|
+
class HaveXpath
|
5
|
+
def initialize(expected)
|
6
|
+
@expected = expected
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(response)
|
10
|
+
response.session.wait_for do
|
11
|
+
response.selenium.is_element_present("xpath=#{@expected}")
|
12
|
+
end
|
13
|
+
rescue Webrat::TimeoutError
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
# ==== Returns
|
18
|
+
# String:: The failure message.
|
19
|
+
def failure_message
|
20
|
+
"expected following text to match xpath #{@expected}:\n#{@document}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# ==== Returns
|
24
|
+
# String:: The failure message to be displayed in negative matches.
|
25
|
+
def negative_failure_message
|
26
|
+
"expected following text to not match xpath #{@expected}:\n#{@document}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def have_xpath(xpath)
|
31
|
+
HaveXpath.new(xpath)
|
32
|
+
end
|
33
|
+
|
34
|
+
def assert_have_xpath(expected)
|
35
|
+
hs = HaveXpath.new(expected)
|
36
|
+
assert hs.matches?(response), hs.failure_message
|
37
|
+
end
|
38
|
+
|
39
|
+
def assert_have_no_xpath(expected)
|
40
|
+
hs = HaveXpath.new(expected)
|
41
|
+
assert !hs.matches?(response), hs.negative_failure_message
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -111,8 +111,9 @@ module Webrat
|
|
111
111
|
def check(label_text)
|
112
112
|
locator = "webrat=#{label_text}"
|
113
113
|
selenium.wait_for_element locator, 5
|
114
|
-
selenium.
|
114
|
+
selenium.click locator
|
115
115
|
end
|
116
|
+
alias_method :uncheck, :check
|
116
117
|
|
117
118
|
webrat_deprecate :checks, :check
|
118
119
|
|
data/lib/webrat/sinatra.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'webrat/rack'
|
2
2
|
require 'sinatra'
|
3
|
-
require 'sinatra/test
|
3
|
+
require 'sinatra/test'
|
4
4
|
|
5
5
|
class Sinatra::Application
|
6
6
|
# Override this to prevent Sinatra from barfing on the options passed from RSpec
|
@@ -13,16 +13,17 @@ disable :reload
|
|
13
13
|
|
14
14
|
module Webrat
|
15
15
|
class SinatraSession < RackSession #:nodoc:
|
16
|
-
include Sinatra::Test
|
16
|
+
include Sinatra::Test
|
17
17
|
|
18
18
|
attr_reader :request, :response
|
19
19
|
|
20
20
|
%w(get head post put delete).each do |verb|
|
21
|
+
alias_method "orig_#{verb}", verb
|
21
22
|
define_method(verb) do |*args| # (path, data, headers = nil)
|
22
23
|
path, data, headers = *args
|
23
24
|
data = data.inject({}) {|data, (key,value)| data[key] = Rack::Utils.unescape(value); data }
|
24
25
|
params = data.merge(:env => headers || {})
|
25
|
-
self.__send__("#{verb}
|
26
|
+
self.__send__("orig_#{verb}", path, params)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webrat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Helmkamp
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-31 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -100,6 +100,11 @@ files:
|
|
100
100
|
- lib/webrat/selenium/location_strategy_javascript/webratlink.js
|
101
101
|
- lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js
|
102
102
|
- lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js
|
103
|
+
- lib/webrat/selenium/matchers
|
104
|
+
- lib/webrat/selenium/matchers/have_content.rb
|
105
|
+
- lib/webrat/selenium/matchers/have_selector.rb
|
106
|
+
- lib/webrat/selenium/matchers/have_tag.rb
|
107
|
+
- lib/webrat/selenium/matchers/have_xpath.rb
|
103
108
|
- lib/webrat/selenium/matchers.rb
|
104
109
|
- lib/webrat/selenium/selenium_extensions.js
|
105
110
|
- lib/webrat/selenium/selenium_session.rb
|