aslakhellesoy-webrat 0.3.2.2 → 0.4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +158 -19
- data/Rakefile +36 -11
- data/lib/webrat.rb +8 -11
- data/lib/webrat/core/configuration.rb +67 -25
- data/lib/webrat/core/elements/area.rb +7 -7
- data/lib/webrat/core/elements/element.rb +11 -11
- data/lib/webrat/core/elements/field.rb +70 -51
- data/lib/webrat/core/elements/form.rb +17 -17
- data/lib/webrat/core/elements/label.rb +8 -8
- data/lib/webrat/core/elements/link.rb +13 -11
- data/lib/webrat/core/elements/select_option.rb +9 -9
- data/lib/webrat/core/locators.rb +2 -2
- data/lib/webrat/core/locators/area_locator.rb +10 -10
- data/lib/webrat/core/locators/button_locator.rb +13 -13
- data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
- data/lib/webrat/core/locators/field_labeled_locator.rb +19 -13
- data/lib/webrat/core/locators/field_locator.rb +7 -7
- data/lib/webrat/core/locators/field_named_locator.rb +10 -10
- data/lib/webrat/core/locators/form_locator.rb +6 -6
- data/lib/webrat/core/locators/label_locator.rb +9 -9
- data/lib/webrat/core/locators/link_locator.rb +12 -12
- data/lib/webrat/core/locators/locator.rb +5 -5
- data/lib/webrat/core/locators/select_option_locator.rb +11 -11
- data/lib/webrat/core/logging.rb +7 -4
- data/lib/webrat/core/matchers/have_content.rb +19 -15
- data/lib/webrat/core/matchers/have_selector.rb +44 -22
- data/lib/webrat/core/matchers/have_tag.rb +11 -61
- data/lib/webrat/core/matchers/have_xpath.rb +89 -35
- data/lib/webrat/core/methods.rb +13 -11
- data/lib/webrat/core/mime.rb +3 -3
- data/lib/webrat/core/save_and_open_page.rb +9 -9
- data/lib/webrat/core/scope.rb +82 -62
- data/lib/webrat/core/session.rb +61 -18
- data/lib/webrat/core/xml.rb +16 -16
- data/lib/webrat/core/xml/hpricot.rb +3 -3
- data/lib/webrat/core/xml/nokogiri.rb +14 -14
- data/lib/webrat/core/xml/rexml.rb +3 -3
- data/lib/webrat/core_extensions/blank.rb +1 -1
- data/lib/webrat/core_extensions/deprecate.rb +1 -1
- data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
- data/lib/webrat/core_extensions/meta_class.rb +1 -1
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/lib/webrat/mechanize.rb +9 -9
- data/lib/webrat/merb.rb +5 -61
- data/lib/webrat/merb_session.rb +67 -0
- data/lib/webrat/rack.rb +45 -14
- data/lib/webrat/rails.rb +31 -11
- data/lib/webrat/rspec-rails.rb +2 -2
- data/lib/webrat/selenium.rb +27 -39
- data/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/lib/webrat/selenium/application_servers.rb +5 -0
- data/lib/webrat/selenium/application_servers/base.rb +44 -0
- data/lib/webrat/selenium/application_servers/external.rb +24 -0
- data/lib/webrat/selenium/application_servers/merb.rb +48 -0
- data/lib/webrat/selenium/application_servers/rails.rb +42 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +35 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
- data/lib/webrat/selenium/location_strategy_javascript/label.js +1 -2
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
- data/lib/webrat/selenium/matchers.rb +4 -108
- data/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +84 -0
- data/lib/webrat/selenium/selenium_session.rb +86 -68
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- metadata +21 -16
- data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +0 -131
- data/lib/webrat/sinatra.rb +0 -29
@@ -3,57 +3,94 @@ require "webrat/core/xml/rexml"
|
|
3
3
|
|
4
4
|
module Webrat
|
5
5
|
module Matchers
|
6
|
-
|
6
|
+
|
7
7
|
class HaveXpath #:nodoc:
|
8
|
-
def initialize(expected, &block)
|
8
|
+
def initialize(expected, options = {}, &block)
|
9
9
|
@expected = expected
|
10
|
+
@options = options
|
10
11
|
@block = block
|
11
12
|
end
|
12
|
-
|
13
|
-
def matches?(stringlike)
|
13
|
+
|
14
|
+
def matches?(stringlike, &block)
|
15
|
+
@block ||= block
|
16
|
+
matched = matches(stringlike)
|
17
|
+
|
18
|
+
if @options[:count]
|
19
|
+
matched.size == @options[:count] && (!@block || @block.call(matched))
|
20
|
+
else
|
21
|
+
matched.any? && (!@block || @block.call(matched))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def matches(stringlike)
|
14
26
|
if Webrat.configuration.parse_with_nokogiri?
|
15
|
-
|
27
|
+
nokogiri_matches(stringlike)
|
16
28
|
else
|
17
|
-
|
29
|
+
rexml_matches(stringlike)
|
18
30
|
end
|
19
31
|
end
|
20
|
-
|
21
|
-
def
|
32
|
+
|
33
|
+
def rexml_matches(stringlike)
|
22
34
|
if REXML::Node === stringlike || Array === stringlike
|
23
|
-
@query = query.map { |q| q.gsub(%r'
|
35
|
+
@query = query.map { |q| q.gsub(%r'^//', './/') }
|
24
36
|
else
|
25
37
|
@query = query
|
26
38
|
end
|
27
39
|
|
40
|
+
add_options_conditions_to(@query)
|
41
|
+
|
28
42
|
@document = Webrat.rexml_document(stringlike)
|
29
43
|
|
30
|
-
|
44
|
+
@query.map do |q|
|
31
45
|
if @document.is_a?(Array)
|
32
46
|
@document.map { |d| REXML::XPath.match(d, q) }
|
33
47
|
else
|
34
48
|
REXML::XPath.match(@document, q)
|
35
49
|
end
|
36
50
|
end.flatten.compact
|
37
|
-
|
38
|
-
matched.any? && (!@block || @block.call(matched))
|
39
51
|
end
|
40
|
-
|
41
|
-
def
|
52
|
+
|
53
|
+
def nokogiri_matches(stringlike)
|
42
54
|
if Nokogiri::XML::NodeSet === stringlike
|
43
|
-
@query = query.
|
55
|
+
@query = query.gsub(%r'^//', './/')
|
44
56
|
else
|
45
57
|
@query = query
|
46
58
|
end
|
47
|
-
|
59
|
+
|
60
|
+
add_options_conditions_to(@query)
|
61
|
+
|
48
62
|
@document = Webrat::XML.document(stringlike)
|
49
|
-
|
50
|
-
|
63
|
+
@document.xpath(*@query)
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_options_conditions_to(query)
|
67
|
+
add_attributes_conditions_to(query)
|
68
|
+
add_content_condition_to(query)
|
51
69
|
end
|
52
|
-
|
70
|
+
|
71
|
+
def add_attributes_conditions_to(query)
|
72
|
+
attribute_conditions = []
|
73
|
+
|
74
|
+
@options.each do |key, value|
|
75
|
+
next if [:content, :count].include?(key)
|
76
|
+
attribute_conditions << "@#{key} = #{xpath_escape(value)}"
|
77
|
+
end
|
78
|
+
|
79
|
+
if attribute_conditions.any?
|
80
|
+
query << "[#{attribute_conditions.join(' and ')}]"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def add_content_condition_to(query)
|
85
|
+
if @options[:content]
|
86
|
+
query << "[contains(., #{xpath_escape(@options[:content])})]"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
53
90
|
def query
|
54
|
-
|
91
|
+
@expected
|
55
92
|
end
|
56
|
-
|
93
|
+
|
57
94
|
# ==== Returns
|
58
95
|
# String:: The failure message.
|
59
96
|
def failure_message
|
@@ -64,9 +101,26 @@ module Webrat
|
|
64
101
|
# String:: The failure message to be displayed in negative matches.
|
65
102
|
def negative_failure_message
|
66
103
|
"expected following text to not match xpath #{@expected}:\n#{@document}"
|
67
|
-
end
|
104
|
+
end
|
105
|
+
|
106
|
+
protected
|
107
|
+
|
108
|
+
def xpath_escape(string)
|
109
|
+
if string.include?("'") && string.include?('"')
|
110
|
+
parts = string.split("'").map do |part|
|
111
|
+
"'#{part}'"
|
112
|
+
end
|
113
|
+
|
114
|
+
"concat(" + parts.join(", \"'\", ") + ")"
|
115
|
+
elsif string.include?("'")
|
116
|
+
"\"#{string}\""
|
117
|
+
else
|
118
|
+
"'#{string}'"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
68
122
|
end
|
69
|
-
|
123
|
+
|
70
124
|
# Matches HTML content against an XPath query
|
71
125
|
#
|
72
126
|
# ==== Parameters
|
@@ -74,20 +128,20 @@ module Webrat
|
|
74
128
|
#
|
75
129
|
# ==== Returns
|
76
130
|
# HaveXpath:: A new have xpath matcher.
|
77
|
-
def have_xpath(expected, &block)
|
78
|
-
HaveXpath.new(expected, &block)
|
131
|
+
def have_xpath(expected, options = {}, &block)
|
132
|
+
HaveXpath.new(expected, options, &block)
|
79
133
|
end
|
80
134
|
alias_method :match_xpath, :have_xpath
|
81
|
-
|
82
|
-
def assert_have_xpath(expected, &block)
|
83
|
-
hs = HaveXpath.new(expected, &block)
|
84
|
-
|
135
|
+
|
136
|
+
def assert_have_xpath(expected, options = {}, &block)
|
137
|
+
hs = HaveXpath.new(expected, options, &block)
|
138
|
+
assert hs.matches?(response_body), hs.failure_message
|
85
139
|
end
|
86
|
-
|
87
|
-
def assert_have_no_xpath(expected, &block)
|
88
|
-
hs = HaveXpath.new(expected, &block)
|
89
|
-
|
140
|
+
|
141
|
+
def assert_have_no_xpath(expected, options = {}, &block)
|
142
|
+
hs = HaveXpath.new(expected, options, &block)
|
143
|
+
assert !hs.matches?(response_body), hs.negative_failure_message
|
90
144
|
end
|
91
|
-
|
145
|
+
|
92
146
|
end
|
93
|
-
end
|
147
|
+
end
|
data/lib/webrat/core/methods.rb
CHANGED
@@ -10,15 +10,19 @@ module Webrat
|
|
10
10
|
RUBY
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def webrat
|
15
15
|
webrat_session
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def webrat_session
|
19
|
-
@_webrat_session ||= ::Webrat.
|
19
|
+
@_webrat_session ||= ::Webrat::Session.new(webrat_adapter)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
|
+
def webrat_adapter
|
23
|
+
@_webrat_adapter ||= Webrat.session_class.new(self)
|
24
|
+
end
|
25
|
+
|
22
26
|
# all of these methods delegate to the @session, which should
|
23
27
|
# be created transparently.
|
24
28
|
#
|
@@ -31,7 +35,7 @@ module Webrat
|
|
31
35
|
:header, :http_accept, :basic_auth,
|
32
36
|
:save_and_open_page,
|
33
37
|
:fills_in, :fill_in,
|
34
|
-
:checks, :check,
|
38
|
+
:checks, :check,
|
35
39
|
:unchecks, :uncheck,
|
36
40
|
:chooses, :choose,
|
37
41
|
:selects, :select,
|
@@ -47,15 +51,13 @@ module Webrat
|
|
47
51
|
:select_option,
|
48
52
|
:set_hidden_field, :submit_form,
|
49
53
|
:request_page, :current_dom,
|
50
|
-
:response_body,
|
54
|
+
:response_body,
|
51
55
|
:selects_date, :selects_time, :selects_datetime,
|
52
56
|
:select_date, :select_time, :select_datetime,
|
53
57
|
:field_by_xpath,
|
54
58
|
:field_with_id,
|
55
59
|
:selenium,
|
56
|
-
:simulate, :automate
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
+
:simulate, :automate,
|
61
|
+
:field_named
|
60
62
|
end
|
61
|
-
end
|
63
|
+
end
|
data/lib/webrat/core/mime.rb
CHANGED
@@ -2,21 +2,21 @@ module Webrat
|
|
2
2
|
module SaveAndOpenPage
|
3
3
|
# Saves the page out to RAILS_ROOT/tmp/ and opens it in the default
|
4
4
|
# web browser if on OS X. Useful for debugging.
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# Example:
|
7
7
|
# save_and_open_page
|
8
8
|
def save_and_open_page
|
9
9
|
return unless File.exist?(saved_page_dir)
|
10
10
|
|
11
11
|
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.html"
|
12
|
-
|
12
|
+
|
13
13
|
File.open(filename, "w") do |f|
|
14
14
|
f.write rewrite_css_and_image_references(response_body)
|
15
15
|
end
|
16
16
|
|
17
17
|
open_in_browser(filename)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def open_in_browser(path) # :nodoc
|
21
21
|
platform = ruby_platform
|
22
22
|
if platform =~ /cygwin/ || platform =~ /win32/
|
@@ -25,26 +25,26 @@ module Webrat
|
|
25
25
|
`open #{path}`
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def rewrite_css_and_image_references(response_html) # :nodoc:
|
30
30
|
return response_html unless doc_root
|
31
31
|
response_html.gsub(/"\/(stylesheets|images)/, doc_root + '/\1')
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def saved_page_dir #:nodoc:
|
35
35
|
File.expand_path(".")
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def doc_root #:nodoc:
|
39
39
|
nil
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
private
|
43
43
|
|
44
44
|
# accessor for testing
|
45
45
|
def ruby_platform
|
46
46
|
RUBY_PLATFORM
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
end
|
50
|
-
end
|
50
|
+
end
|
data/lib/webrat/core/scope.rb
CHANGED
@@ -6,32 +6,36 @@ module Webrat
|
|
6
6
|
# An HTML element (link, button, field, etc.) that Webrat expected was not found on the page
|
7
7
|
class NotFoundError < WebratError
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
class Scope
|
11
11
|
include Logging
|
12
12
|
include Locators
|
13
|
-
|
13
|
+
|
14
14
|
def self.from_page(session, response, response_body) #:nodoc:
|
15
15
|
new(session) do
|
16
16
|
@response = response
|
17
17
|
@response_body = response_body
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def self.from_scope(session, scope, selector) #:nodoc:
|
22
22
|
new(session) do
|
23
23
|
@scope = scope
|
24
24
|
@selector = selector
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
attr_reader :session
|
29
|
-
|
29
|
+
|
30
30
|
def initialize(session, &block) #:nodoc:
|
31
31
|
@session = session
|
32
32
|
instance_eval(&block) if block_given?
|
33
|
+
|
34
|
+
if @selector && scoped_dom.nil?
|
35
|
+
raise Webrat::NotFoundError.new("The scope was not found on the page: #{@selector.inspect}")
|
36
|
+
end
|
33
37
|
end
|
34
|
-
|
38
|
+
|
35
39
|
# Verifies an input field or textarea exists on the current page, and stores a value for
|
36
40
|
# it which will be sent when the form is submitted.
|
37
41
|
#
|
@@ -49,12 +53,17 @@ module Webrat
|
|
49
53
|
end
|
50
54
|
|
51
55
|
webrat_deprecate :fills_in, :fill_in
|
52
|
-
|
56
|
+
|
57
|
+
# Verifies that a hidden field exists on the current page and sets
|
58
|
+
# the value to that given by the <tt>:to</tt> option.
|
59
|
+
#
|
60
|
+
# Example:
|
61
|
+
# set_hidden_field 'user_id', :to => 1
|
53
62
|
def set_hidden_field(field_locator, options = {})
|
54
63
|
field = locate_field(field_locator, HiddenField)
|
55
64
|
field.set(options[:to])
|
56
65
|
end
|
57
|
-
|
66
|
+
|
58
67
|
# Verifies that an input checkbox exists on the current page and marks it
|
59
68
|
# as checked, so that the value will be submitted with the form.
|
60
69
|
#
|
@@ -65,7 +74,7 @@ module Webrat
|
|
65
74
|
end
|
66
75
|
|
67
76
|
webrat_deprecate :checks, :check
|
68
|
-
|
77
|
+
|
69
78
|
# Verifies that an input checkbox exists on the current page and marks it
|
70
79
|
# as unchecked, so that the value will not be submitted with the form.
|
71
80
|
#
|
@@ -76,7 +85,7 @@ module Webrat
|
|
76
85
|
end
|
77
86
|
|
78
87
|
webrat_deprecate :unchecks, :uncheck
|
79
|
-
|
88
|
+
|
80
89
|
# Verifies that an input radio button exists on the current page and marks it
|
81
90
|
# as checked, so that the value will be submitted with the form.
|
82
91
|
#
|
@@ -87,7 +96,7 @@ module Webrat
|
|
87
96
|
end
|
88
97
|
|
89
98
|
webrat_deprecate :chooses, :choose
|
90
|
-
|
99
|
+
|
91
100
|
# Verifies that a an option element exists on the current page with the specified
|
92
101
|
# text. You can optionally restrict the search to a specific select list by
|
93
102
|
# assigning <tt>options[:from]</tt> the value of the select list's name or
|
@@ -102,7 +111,7 @@ module Webrat
|
|
102
111
|
end
|
103
112
|
|
104
113
|
webrat_deprecate :selects, :select
|
105
|
-
|
114
|
+
|
106
115
|
DATE_TIME_SUFFIXES = {
|
107
116
|
:year => '1i',
|
108
117
|
:month => '2i',
|
@@ -111,9 +120,9 @@ module Webrat
|
|
111
120
|
:minute => '5i'
|
112
121
|
}
|
113
122
|
|
114
|
-
# Verifies that date elements (year, month, day) exist on the current page
|
123
|
+
# Verifies that date elements (year, month, day) exist on the current page
|
115
124
|
# with the specified values. You can optionally restrict the search to a specific
|
116
|
-
# date's elements by assigning <tt>options[:from]</tt> the value of the date's
|
125
|
+
# date's elements by assigning <tt>options[:from]</tt> the value of the date's
|
117
126
|
# label. Selects all the date elements with date provided. The date provided may
|
118
127
|
# be a string or a Date/Time object.
|
119
128
|
#
|
@@ -127,15 +136,15 @@ module Webrat
|
|
127
136
|
# select_date Date.parse("December 25, 2000"), :from => "Event"
|
128
137
|
# select_date "April 26, 1982", :id_prefix => 'birthday'
|
129
138
|
def select_date(date_to_select, options ={})
|
130
|
-
date = date_to_select.is_a?(Date) || date_to_select.is_a?(Time) ?
|
131
|
-
date_to_select : Date.parse(date_to_select)
|
132
|
-
|
139
|
+
date = date_to_select.is_a?(Date) || date_to_select.is_a?(Time) ?
|
140
|
+
date_to_select : Date.parse(date_to_select)
|
141
|
+
|
133
142
|
id_prefix = locate_id_prefix(options) do
|
134
143
|
year_field = FieldByIdLocator.new(@session, dom, /(.*?)_#{DATE_TIME_SUFFIXES[:year]}$/).locate
|
135
144
|
raise NotFoundError.new("No date fields were found") unless year_field && year_field.id =~ /(.*?)_1i/
|
136
145
|
$1
|
137
146
|
end
|
138
|
-
|
147
|
+
|
139
148
|
select date.year, :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:year]}"
|
140
149
|
select date.strftime('%B'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:month]}"
|
141
150
|
select date.day, :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:day]}"
|
@@ -143,9 +152,9 @@ module Webrat
|
|
143
152
|
|
144
153
|
webrat_deprecate :selects_date, :select_date
|
145
154
|
|
146
|
-
# Verifies that time elements (hour, minute) exist on the current page
|
155
|
+
# Verifies that time elements (hour, minute) exist on the current page
|
147
156
|
# with the specified values. You can optionally restrict the search to a specific
|
148
|
-
# time's elements by assigning <tt>options[:from]</tt> the value of the time's
|
157
|
+
# time's elements by assigning <tt>options[:from]</tt> the value of the time's
|
149
158
|
# label. Selects all the time elements with date provided. The time provided may
|
150
159
|
# be a string or a Time object.
|
151
160
|
#
|
@@ -155,28 +164,28 @@ module Webrat
|
|
155
164
|
#
|
156
165
|
# Note: Just like Rails' time_select helper this assumes the form is using
|
157
166
|
# 24 hour select boxes, and not 12 hours with AM/PM.
|
158
|
-
#
|
167
|
+
#
|
159
168
|
# Examples:
|
160
169
|
# select_time "9:30"
|
161
170
|
# select_date "3:30PM", :from => "Party Time"
|
162
171
|
# select_date Time.parse("10:00PM"), :from => "Event"
|
163
172
|
# select_date "10:30AM", :id_prefix => 'meeting'
|
164
173
|
def select_time(time_to_select, options ={})
|
165
|
-
time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
|
174
|
+
time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
|
166
175
|
|
167
176
|
id_prefix = locate_id_prefix(options) do
|
168
177
|
hour_field = FieldByIdLocator.new(@session, dom, /(.*?)_#{DATE_TIME_SUFFIXES[:hour]}$/).locate
|
169
178
|
raise NotFoundError.new("No time fields were found") unless hour_field && hour_field.id =~ /(.*?)_4i/
|
170
179
|
$1
|
171
180
|
end
|
172
|
-
|
181
|
+
|
173
182
|
select time.hour.to_s.rjust(2,'0'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:hour]}"
|
174
183
|
select time.min.to_s.rjust(2,'0'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:minute]}"
|
175
184
|
end
|
176
185
|
|
177
186
|
webrat_deprecate :selects_time, :select_time
|
178
|
-
|
179
|
-
# Verifies and selects all the date and time elements on the current page.
|
187
|
+
|
188
|
+
# Verifies and selects all the date and time elements on the current page.
|
180
189
|
# See #select_time and #select_date for more details and available options.
|
181
190
|
#
|
182
191
|
# Examples:
|
@@ -185,39 +194,48 @@ module Webrat
|
|
185
194
|
# select_datetime Time.parse("December 25, 2000 15:30"), :from => "Event"
|
186
195
|
# select_datetime "April 26, 1982 5:50PM", :id_prefix => 'birthday'
|
187
196
|
def select_datetime(time_to_select, options ={})
|
188
|
-
time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
|
189
|
-
|
197
|
+
time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
|
198
|
+
|
190
199
|
options[:id_prefix] ||= (options[:from] ? FieldByIdLocator.new(@session, dom, options[:from]).locate : nil)
|
191
|
-
|
200
|
+
|
192
201
|
select_date time, options
|
193
202
|
select_time time, options
|
194
203
|
end
|
195
204
|
|
196
205
|
webrat_deprecate :selects_datetime, :select_datetime
|
197
|
-
|
206
|
+
|
198
207
|
# Verifies that an input file field exists on the current page and sets
|
199
208
|
# its value to the given +file+, so that the file will be uploaded
|
200
209
|
# along with the form. An optional <tt>content_type</tt> may be given.
|
201
210
|
#
|
202
211
|
# Example:
|
203
|
-
#
|
204
|
-
#
|
212
|
+
# attach_file "Resume", "/path/to/the/resume.txt"
|
213
|
+
# attach_file "Photo", "/path/to/the/image.png", "image/png"
|
205
214
|
def attach_file(field_locator, path, content_type = nil)
|
206
215
|
locate_field(field_locator, FileField).set(path, content_type)
|
207
216
|
end
|
208
217
|
|
209
218
|
webrat_deprecate :attaches_file, :attach_file
|
210
|
-
|
219
|
+
|
220
|
+
# Issues a request for the URL pointed to by an <tt>area</tt> tag
|
221
|
+
# on the current page, follows any redirects, and verifies the
|
222
|
+
# final page load was successful.
|
223
|
+
#
|
224
|
+
# The area used is the first area whose title or id contains the
|
225
|
+
# given +area_name+ (case is ignored).
|
226
|
+
#
|
227
|
+
# Example:
|
228
|
+
# click_area 'Australia'
|
211
229
|
def click_area(area_name)
|
212
230
|
find_area(area_name).click
|
213
231
|
end
|
214
|
-
|
232
|
+
|
215
233
|
webrat_deprecate :clicks_area, :click_area
|
216
|
-
|
234
|
+
|
217
235
|
# Issues a request for the URL pointed to by a link on the current page,
|
218
236
|
# follows any redirects, and verifies the final page load was successful.
|
219
|
-
#
|
220
|
-
# click_link has very basic support for detecting Rails-generated
|
237
|
+
#
|
238
|
+
# click_link has very basic support for detecting Rails-generated
|
221
239
|
# JavaScript onclick handlers for PUT, POST and DELETE links, as well as
|
222
240
|
# CSRF authenticity tokens if they are present.
|
223
241
|
#
|
@@ -225,15 +243,15 @@ module Webrat
|
|
225
243
|
#
|
226
244
|
# Passing a :method in the options hash overrides the HTTP method used
|
227
245
|
# for making the link request
|
228
|
-
#
|
246
|
+
#
|
229
247
|
# It will try to find links by (in order of precedence):
|
230
248
|
# innerHTML, with simple handling
|
231
249
|
# title
|
232
250
|
# id
|
233
|
-
#
|
251
|
+
#
|
234
252
|
# innerHTML and title are matchable by text subtring or Regexp
|
235
253
|
# id is matchable by full text equality or Regexp
|
236
|
-
#
|
254
|
+
#
|
237
255
|
# Example:
|
238
256
|
# click_link "Sign up"
|
239
257
|
# click_link "Sign up", :javascript => false
|
@@ -243,7 +261,7 @@ module Webrat
|
|
243
261
|
end
|
244
262
|
|
245
263
|
webrat_deprecate :clicks_link, :click_link
|
246
|
-
|
264
|
+
|
247
265
|
# Verifies that a submit button exists for the form, then submits the form, follows
|
248
266
|
# any redirects, and verifies the final page was successful.
|
249
267
|
#
|
@@ -258,48 +276,50 @@ module Webrat
|
|
258
276
|
end
|
259
277
|
|
260
278
|
webrat_deprecate :clicks_button, :click_button
|
261
|
-
|
279
|
+
|
280
|
+
# Submit the form with the given id.
|
281
|
+
#
|
282
|
+
# Note that +click_button+ is usually preferrable for simulating
|
283
|
+
# form submissions, as you may specify part of the button text
|
284
|
+
# rather than the form id.
|
285
|
+
#
|
286
|
+
# Example:
|
287
|
+
# submit_form 'login'
|
262
288
|
def submit_form(id)
|
263
289
|
FormLocator.new(@session, dom, id).locate.submit
|
264
290
|
end
|
265
|
-
|
291
|
+
|
266
292
|
def dom # :nodoc:
|
267
293
|
return @dom if @dom
|
268
|
-
|
294
|
+
|
269
295
|
if @selector
|
270
296
|
@dom = scoped_dom
|
271
297
|
else
|
272
298
|
@dom = page_dom
|
273
299
|
end
|
274
|
-
|
300
|
+
|
275
301
|
return @dom
|
276
302
|
end
|
277
|
-
|
303
|
+
|
278
304
|
protected
|
279
|
-
|
305
|
+
|
280
306
|
def page_dom #:nodoc:
|
281
307
|
return @response.dom if @response.respond_to?(:dom)
|
282
|
-
|
308
|
+
|
283
309
|
if @session.xml_content_type?
|
284
310
|
dom = Webrat::XML.xml_document(@response_body)
|
285
311
|
else
|
286
312
|
dom = Webrat::XML.html_document(@response_body)
|
287
313
|
end
|
288
|
-
|
314
|
+
|
289
315
|
Webrat.define_dom_method(@response, dom)
|
290
316
|
return dom
|
291
317
|
end
|
292
|
-
|
293
|
-
def scoped_dom
|
294
|
-
|
295
|
-
|
296
|
-
if @session.xml_content_type?
|
297
|
-
Webrat::XML.xml_document(source)
|
298
|
-
else
|
299
|
-
Webrat::XML.html_document(source)
|
300
|
-
end
|
318
|
+
|
319
|
+
def scoped_dom
|
320
|
+
Webrat::XML.css_at(@scope.dom, @selector)
|
301
321
|
end
|
302
|
-
|
322
|
+
|
303
323
|
def locate_field(field_locator, *field_types) #:nodoc:
|
304
324
|
if field_locator.is_a?(Field)
|
305
325
|
field_locator
|
@@ -307,10 +327,10 @@ module Webrat
|
|
307
327
|
field(field_locator, *field_types)
|
308
328
|
end
|
309
329
|
end
|
310
|
-
|
330
|
+
|
311
331
|
def locate_id_prefix(options, &location_strategy) #:nodoc:
|
312
332
|
return options[:id_prefix] if options[:id_prefix]
|
313
|
-
|
333
|
+
|
314
334
|
if options[:from]
|
315
335
|
if (label = LabelLocator.new(@session, dom, options[:from]).locate)
|
316
336
|
label.for_id
|
@@ -321,10 +341,10 @@ module Webrat
|
|
321
341
|
yield
|
322
342
|
end
|
323
343
|
end
|
324
|
-
|
344
|
+
|
325
345
|
def forms #:nodoc:
|
326
346
|
@forms ||= Form.load_all(@session, dom)
|
327
347
|
end
|
328
|
-
|
348
|
+
|
329
349
|
end
|
330
350
|
end
|