brynary-webrat 0.3.2.1 → 0.3.2.2
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 +14 -5
- data/README.rdoc +1 -1
- data/lib/webrat/core/elements/element.rb +4 -0
- data/lib/webrat/core/elements/field.rb +3 -3
- data/lib/webrat/core/elements/link.rb +0 -4
- data/lib/webrat/core/locators/link_locator.rb +1 -1
- data/lib/webrat/core/methods.rb +12 -6
- data/lib/webrat/core/save_and_open_page.rb +50 -0
- data/lib/webrat/core/scope.rb +14 -2
- data/lib/webrat/core/session.rb +16 -39
- data/lib/webrat/core/xml/nokogiri.rb +32 -0
- data/lib/webrat/core/xml.rb +16 -0
- data/lib/webrat/core.rb +1 -0
- data/lib/webrat/rails.rb +14 -6
- data/lib/webrat/rspec-rails.rb +1 -1
- data/lib/webrat/selenium/matchers.rb +108 -0
- data/lib/webrat/selenium/selenium_session.rb +97 -53
- data/lib/webrat/selenium.rb +55 -7
- data/lib/webrat.rb +3 -1
- metadata +4 -2
data/History.txt
CHANGED
@@ -1,17 +1,26 @@
|
|
1
|
-
== Trunk
|
1
|
+
== Trunk (Git)
|
2
2
|
|
3
|
-
|
3
|
+
* _IMPORTANT_ Breaking change:
|
4
|
+
|
5
|
+
* Removed init.rb auto-require of webrat/rails
|
6
|
+
* Removed auto-require of webrat/rails when requiring webrat when RAILS_ENV is
|
7
|
+
defined
|
8
|
+
|
9
|
+
In your env.rb file, ensure you have:
|
4
10
|
|
5
|
-
|
6
|
-
ad8956070788cf3fa0f2ea5cbcb33867028c8605
|
11
|
+
require "webrat/rails"
|
7
12
|
|
8
13
|
* Major enhancements
|
9
14
|
|
10
|
-
* Use Hpricot and REXML when not parsing with Nokogiri (on JRuby, for example)
|
11
15
|
* Added select_time, select_date, and select_datetime to API. [#36] (Ben Mabey)
|
16
|
+
* Use Hpricot and REXML when not parsing with Nokogiri (on JRuby, for example)
|
12
17
|
|
13
18
|
* Minor enhancements
|
14
19
|
|
20
|
+
* Better inspect output for Webrat elements
|
21
|
+
* Detect if the document is XML or HTML using the Content-Type when in Rails mode
|
22
|
+
* Expose #selenium method for direct access to Selenium client
|
23
|
+
* Check nokogiri gem version before requiring nokogiri
|
15
24
|
* Include the Selenium server jar file in the gem (Bryan Helmkamp, Ben Schwarz)
|
16
25
|
* Added key_down, key_up and fire_event to Selenium session (Fernando Garcia)
|
17
26
|
* Fix outputing README during Rails plugin install (Fernando Garcia)
|
data/README.rdoc
CHANGED
@@ -16,7 +16,7 @@ web application.
|
|
16
16
|
* Browser Simulator for expressive, high level acceptance testing without the
|
17
17
|
performance hit and browser dependency of Selenium or Watir (See Webrat::Session)
|
18
18
|
* Use the same API for Browser Simulator and real Selenium tests using
|
19
|
-
Webrat::
|
19
|
+
Webrat::Selenium when necessary (eg. for testing AJAX interactions)
|
20
20
|
* Supports multiple Ruby web frameworks: Rails, Merb and Sinatra
|
21
21
|
* Supports popular test frameworks: RSpec, Cucumber, Test::Unit and Shoulda
|
22
22
|
* Webrat::Matchers API for verifying rendered HTML using CSS, XPath, etc.
|
@@ -138,7 +138,7 @@ module Webrat
|
|
138
138
|
end
|
139
139
|
|
140
140
|
unless id.blank?
|
141
|
-
@label_elements += Webrat::XML.
|
141
|
+
@label_elements += Webrat::XML.xpath_search(form.element, ".//label[@for = '#{id}']")
|
142
142
|
end
|
143
143
|
|
144
144
|
@label_elements
|
@@ -373,8 +373,8 @@ module Webrat
|
|
373
373
|
protected
|
374
374
|
|
375
375
|
def default_value
|
376
|
-
selected_options = Webrat::XML.
|
377
|
-
selected_options = Webrat::XML.
|
376
|
+
selected_options = Webrat::XML.xpath_search(@element, ".//option[@selected = 'selected']")
|
377
|
+
selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
|
378
378
|
|
379
379
|
selected_options.map do |option|
|
380
380
|
return "" if option.nil?
|
data/lib/webrat/core/methods.rb
CHANGED
@@ -7,14 +7,18 @@ module Webrat
|
|
7
7
|
def #{meth}(*args, &blk)
|
8
8
|
webrat_session.#{meth}(*args, &blk)
|
9
9
|
end
|
10
|
-
|
11
|
-
def webrat_session
|
12
|
-
@_webrat_session ||= ::Webrat.session_class.new(self)
|
13
|
-
end
|
14
10
|
RUBY
|
15
11
|
end
|
16
12
|
end
|
17
13
|
|
14
|
+
def webrat
|
15
|
+
webrat_session
|
16
|
+
end
|
17
|
+
|
18
|
+
def webrat_session
|
19
|
+
@_webrat_session ||= ::Webrat.session_class.new(self)
|
20
|
+
end
|
21
|
+
|
18
22
|
# all of these methods delegate to the @session, which should
|
19
23
|
# be created transparently.
|
20
24
|
#
|
@@ -45,9 +49,11 @@ module Webrat
|
|
45
49
|
:request_page, :current_dom,
|
46
50
|
:selects_date, :selects_time, :selects_datetime,
|
47
51
|
:select_date, :select_time, :select_datetime,
|
48
|
-
:wait_for_page_to_load,
|
49
52
|
:field_by_xpath,
|
50
|
-
:field_with_id
|
53
|
+
:field_with_id,
|
54
|
+
:selenium,
|
55
|
+
:simulate, :automate
|
56
|
+
|
51
57
|
|
52
58
|
|
53
59
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Webrat
|
2
|
+
module SaveAndOpenPage
|
3
|
+
# Saves the page out to RAILS_ROOT/tmp/ and opens it in the default
|
4
|
+
# web browser if on OS X. Useful for debugging.
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
# save_and_open_page
|
8
|
+
def save_and_open_page
|
9
|
+
return unless File.exist?(saved_page_dir)
|
10
|
+
|
11
|
+
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.html"
|
12
|
+
|
13
|
+
File.open(filename, "w") do |f|
|
14
|
+
f.write rewrite_css_and_image_references(response_body)
|
15
|
+
end
|
16
|
+
|
17
|
+
open_in_browser(filename)
|
18
|
+
end
|
19
|
+
|
20
|
+
def open_in_browser(path) # :nodoc
|
21
|
+
platform = ruby_platform
|
22
|
+
if platform =~ /cygwin/ || platform =~ /win32/
|
23
|
+
`rundll32 url.dll,FileProtocolHandler #{path.gsub("/", "\\\\")}`
|
24
|
+
elsif platform =~ /darwin/
|
25
|
+
`open #{path}`
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def rewrite_css_and_image_references(response_html) # :nodoc:
|
30
|
+
return response_html unless doc_root
|
31
|
+
response_html.gsub(/"\/(stylesheets|images)/, doc_root + '/\1')
|
32
|
+
end
|
33
|
+
|
34
|
+
def saved_page_dir #:nodoc:
|
35
|
+
File.expand_path(".")
|
36
|
+
end
|
37
|
+
|
38
|
+
def doc_root #:nodoc:
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# accessor for testing
|
45
|
+
def ruby_platform
|
46
|
+
RUBY_PLATFORM
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/lib/webrat/core/scope.rb
CHANGED
@@ -279,13 +279,25 @@ module Webrat
|
|
279
279
|
|
280
280
|
def page_dom #:nodoc:
|
281
281
|
return @response.dom if @response.respond_to?(:dom)
|
282
|
-
|
282
|
+
|
283
|
+
if @session.xml_content_type?
|
284
|
+
dom = Webrat::XML.xml_document(@response_body)
|
285
|
+
else
|
286
|
+
dom = Webrat::XML.html_document(@response_body)
|
287
|
+
end
|
288
|
+
|
283
289
|
Webrat.define_dom_method(@response, dom)
|
284
290
|
return dom
|
285
291
|
end
|
286
292
|
|
287
293
|
def scoped_dom #:nodoc:
|
288
|
-
|
294
|
+
source = Webrat::XML.to_html(Webrat::XML.css_search(@scope.dom, @selector).first)
|
295
|
+
|
296
|
+
if @session.xml_content_type?
|
297
|
+
Webrat::XML.xml_document(source)
|
298
|
+
else
|
299
|
+
Webrat::XML.html_document(source)
|
300
|
+
end
|
289
301
|
end
|
290
302
|
|
291
303
|
def locate_field(field_locator, *field_types) #:nodoc:
|
data/lib/webrat/core/session.rb
CHANGED
@@ -2,6 +2,7 @@ require "forwardable"
|
|
2
2
|
require "ostruct"
|
3
3
|
|
4
4
|
require "webrat/core/mime"
|
5
|
+
require "webrat/core/save_and_open_page"
|
5
6
|
|
6
7
|
module Webrat
|
7
8
|
# A page load or form submission returned an unsuccessful response code (500-599)
|
@@ -30,6 +31,7 @@ module Webrat
|
|
30
31
|
class Session
|
31
32
|
extend Forwardable
|
32
33
|
include Logging
|
34
|
+
include SaveAndOpenPage
|
33
35
|
|
34
36
|
attr_reader :current_url
|
35
37
|
attr_reader :elements
|
@@ -43,23 +45,6 @@ module Webrat
|
|
43
45
|
|
44
46
|
reset
|
45
47
|
end
|
46
|
-
|
47
|
-
# Saves the page out to RAILS_ROOT/tmp/ and opens it in the default
|
48
|
-
# web browser if on OS X. Useful for debugging.
|
49
|
-
#
|
50
|
-
# Example:
|
51
|
-
# save_and_open_page
|
52
|
-
def save_and_open_page
|
53
|
-
return unless File.exist?(saved_page_dir)
|
54
|
-
|
55
|
-
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.html"
|
56
|
-
|
57
|
-
File.open(filename, "w") do |f|
|
58
|
-
f.write rewrite_css_and_image_references(response_body)
|
59
|
-
end
|
60
|
-
|
61
|
-
open_in_browser(filename)
|
62
|
-
end
|
63
48
|
|
64
49
|
def current_dom #:nodoc:
|
65
50
|
current_scope.dom
|
@@ -78,10 +63,6 @@ module Webrat
|
|
78
63
|
nil
|
79
64
|
end
|
80
65
|
|
81
|
-
def saved_page_dir #:nodoc:
|
82
|
-
File.expand_path(".")
|
83
|
-
end
|
84
|
-
|
85
66
|
def header(key, value)
|
86
67
|
@custom_headers[key] = value
|
87
68
|
end
|
@@ -172,20 +153,6 @@ module Webrat
|
|
172
153
|
end
|
173
154
|
|
174
155
|
webrat_deprecate :visits, :visit
|
175
|
-
|
176
|
-
def open_in_browser(path) # :nodoc
|
177
|
-
platform = ruby_platform
|
178
|
-
if platform =~ /cygwin/ || platform =~ /win32/
|
179
|
-
`rundll32 url.dll,FileProtocolHandler #{path.gsub("/", "\\\\")}`
|
180
|
-
elsif platform =~ /darwin/
|
181
|
-
`open #{path}`
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def rewrite_css_and_image_references(response_html) # :nodoc:
|
186
|
-
return response_html unless doc_root
|
187
|
-
response_html.gsub(/"\/(stylesheets|images)/, doc_root + '/\1')
|
188
|
-
end
|
189
156
|
|
190
157
|
# Subclasses can override this to show error messages without html
|
191
158
|
def formatted_error #:nodoc:
|
@@ -204,6 +171,20 @@ module Webrat
|
|
204
171
|
page_scope.dom
|
205
172
|
end
|
206
173
|
|
174
|
+
def xml_content_type?
|
175
|
+
false
|
176
|
+
end
|
177
|
+
|
178
|
+
def simulate
|
179
|
+
return if Webrat.configuration.mode == :selenium
|
180
|
+
yield
|
181
|
+
end
|
182
|
+
|
183
|
+
def automate
|
184
|
+
return unless Webrat.configuration.mode == :selenium
|
185
|
+
yield
|
186
|
+
end
|
187
|
+
|
207
188
|
def_delegators :current_scope, :fill_in, :fills_in
|
208
189
|
def_delegators :current_scope, :set_hidden_field
|
209
190
|
def_delegators :current_scope, :submit_form
|
@@ -233,9 +214,5 @@ module Webrat
|
|
233
214
|
@_page_scope = nil
|
234
215
|
end
|
235
216
|
|
236
|
-
# accessor for testing
|
237
|
-
def ruby_platform
|
238
|
-
RUBY_PLATFORM
|
239
|
-
end
|
240
217
|
end
|
241
218
|
end
|
@@ -18,6 +18,38 @@ module Webrat
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
def self.html_nokogiri_document(stringlike) #:nodoc:
|
22
|
+
return stringlike.dom if stringlike.respond_to?(:dom)
|
23
|
+
|
24
|
+
if Nokogiri::HTML::Document === stringlike
|
25
|
+
stringlike
|
26
|
+
elsif Nokogiri::XML::NodeSet === stringlike
|
27
|
+
stringlike
|
28
|
+
elsif StringIO === stringlike
|
29
|
+
Nokogiri::HTML(stringlike.string)
|
30
|
+
elsif stringlike.respond_to?(:body)
|
31
|
+
Nokogiri::HTML(stringlike.body.to_s)
|
32
|
+
else
|
33
|
+
Nokogiri::HTML(stringlike.to_s)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.xml_nokogiri_document(stringlike) #:nodoc:
|
38
|
+
return stringlike.dom if stringlike.respond_to?(:dom)
|
39
|
+
|
40
|
+
if Nokogiri::HTML::Document === stringlike
|
41
|
+
stringlike
|
42
|
+
elsif Nokogiri::XML::NodeSet === stringlike
|
43
|
+
stringlike
|
44
|
+
elsif StringIO === stringlike
|
45
|
+
Nokogiri::XML(stringlike.string)
|
46
|
+
elsif stringlike.respond_to?(:body)
|
47
|
+
Nokogiri::XML(stringlike.body.to_s)
|
48
|
+
else
|
49
|
+
Nokogiri::XML(stringlike.to_s)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
21
53
|
def self.define_dom_method(object, dom) #:nodoc:
|
22
54
|
object.meta_class.send(:define_method, :dom) do
|
23
55
|
dom
|
data/lib/webrat/core/xml.rb
CHANGED
@@ -12,6 +12,22 @@ module Webrat #:nodoc:
|
|
12
12
|
Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
def self.html_document(stringlike) #:nodoc:
|
17
|
+
if Webrat.configuration.parse_with_nokogiri?
|
18
|
+
Webrat.html_nokogiri_document(stringlike)
|
19
|
+
else
|
20
|
+
Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.xml_document(stringlike) #:nodoc:
|
25
|
+
if Webrat.configuration.parse_with_nokogiri?
|
26
|
+
Webrat.xml_nokogiri_document(stringlike)
|
27
|
+
else
|
28
|
+
Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
|
29
|
+
end
|
30
|
+
end
|
15
31
|
|
16
32
|
def self.to_html(element)
|
17
33
|
if Webrat.configuration.parse_with_nokogiri?
|
data/lib/webrat/core.rb
CHANGED
data/lib/webrat/rails.rb
CHANGED
@@ -36,6 +36,10 @@ module Webrat
|
|
36
36
|
response.code.to_i
|
37
37
|
end
|
38
38
|
|
39
|
+
def xml_content_type?
|
40
|
+
response.headers["Content-Type"].to_s =~ /xml/
|
41
|
+
end
|
42
|
+
|
39
43
|
protected
|
40
44
|
|
41
45
|
def integration_session
|
@@ -44,15 +48,18 @@ module Webrat
|
|
44
48
|
|
45
49
|
def do_request(http_method, url, data, headers) #:nodoc:
|
46
50
|
update_protocol(url)
|
47
|
-
|
51
|
+
url = normalize_url(url)
|
52
|
+
integration_session.request_via_redirect(http_method, url, data, headers)
|
48
53
|
end
|
49
54
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
# remove protocol, host and anchor
|
56
|
+
def normalize_url(href) #:nodoc:
|
57
|
+
uri = URI.parse(href)
|
58
|
+
normalized_url = uri.path
|
59
|
+
if uri.query
|
60
|
+
normalized_url += "?" + uri.query
|
55
61
|
end
|
62
|
+
normalized_url
|
56
63
|
end
|
57
64
|
|
58
65
|
def update_protocol(href) #:nodoc:
|
@@ -82,6 +89,7 @@ module ActionController #:nodoc:
|
|
82
89
|
|
83
90
|
IntegrationTest.class_eval do
|
84
91
|
include Webrat::Methods
|
92
|
+
include Webrat::Matchers
|
85
93
|
end
|
86
94
|
end
|
87
95
|
|
data/lib/webrat/rspec-rails.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
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:
|
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
|
#
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Webrat
|
2
|
+
module Selenium
|
3
|
+
module Matchers
|
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
|
+
class HaveSelector
|
34
|
+
def initialize(expected)
|
35
|
+
@expected = expected
|
36
|
+
end
|
37
|
+
|
38
|
+
def matches?(response)
|
39
|
+
response.session.wait_for do
|
40
|
+
response.selenium.is_element_present("css=#{@expected}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# ==== Returns
|
45
|
+
# String:: The failure message.
|
46
|
+
def failure_message
|
47
|
+
"expected following text to match selector #{@expected}:\n#{@document}"
|
48
|
+
end
|
49
|
+
|
50
|
+
# ==== Returns
|
51
|
+
# String:: The failure message to be displayed in negative matches.
|
52
|
+
def negative_failure_message
|
53
|
+
"expected following text to not match selector #{@expected}:\n#{@document}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def have_selector(content)
|
58
|
+
HaveSelector.new(content)
|
59
|
+
end
|
60
|
+
|
61
|
+
class HasContent #:nodoc:
|
62
|
+
def initialize(content)
|
63
|
+
@content = content
|
64
|
+
end
|
65
|
+
|
66
|
+
def matches?(response)
|
67
|
+
if @content.is_a?(Regexp)
|
68
|
+
text_finder = "regexp:#{@content.source}"
|
69
|
+
else
|
70
|
+
text_finder = @content
|
71
|
+
end
|
72
|
+
|
73
|
+
response.session.wait_for do
|
74
|
+
response.selenium.is_text_present(text_finder)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# ==== Returns
|
79
|
+
# String:: The failure message.
|
80
|
+
def failure_message
|
81
|
+
"expected the following element's content to #{content_message}:\n#{@element}"
|
82
|
+
end
|
83
|
+
|
84
|
+
# ==== Returns
|
85
|
+
# String:: The failure message to be displayed in negative matches.
|
86
|
+
def negative_failure_message
|
87
|
+
"expected the following element's content to not #{content_message}:\n#{@element}"
|
88
|
+
end
|
89
|
+
|
90
|
+
def content_message
|
91
|
+
case @content
|
92
|
+
when String
|
93
|
+
"include \"#{@content}\""
|
94
|
+
when Regexp
|
95
|
+
"match #{@content.inspect}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Matches the contents of an HTML document with
|
101
|
+
# whatever string is supplied
|
102
|
+
def contain(content)
|
103
|
+
HasContent.new(content)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -1,9 +1,34 @@
|
|
1
|
+
require "webrat/core/save_and_open_page"
|
2
|
+
|
1
3
|
module Webrat
|
4
|
+
class TimeoutError < WebratError
|
5
|
+
end
|
6
|
+
|
7
|
+
class SeleniumResponse
|
8
|
+
attr_reader :body
|
9
|
+
attr_reader :session
|
10
|
+
|
11
|
+
def initialize(session, body)
|
12
|
+
@session = session
|
13
|
+
@body = body
|
14
|
+
end
|
15
|
+
|
16
|
+
def selenium
|
17
|
+
session.selenium
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
2
21
|
class SeleniumSession
|
22
|
+
include Webrat::SaveAndOpenPage
|
3
23
|
|
4
24
|
def initialize(*args) # :nodoc:
|
5
|
-
|
6
|
-
|
25
|
+
end
|
26
|
+
|
27
|
+
def simulate
|
28
|
+
end
|
29
|
+
|
30
|
+
def automate
|
31
|
+
yield
|
7
32
|
end
|
8
33
|
|
9
34
|
def visit(url)
|
@@ -14,11 +39,16 @@ module Webrat
|
|
14
39
|
|
15
40
|
def fill_in(field_identifier, options)
|
16
41
|
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
42
|
+
selenium.wait_for_element locator, 5
|
17
43
|
selenium.type(locator, "#{options[:with]}")
|
18
44
|
end
|
19
45
|
|
20
46
|
webrat_deprecate :fills_in, :fill_in
|
21
47
|
|
48
|
+
def response
|
49
|
+
SeleniumResponse.new(self, response_body)
|
50
|
+
end
|
51
|
+
|
22
52
|
def response_body #:nodoc:
|
23
53
|
selenium.get_html_source
|
24
54
|
end
|
@@ -26,57 +56,34 @@ module Webrat
|
|
26
56
|
def click_button(button_text_or_regexp = nil, options = {})
|
27
57
|
if button_text_or_regexp.is_a?(Hash) && options == {}
|
28
58
|
pattern, options = nil, button_text_or_regexp
|
29
|
-
|
59
|
+
elsif button_text_or_regexp
|
30
60
|
pattern = adjust_if_regexp(button_text_or_regexp)
|
31
61
|
end
|
32
62
|
pattern ||= '*'
|
33
|
-
|
34
|
-
|
63
|
+
locator = "button=#{pattern}"
|
64
|
+
|
65
|
+
selenium.wait_for_element locator, 5
|
66
|
+
selenium.click locator
|
35
67
|
end
|
36
68
|
|
37
69
|
webrat_deprecate :clicks_button, :click_button
|
38
70
|
|
39
71
|
def click_link(link_text_or_regexp, options = {})
|
40
72
|
pattern = adjust_if_regexp(link_text_or_regexp)
|
41
|
-
|
42
|
-
|
73
|
+
locator = "webratlink=#{pattern}"
|
74
|
+
selenium.wait_for_element locator, 5
|
75
|
+
selenium.click locator
|
43
76
|
end
|
44
77
|
|
45
78
|
webrat_deprecate :clicks_link, :click_link
|
46
79
|
|
47
80
|
def click_link_within(selector, link_text, options = {})
|
48
|
-
|
49
|
-
|
81
|
+
locator = "webratlinkwithin=#{selector}|#{link_text}"
|
82
|
+
selenium.wait_for_element locator, 5
|
83
|
+
selenium.click locator
|
50
84
|
end
|
51
85
|
|
52
86
|
webrat_deprecate :clicks_link_within, :click_link_within
|
53
|
-
|
54
|
-
def wait_for_result(wait_type)
|
55
|
-
if wait_type == :ajax
|
56
|
-
wait_for_ajax
|
57
|
-
elsif wait_type == :effects
|
58
|
-
wait_for_effects
|
59
|
-
else
|
60
|
-
wait_for_page_to_load
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def wait_for_page_to_load(timeout = 15000)
|
65
|
-
selenium.wait_for_page_to_load(timeout)
|
66
|
-
end
|
67
|
-
|
68
|
-
def wait_for_ajax(timeout = 15000)
|
69
|
-
selenium.wait_for_condition "Ajax.activeRequestCount == 0", timeout
|
70
|
-
end
|
71
|
-
|
72
|
-
def wait_for_effects(timeout = 15000)
|
73
|
-
selenium.wait_for_condition "window.Effect.Queue.size() == 0", timeout
|
74
|
-
end
|
75
|
-
|
76
|
-
def wait_for_ajax_and_effects
|
77
|
-
wait_for_ajax
|
78
|
-
wait_for_effects
|
79
|
-
end
|
80
87
|
|
81
88
|
def select(option_text, options = {})
|
82
89
|
id_or_name_or_label = options[:from]
|
@@ -86,30 +93,28 @@ module Webrat
|
|
86
93
|
else
|
87
94
|
select_locator = "webratselectwithoption=#{option_text}"
|
88
95
|
end
|
96
|
+
|
97
|
+
selenium.wait_for_element select_locator, 5
|
89
98
|
selenium.select(select_locator, option_text)
|
90
99
|
end
|
91
100
|
|
92
101
|
webrat_deprecate :selects, :select
|
93
102
|
|
94
103
|
def choose(label_text)
|
95
|
-
|
104
|
+
locator = "webrat=#{label_text}"
|
105
|
+
selenium.wait_for_element locator, 5
|
106
|
+
selenium.click locator
|
96
107
|
end
|
97
108
|
|
98
109
|
webrat_deprecate :chooses, :choose
|
99
110
|
|
100
111
|
def check(label_text)
|
101
|
-
|
112
|
+
locator = "webrat=#{label_text}"
|
113
|
+
selenium.wait_for_element locator, 5
|
114
|
+
selenium.check locator
|
102
115
|
end
|
103
116
|
|
104
117
|
webrat_deprecate :checks, :check
|
105
|
-
|
106
|
-
def is_ordered(*args) #:nodoc:
|
107
|
-
selenium.is_ordered(*args)
|
108
|
-
end
|
109
|
-
|
110
|
-
def dragdrop(*args) #:nodoc:
|
111
|
-
selenium.dragdrop(*args)
|
112
|
-
end
|
113
118
|
|
114
119
|
def fire_event(field_identifier, event)
|
115
120
|
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
@@ -126,12 +131,52 @@ module Webrat
|
|
126
131
|
selenium.key_up(locator, key_code)
|
127
132
|
end
|
128
133
|
|
129
|
-
def
|
134
|
+
def wait_for(params={})
|
135
|
+
timeout = params[:timeout] || 5
|
136
|
+
message = params[:message] || "Timeout exceeded"
|
137
|
+
|
138
|
+
begin_time = Time.now
|
139
|
+
|
140
|
+
while (Time.now - begin_time) < timeout
|
141
|
+
value = nil
|
142
|
+
|
143
|
+
begin
|
144
|
+
value = yield
|
145
|
+
rescue ::Spec::Expectations::ExpectationNotMetError, ::Selenium::CommandError, Webrat::WebratError
|
146
|
+
value = nil
|
147
|
+
end
|
148
|
+
|
149
|
+
return value if value
|
150
|
+
|
151
|
+
sleep 0.25
|
152
|
+
end
|
153
|
+
|
154
|
+
raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
|
155
|
+
true
|
156
|
+
end
|
157
|
+
|
158
|
+
def selenium
|
130
159
|
return $browser if $browser
|
131
160
|
setup
|
132
161
|
$browser
|
133
162
|
end
|
134
163
|
|
164
|
+
webrat_deprecate :browser, :selenium
|
165
|
+
|
166
|
+
|
167
|
+
def save_and_open_screengrab
|
168
|
+
return unless File.exist?(saved_page_dir)
|
169
|
+
|
170
|
+
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
|
171
|
+
|
172
|
+
if $browser.chrome_backend?
|
173
|
+
$browser.capture_entire_page_screenshot(filename, '')
|
174
|
+
else
|
175
|
+
$browser.capture_screenshot(filename)
|
176
|
+
end
|
177
|
+
open_in_browser(filename)
|
178
|
+
end
|
179
|
+
|
135
180
|
protected
|
136
181
|
|
137
182
|
def setup #:nodoc:
|
@@ -140,15 +185,14 @@ module Webrat
|
|
140
185
|
Webrat.start_app_server
|
141
186
|
end
|
142
187
|
|
143
|
-
|
144
188
|
$browser = ::Selenium::Client::Driver.new("localhost", 4444, "*firefox", "http://0.0.0.0:3001")
|
145
189
|
$browser.set_speed(0)
|
146
190
|
$browser.start
|
147
191
|
teardown_at_exit
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
browser
|
192
|
+
|
193
|
+
extend_selenium
|
194
|
+
define_location_strategies
|
195
|
+
$browser.window_maximize
|
152
196
|
end
|
153
197
|
|
154
198
|
def teardown_at_exit #:nodoc:
|
@@ -165,7 +209,7 @@ module Webrat
|
|
165
209
|
if text_or_regexp.is_a?(Regexp)
|
166
210
|
"evalregex:#{text_or_regexp.inspect}"
|
167
211
|
else
|
168
|
-
text_or_regexp
|
212
|
+
"evalregex:/#{text_or_regexp}/"
|
169
213
|
end
|
170
214
|
end
|
171
215
|
|
data/lib/webrat/selenium.rb
CHANGED
@@ -2,6 +2,7 @@ require "webrat"
|
|
2
2
|
gem "selenium-client", ">=1.2.9"
|
3
3
|
require "selenium/client"
|
4
4
|
require "webrat/selenium/selenium_session"
|
5
|
+
require "webrat/selenium/matchers"
|
5
6
|
|
6
7
|
Webrat.configuration.mode = :selenium
|
7
8
|
|
@@ -36,24 +37,71 @@ module Webrat
|
|
36
37
|
system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
|
37
38
|
end
|
38
39
|
|
39
|
-
|
40
|
+
# To use Webrat's Selenium support, you'll need the selenium-client gem installed.
|
41
|
+
# Activate it with (for example, in your <tt>env.rb</tt>):
|
42
|
+
#
|
43
|
+
# require "webrat/selenium"
|
44
|
+
#
|
45
|
+
# Then, if you're using Cucumber, configure it to use a
|
46
|
+
# <tt>Webrat::Selenium::Rails::World</tt> as the scenario context by adding
|
47
|
+
# the following to <tt>env.rb</tt>:
|
48
|
+
#
|
49
|
+
# World do
|
50
|
+
# Webrat::Selenium::Rails::World.new
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# == Dropping down to the selenium-client API
|
54
|
+
#
|
55
|
+
# If you ever need to do something with Selenium not provided in the Webrat API,
|
56
|
+
# you can always drop down to the selenium-client API using the <tt>selenium</tt> method.
|
57
|
+
# For example:
|
58
|
+
#
|
59
|
+
# When "I drag the photo to the left" do
|
60
|
+
# selenium.dragdrop("id=photo_123", "+350, 0")
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# == Auto-starting of the mongrel and java server
|
64
|
+
#
|
65
|
+
# Webrat will automatically start the Selenium Java server process and an instance
|
66
|
+
# of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
|
67
|
+
# instead of "test", so ensure you've got that defined, and will run on port 3001.
|
68
|
+
#
|
69
|
+
# == Waiting
|
70
|
+
#
|
71
|
+
# In order to make writing Selenium tests as easy as possible, Webrat will automatically
|
72
|
+
# wait for the correct elements to exist on the page when trying to manipulate them
|
73
|
+
# with methods like <tt>fill_in</tt>, etc. In general, this means you should be able to write
|
74
|
+
# your Webrat::Selenium tests ignoring the concurrency issues that can plague in-browser
|
75
|
+
# testing, so long as you're using the Webrat API.
|
76
|
+
module Selenium
|
77
|
+
|
40
78
|
module Rails #:nodoc:
|
41
79
|
class World < ::ActionController::IntegrationTest
|
80
|
+
include Webrat::Selenium::Matchers
|
42
81
|
|
43
82
|
def initialize #:nodoc:
|
44
83
|
@_result = Test::Unit::TestResult.new
|
45
84
|
end
|
46
85
|
|
86
|
+
def response
|
87
|
+
webrat_session.response
|
88
|
+
end
|
89
|
+
|
90
|
+
def wait_for(*args, &block)
|
91
|
+
webrat_session.wait_for(*args, &block)
|
92
|
+
end
|
93
|
+
|
94
|
+
def save_and_open_screengrab
|
95
|
+
webrat_session.save_and_open_screengrab
|
96
|
+
end
|
47
97
|
end
|
48
98
|
end
|
49
99
|
end
|
50
100
|
|
51
101
|
end
|
52
102
|
|
53
|
-
module
|
54
|
-
|
55
|
-
|
56
|
-
include Webrat::Methods
|
57
|
-
end
|
103
|
+
module ActionController #:nodoc:
|
104
|
+
IntegrationTest.class_eval do
|
105
|
+
include Webrat::Methods
|
58
106
|
end
|
59
|
-
end
|
107
|
+
end
|
data/lib/webrat.rb
CHANGED
@@ -7,9 +7,11 @@ module Webrat
|
|
7
7
|
class WebratError < StandardError
|
8
8
|
end
|
9
9
|
|
10
|
-
VERSION = '0.3.2.
|
10
|
+
VERSION = '0.3.2.2'
|
11
11
|
|
12
12
|
def self.require_xml
|
13
|
+
gem "nokogiri", ">= 1.0.6"
|
14
|
+
|
13
15
|
if on_java?
|
14
16
|
# We need Nokogiri's CSS to XPath support, even if using REXML and Hpricot for parsing and searching
|
15
17
|
require "nokogiri/css"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brynary-webrat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.2.
|
4
|
+
version: 0.3.2.2
|
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: 2008-
|
12
|
+
date: 2008-12-25 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- lib/webrat/core/matchers.rb
|
70
70
|
- lib/webrat/core/methods.rb
|
71
71
|
- lib/webrat/core/mime.rb
|
72
|
+
- lib/webrat/core/save_and_open_page.rb
|
72
73
|
- lib/webrat/core/scope.rb
|
73
74
|
- lib/webrat/core/session.rb
|
74
75
|
- lib/webrat/core/xml
|
@@ -99,6 +100,7 @@ files:
|
|
99
100
|
- lib/webrat/selenium/location_strategy_javascript/webratlink.js
|
100
101
|
- lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js
|
101
102
|
- lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js
|
103
|
+
- lib/webrat/selenium/matchers.rb
|
102
104
|
- lib/webrat/selenium/selenium_extensions.js
|
103
105
|
- lib/webrat/selenium/selenium_session.rb
|
104
106
|
- lib/webrat/selenium.rb
|