webrat 0.4.0 → 0.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 +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
|