webrat 0.3.4 → 0.4.0
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 +140 -30
- data/README.rdoc +85 -0
- data/Rakefile +72 -22
- data/install.rb +1 -1
- data/lib/webrat.rb +12 -17
- data/lib/webrat/core.rb +9 -7
- data/lib/webrat/core/configuration.rb +87 -0
- data/lib/webrat/core/{area.rb → elements/area.rb} +7 -20
- data/lib/webrat/core/elements/element.rb +33 -0
- data/lib/webrat/core/elements/field.rb +394 -0
- data/lib/webrat/core/elements/form.rb +103 -0
- data/lib/webrat/core/elements/label.rb +31 -0
- data/lib/webrat/core/{link.rb → elements/link.rb} +15 -26
- data/lib/webrat/core/elements/select_option.rb +35 -0
- data/lib/webrat/core/locators.rb +13 -85
- data/lib/webrat/core/locators/area_locator.rb +38 -0
- data/lib/webrat/core/locators/button_locator.rb +54 -0
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/lib/webrat/core/locators/field_locator.rb +25 -0
- data/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/lib/webrat/core/locators/form_locator.rb +19 -0
- data/lib/webrat/core/locators/label_locator.rb +34 -0
- data/lib/webrat/core/locators/link_locator.rb +66 -0
- data/lib/webrat/core/locators/locator.rb +20 -0
- data/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/lib/webrat/core/logging.rb +5 -9
- data/lib/webrat/core/matchers/have_content.rb +19 -44
- data/lib/webrat/core/matchers/have_selector.rb +15 -2
- data/lib/webrat/core/matchers/have_tag.rb +15 -2
- data/lib/webrat/core/matchers/have_xpath.rb +21 -28
- data/lib/webrat/core/methods.rb +32 -15
- data/lib/webrat/core/mime.rb +3 -3
- data/lib/webrat/core/save_and_open_page.rb +50 -0
- data/lib/webrat/core/scope.rb +183 -41
- data/lib/webrat/core/session.rb +125 -63
- data/lib/webrat/core/xml.rb +115 -0
- data/lib/webrat/core/xml/hpricot.rb +19 -0
- data/lib/webrat/core/xml/nokogiri.rb +76 -0
- data/lib/webrat/core/xml/rexml.rb +24 -0
- data/lib/webrat/core_extensions/deprecate.rb +1 -1
- data/lib/webrat/mechanize.rb +58 -12
- data/lib/webrat/merb.rb +7 -73
- data/lib/webrat/merb_session.rb +65 -0
- data/lib/webrat/rack.rb +1 -1
- data/lib/webrat/rails.rb +56 -55
- data/lib/webrat/rspec-rails.rb +13 -0
- data/lib/webrat/selenium.rb +92 -1
- data/lib/webrat/selenium/matchers.rb +146 -0
- data/lib/webrat/selenium/selenium_session.rb +179 -80
- data/lib/webrat/sinatra.rb +14 -4
- data/vendor/selenium-server.jar +0 -0
- metadata +36 -17
- data/README.txt +0 -90
- data/TODO.txt +0 -10
- data/init.rb +0 -3
- data/lib/webrat/core/field.rb +0 -332
- data/lib/webrat/core/flunk.rb +0 -7
- data/lib/webrat/core/form.rb +0 -130
- data/lib/webrat/core/label.rb +0 -18
- data/lib/webrat/core/nokogiri.rb +0 -44
- data/lib/webrat/core/select_option.rb +0 -29
- data/lib/webrat/rails/redirect_actions.rb +0 -18
@@ -28,12 +28,25 @@ module Webrat
|
|
28
28
|
#
|
29
29
|
# ==== Returns
|
30
30
|
# HaveSelector:: A new have selector matcher.
|
31
|
-
# ---
|
32
|
-
# @api public
|
33
31
|
def have_selector(expected, &block)
|
34
32
|
HaveSelector.new(expected, &block)
|
35
33
|
end
|
36
34
|
alias_method :match_selector, :have_selector
|
37
35
|
|
36
|
+
|
37
|
+
# Asserts that the body of the response contains
|
38
|
+
# the supplied selector
|
39
|
+
def assert_have_selector(expected)
|
40
|
+
hs = HaveSelector.new(expected)
|
41
|
+
assert hs.matches?(response_body), hs.failure_message
|
42
|
+
end
|
43
|
+
|
44
|
+
# Asserts that the body of the response
|
45
|
+
# does not contain the supplied string or regepx
|
46
|
+
def assert_have_no_selector(expected)
|
47
|
+
hs = HaveSelector.new(expected)
|
48
|
+
assert !hs.matches?(response_body), hs.negative_failure_message
|
49
|
+
end
|
50
|
+
|
38
51
|
end
|
39
52
|
end
|
@@ -3,7 +3,6 @@ module Webrat
|
|
3
3
|
module HaveTagMatcher
|
4
4
|
|
5
5
|
class HaveTag < ::Webrat::Matchers::HaveSelector #:nodoc:
|
6
|
-
|
7
6
|
# ==== Returns
|
8
7
|
# String:: The failure message.
|
9
8
|
def failure_message
|
@@ -46,13 +45,27 @@ module Webrat
|
|
46
45
|
|
47
46
|
Nokogiri::CSS::Parser.parse(selector).map { |ast| ast.to_xpath }
|
48
47
|
end
|
49
|
-
|
50
48
|
end
|
51
49
|
|
52
50
|
def have_tag(name, attributes = {}, &block)
|
53
51
|
HaveTag.new([name, attributes], &block)
|
54
52
|
end
|
53
|
+
|
55
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_body), 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_body), ht.negative_failure_message
|
68
|
+
end
|
56
69
|
|
57
70
|
end
|
58
71
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require "webrat/core/xml/nokogiri"
|
2
|
+
require "webrat/core/xml/rexml"
|
3
|
+
|
1
4
|
module Webrat
|
2
5
|
module Matchers
|
3
6
|
|
@@ -8,7 +11,7 @@ module Webrat
|
|
8
11
|
end
|
9
12
|
|
10
13
|
def matches?(stringlike)
|
11
|
-
if
|
14
|
+
if Webrat.configuration.parse_with_nokogiri?
|
12
15
|
matches_nokogiri?(stringlike)
|
13
16
|
else
|
14
17
|
matches_rexml?(stringlike)
|
@@ -16,9 +19,13 @@ module Webrat
|
|
16
19
|
end
|
17
20
|
|
18
21
|
def matches_rexml?(stringlike)
|
19
|
-
|
22
|
+
if REXML::Node === stringlike || Array === stringlike
|
23
|
+
@query = query.map { |q| q.gsub(%r'//', './') }
|
24
|
+
else
|
25
|
+
@query = query
|
26
|
+
end
|
20
27
|
|
21
|
-
@document = rexml_document(stringlike)
|
28
|
+
@document = Webrat.rexml_document(stringlike)
|
22
29
|
|
23
30
|
matched = @query.map do |q|
|
24
31
|
if @document.is_a?(Array)
|
@@ -38,32 +45,10 @@ module Webrat
|
|
38
45
|
@query = query
|
39
46
|
end
|
40
47
|
|
41
|
-
@document = Webrat.
|
48
|
+
@document = Webrat::XML.document(stringlike)
|
42
49
|
matched = @document.xpath(*@query)
|
43
50
|
matched.any? && (!@block || @block.call(matched))
|
44
51
|
end
|
45
|
-
|
46
|
-
def rexml_document(stringlike)
|
47
|
-
stringlike = stringlike.body.to_s if stringlike.respond_to?(:body)
|
48
|
-
|
49
|
-
case stringlike
|
50
|
-
when REXML::Document
|
51
|
-
stringlike.root
|
52
|
-
when REXML::Node, Array
|
53
|
-
@query = query.map { |q| q.gsub(%r'//', './') }
|
54
|
-
stringlike
|
55
|
-
else
|
56
|
-
begin
|
57
|
-
REXML::Document.new(stringlike.to_s).root
|
58
|
-
rescue REXML::ParseException => e
|
59
|
-
if e.message.include?("second root element")
|
60
|
-
REXML::Document.new("<fake-root-element>#{stringlike}</fake-root-element>").root
|
61
|
-
else
|
62
|
-
raise e
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
52
|
|
68
53
|
def query
|
69
54
|
[@expected].flatten.compact
|
@@ -89,12 +74,20 @@ module Webrat
|
|
89
74
|
#
|
90
75
|
# ==== Returns
|
91
76
|
# HaveXpath:: A new have xpath matcher.
|
92
|
-
# ---
|
93
|
-
# @api public
|
94
77
|
def have_xpath(expected, &block)
|
95
78
|
HaveXpath.new(expected, &block)
|
96
79
|
end
|
97
80
|
alias_method :match_xpath, :have_xpath
|
98
81
|
|
82
|
+
def assert_have_xpath(expected, &block)
|
83
|
+
hs = HaveXpath.new(expected, &block)
|
84
|
+
assert hs.matches?(response_body), hs.failure_message
|
85
|
+
end
|
86
|
+
|
87
|
+
def assert_have_no_xpath(expected, &block)
|
88
|
+
hs = HaveXpath.new(expected, &block)
|
89
|
+
assert !hs.matches?(response_body), hs.negative_failure_message
|
90
|
+
end
|
91
|
+
|
99
92
|
end
|
100
93
|
end
|
data/lib/webrat/core/methods.rb
CHANGED
@@ -5,13 +5,20 @@ module Webrat
|
|
5
5
|
meths.each do |meth|
|
6
6
|
self.class_eval <<-RUBY
|
7
7
|
def #{meth}(*args, &blk)
|
8
|
-
|
9
|
-
@_webrat_session.#{meth}(*args, &blk)
|
8
|
+
webrat_session.#{meth}(*args, &blk)
|
10
9
|
end
|
11
10
|
RUBY
|
12
11
|
end
|
13
12
|
end
|
14
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
|
+
|
15
22
|
# all of these methods delegate to the @session, which should
|
16
23
|
# be created transparently.
|
17
24
|
#
|
@@ -23,22 +30,32 @@ module Webrat
|
|
23
30
|
:within,
|
24
31
|
:header, :http_accept, :basic_auth,
|
25
32
|
:save_and_open_page,
|
26
|
-
:fill_in,
|
27
|
-
:check,
|
28
|
-
:uncheck,
|
29
|
-
:choose,
|
30
|
-
:select,
|
31
|
-
:attach_file,
|
32
|
-
:cookies,
|
33
|
-
:response,
|
33
|
+
:fills_in, :fill_in,
|
34
|
+
:checks, :check,
|
35
|
+
:unchecks, :uncheck,
|
36
|
+
:chooses, :choose,
|
37
|
+
:selects, :select,
|
38
|
+
:attaches_file, :attach_file,
|
34
39
|
:current_page,
|
35
40
|
:current_url,
|
36
|
-
:click_link,
|
37
|
-
:click_area,
|
38
|
-
:click_button,
|
41
|
+
:clicks_link, :click_link,
|
42
|
+
:clicks_area, :click_area,
|
43
|
+
:clicks_button, :click_button,
|
39
44
|
:reload, :reloads,
|
40
|
-
:clicks_link_within,
|
41
|
-
:field_labeled
|
45
|
+
:clicks_link_within, :click_link_within,
|
46
|
+
:field_labeled,
|
47
|
+
:select_option,
|
48
|
+
:set_hidden_field, :submit_form,
|
49
|
+
:request_page, :current_dom,
|
50
|
+
:response_body,
|
51
|
+
:selects_date, :selects_time, :selects_datetime,
|
52
|
+
:select_date, :select_time, :select_datetime,
|
53
|
+
:field_by_xpath,
|
54
|
+
:field_with_id,
|
55
|
+
:selenium,
|
56
|
+
:simulate, :automate
|
57
|
+
|
58
|
+
|
42
59
|
|
43
60
|
end
|
44
61
|
end
|
data/lib/webrat/core/mime.rb
CHANGED
@@ -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
@@ -1,11 +1,14 @@
|
|
1
|
-
require "
|
2
|
-
require "webrat/core/form"
|
1
|
+
require "webrat/core/elements/form"
|
3
2
|
require "webrat/core/locators"
|
3
|
+
require "webrat/core_extensions/deprecate"
|
4
4
|
|
5
5
|
module Webrat
|
6
|
+
# An HTML element (link, button, field, etc.) that Webrat expected was not found on the page
|
7
|
+
class NotFoundError < WebratError
|
8
|
+
end
|
9
|
+
|
6
10
|
class Scope
|
7
11
|
include Logging
|
8
|
-
include Flunk
|
9
12
|
include Locators
|
10
13
|
|
11
14
|
def self.from_page(session, response, response_body) #:nodoc:
|
@@ -22,9 +25,15 @@ module Webrat
|
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
28
|
+
attr_reader :session
|
29
|
+
|
25
30
|
def initialize(session, &block) #:nodoc:
|
26
31
|
@session = session
|
27
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
|
28
37
|
end
|
29
38
|
|
30
39
|
# Verifies an input field or textarea exists on the current page, and stores a value for
|
@@ -43,7 +52,17 @@ module Webrat
|
|
43
52
|
field.set(options[:with])
|
44
53
|
end
|
45
54
|
|
46
|
-
|
55
|
+
webrat_deprecate :fills_in, :fill_in
|
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
|
62
|
+
def set_hidden_field(field_locator, options = {})
|
63
|
+
field = locate_field(field_locator, HiddenField)
|
64
|
+
field.set(options[:to])
|
65
|
+
end
|
47
66
|
|
48
67
|
# Verifies that an input checkbox exists on the current page and marks it
|
49
68
|
# as checked, so that the value will be submitted with the form.
|
@@ -54,7 +73,7 @@ module Webrat
|
|
54
73
|
locate_field(field_locator, CheckboxField).check
|
55
74
|
end
|
56
75
|
|
57
|
-
|
76
|
+
webrat_deprecate :checks, :check
|
58
77
|
|
59
78
|
# Verifies that an input checkbox exists on the current page and marks it
|
60
79
|
# as unchecked, so that the value will not be submitted with the form.
|
@@ -65,7 +84,7 @@ module Webrat
|
|
65
84
|
locate_field(field_locator, CheckboxField).uncheck
|
66
85
|
end
|
67
86
|
|
68
|
-
|
87
|
+
webrat_deprecate :unchecks, :uncheck
|
69
88
|
|
70
89
|
# Verifies that an input radio button exists on the current page and marks it
|
71
90
|
# as checked, so that the value will be submitted with the form.
|
@@ -76,7 +95,7 @@ module Webrat
|
|
76
95
|
locate_field(field_locator, RadioField).choose
|
77
96
|
end
|
78
97
|
|
79
|
-
|
98
|
+
webrat_deprecate :chooses, :choose
|
80
99
|
|
81
100
|
# Verifies that a an option element exists on the current page with the specified
|
82
101
|
# text. You can optionally restrict the search to a specific select list by
|
@@ -84,14 +103,106 @@ module Webrat
|
|
84
103
|
# a label. Stores the option's value to be sent when the form is submitted.
|
85
104
|
#
|
86
105
|
# Examples:
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
def
|
91
|
-
|
106
|
+
# select "January"
|
107
|
+
# select "February", :from => "event_month"
|
108
|
+
# select "February", :from => "Event Month"
|
109
|
+
def select(option_text, options = {})
|
110
|
+
select_option(option_text, options[:from]).choose
|
92
111
|
end
|
93
112
|
|
94
|
-
|
113
|
+
webrat_deprecate :selects, :select
|
114
|
+
|
115
|
+
DATE_TIME_SUFFIXES = {
|
116
|
+
:year => '1i',
|
117
|
+
:month => '2i',
|
118
|
+
:day => '3i',
|
119
|
+
:hour => '4i',
|
120
|
+
:minute => '5i'
|
121
|
+
}
|
122
|
+
|
123
|
+
# Verifies that date elements (year, month, day) exist on the current page
|
124
|
+
# with the specified values. You can optionally restrict the search to a specific
|
125
|
+
# date's elements by assigning <tt>options[:from]</tt> the value of the date's
|
126
|
+
# label. Selects all the date elements with date provided. The date provided may
|
127
|
+
# be a string or a Date/Time object.
|
128
|
+
#
|
129
|
+
# Rail's convention is used for detecting the date elements. All elements
|
130
|
+
# are assumed to have a shared prefix. You may also specify the prefix
|
131
|
+
# by assigning <tt>options[:id_prefix]</tt>.
|
132
|
+
#
|
133
|
+
# Examples:
|
134
|
+
# select_date "January 23, 2004"
|
135
|
+
# select_date "April 26, 1982", :from => "Birthday"
|
136
|
+
# select_date Date.parse("December 25, 2000"), :from => "Event"
|
137
|
+
# select_date "April 26, 1982", :id_prefix => 'birthday'
|
138
|
+
def select_date(date_to_select, options ={})
|
139
|
+
date = date_to_select.is_a?(Date) || date_to_select.is_a?(Time) ?
|
140
|
+
date_to_select : Date.parse(date_to_select)
|
141
|
+
|
142
|
+
id_prefix = locate_id_prefix(options) do
|
143
|
+
year_field = FieldByIdLocator.new(@session, dom, /(.*?)_#{DATE_TIME_SUFFIXES[:year]}$/).locate
|
144
|
+
raise NotFoundError.new("No date fields were found") unless year_field && year_field.id =~ /(.*?)_1i/
|
145
|
+
$1
|
146
|
+
end
|
147
|
+
|
148
|
+
select date.year, :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:year]}"
|
149
|
+
select date.strftime('%B'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:month]}"
|
150
|
+
select date.day, :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:day]}"
|
151
|
+
end
|
152
|
+
|
153
|
+
webrat_deprecate :selects_date, :select_date
|
154
|
+
|
155
|
+
# Verifies that time elements (hour, minute) exist on the current page
|
156
|
+
# with the specified values. You can optionally restrict the search to a specific
|
157
|
+
# time's elements by assigning <tt>options[:from]</tt> the value of the time's
|
158
|
+
# label. Selects all the time elements with date provided. The time provided may
|
159
|
+
# be a string or a Time object.
|
160
|
+
#
|
161
|
+
# Rail's convention is used for detecting the time elements. All elements are
|
162
|
+
# assumed to have a shared prefix. You may specify the prefix by assigning
|
163
|
+
# <tt>options[:id_prefix]</tt>.
|
164
|
+
#
|
165
|
+
# Note: Just like Rails' time_select helper this assumes the form is using
|
166
|
+
# 24 hour select boxes, and not 12 hours with AM/PM.
|
167
|
+
#
|
168
|
+
# Examples:
|
169
|
+
# select_time "9:30"
|
170
|
+
# select_date "3:30PM", :from => "Party Time"
|
171
|
+
# select_date Time.parse("10:00PM"), :from => "Event"
|
172
|
+
# select_date "10:30AM", :id_prefix => 'meeting'
|
173
|
+
def select_time(time_to_select, options ={})
|
174
|
+
time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
|
175
|
+
|
176
|
+
id_prefix = locate_id_prefix(options) do
|
177
|
+
hour_field = FieldByIdLocator.new(@session, dom, /(.*?)_#{DATE_TIME_SUFFIXES[:hour]}$/).locate
|
178
|
+
raise NotFoundError.new("No time fields were found") unless hour_field && hour_field.id =~ /(.*?)_4i/
|
179
|
+
$1
|
180
|
+
end
|
181
|
+
|
182
|
+
select time.hour.to_s.rjust(2,'0'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:hour]}"
|
183
|
+
select time.min.to_s.rjust(2,'0'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:minute]}"
|
184
|
+
end
|
185
|
+
|
186
|
+
webrat_deprecate :selects_time, :select_time
|
187
|
+
|
188
|
+
# Verifies and selects all the date and time elements on the current page.
|
189
|
+
# See #select_time and #select_date for more details and available options.
|
190
|
+
#
|
191
|
+
# Examples:
|
192
|
+
# select_datetime "January 23, 2004 10:30AM"
|
193
|
+
# select_datetime "April 26, 1982 7:00PM", :from => "Birthday"
|
194
|
+
# select_datetime Time.parse("December 25, 2000 15:30"), :from => "Event"
|
195
|
+
# select_datetime "April 26, 1982 5:50PM", :id_prefix => 'birthday'
|
196
|
+
def select_datetime(time_to_select, options ={})
|
197
|
+
time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
|
198
|
+
|
199
|
+
options[:id_prefix] ||= (options[:from] ? FieldByIdLocator.new(@session, dom, options[:from]).locate : nil)
|
200
|
+
|
201
|
+
select_date time, options
|
202
|
+
select_time time, options
|
203
|
+
end
|
204
|
+
|
205
|
+
webrat_deprecate :selects_datetime, :select_datetime
|
95
206
|
|
96
207
|
# Verifies that an input file field exists on the current page and sets
|
97
208
|
# its value to the given +file+, so that the file will be uploaded
|
@@ -104,13 +215,22 @@ module Webrat
|
|
104
215
|
locate_field(field_locator, FileField).set(path, content_type)
|
105
216
|
end
|
106
217
|
|
107
|
-
|
108
|
-
|
218
|
+
webrat_deprecate :attaches_file, :attach_file
|
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'
|
109
229
|
def click_area(area_name)
|
110
230
|
find_area(area_name).click
|
111
231
|
end
|
112
232
|
|
113
|
-
|
233
|
+
webrat_deprecate :clicks_area, :click_area
|
114
234
|
|
115
235
|
# Issues a request for the URL pointed to by a link on the current page,
|
116
236
|
# follows any redirects, and verifies the final page load was successful.
|
@@ -124,17 +244,23 @@ module Webrat
|
|
124
244
|
# Passing a :method in the options hash overrides the HTTP method used
|
125
245
|
# for making the link request
|
126
246
|
#
|
247
|
+
# It will try to find links by (in order of precedence):
|
248
|
+
# innerHTML, with simple handling
|
249
|
+
# title
|
250
|
+
# id
|
251
|
+
#
|
252
|
+
# innerHTML and title are matchable by text subtring or Regexp
|
253
|
+
# id is matchable by full text equality or Regexp
|
254
|
+
#
|
127
255
|
# Example:
|
128
256
|
# click_link "Sign up"
|
129
|
-
#
|
130
257
|
# click_link "Sign up", :javascript => false
|
131
|
-
#
|
132
258
|
# click_link "Sign up", :method => :put
|
133
|
-
def click_link(
|
134
|
-
find_link(
|
259
|
+
def click_link(text_or_title_or_id, options = {})
|
260
|
+
find_link(text_or_title_or_id).click(options)
|
135
261
|
end
|
136
262
|
|
137
|
-
|
263
|
+
webrat_deprecate :clicks_link, :click_link
|
138
264
|
|
139
265
|
# Verifies that a submit button exists for the form, then submits the form, follows
|
140
266
|
# any redirects, and verifies the final page was successful.
|
@@ -149,7 +275,19 @@ module Webrat
|
|
149
275
|
find_button(value).click
|
150
276
|
end
|
151
277
|
|
152
|
-
|
278
|
+
webrat_deprecate :clicks_button, :click_button
|
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'
|
288
|
+
def submit_form(id)
|
289
|
+
FormLocator.new(@session, dom, id).locate.submit
|
290
|
+
end
|
153
291
|
|
154
292
|
def dom # :nodoc:
|
155
293
|
return @dom if @dom
|
@@ -164,16 +302,22 @@ module Webrat
|
|
164
302
|
end
|
165
303
|
|
166
304
|
protected
|
167
|
-
|
305
|
+
|
168
306
|
def page_dom #:nodoc:
|
169
307
|
return @response.dom if @response.respond_to?(:dom)
|
170
|
-
|
308
|
+
|
309
|
+
if @session.xml_content_type?
|
310
|
+
dom = Webrat::XML.xml_document(@response_body)
|
311
|
+
else
|
312
|
+
dom = Webrat::XML.html_document(@response_body)
|
313
|
+
end
|
314
|
+
|
171
315
|
Webrat.define_dom_method(@response, dom)
|
172
316
|
return dom
|
173
317
|
end
|
174
318
|
|
175
|
-
def scoped_dom
|
176
|
-
Webrat.
|
319
|
+
def scoped_dom
|
320
|
+
Webrat::XML.css_at(@scope.dom, @selector)
|
177
321
|
end
|
178
322
|
|
179
323
|
def locate_field(field_locator, *field_types) #:nodoc:
|
@@ -184,25 +328,23 @@ module Webrat
|
|
184
328
|
end
|
185
329
|
end
|
186
330
|
|
187
|
-
def
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
331
|
+
def locate_id_prefix(options, &location_strategy) #:nodoc:
|
332
|
+
return options[:id_prefix] if options[:id_prefix]
|
333
|
+
|
334
|
+
if options[:from]
|
335
|
+
if (label = LabelLocator.new(@session, dom, options[:from]).locate)
|
336
|
+
label.for_id
|
337
|
+
else
|
338
|
+
raise NotFoundError.new("Could not find the label with text #{options[:from]}")
|
339
|
+
end
|
340
|
+
else
|
341
|
+
yield
|
196
342
|
end
|
197
343
|
end
|
198
344
|
|
199
345
|
def forms #:nodoc:
|
200
|
-
|
201
|
-
|
202
|
-
@forms = dom.search("form").map do |form_element|
|
203
|
-
Form.new(@session, form_element)
|
204
|
-
end
|
346
|
+
@forms ||= Form.load_all(@session, dom)
|
205
347
|
end
|
206
348
|
|
207
349
|
end
|
208
|
-
end
|
350
|
+
end
|