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.
Files changed (70) hide show
  1. data/History.txt +158 -19
  2. data/Rakefile +36 -11
  3. data/lib/webrat.rb +8 -11
  4. data/lib/webrat/core/configuration.rb +67 -25
  5. data/lib/webrat/core/elements/area.rb +7 -7
  6. data/lib/webrat/core/elements/element.rb +11 -11
  7. data/lib/webrat/core/elements/field.rb +70 -51
  8. data/lib/webrat/core/elements/form.rb +17 -17
  9. data/lib/webrat/core/elements/label.rb +8 -8
  10. data/lib/webrat/core/elements/link.rb +13 -11
  11. data/lib/webrat/core/elements/select_option.rb +9 -9
  12. data/lib/webrat/core/locators.rb +2 -2
  13. data/lib/webrat/core/locators/area_locator.rb +10 -10
  14. data/lib/webrat/core/locators/button_locator.rb +13 -13
  15. data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
  16. data/lib/webrat/core/locators/field_labeled_locator.rb +19 -13
  17. data/lib/webrat/core/locators/field_locator.rb +7 -7
  18. data/lib/webrat/core/locators/field_named_locator.rb +10 -10
  19. data/lib/webrat/core/locators/form_locator.rb +6 -6
  20. data/lib/webrat/core/locators/label_locator.rb +9 -9
  21. data/lib/webrat/core/locators/link_locator.rb +12 -12
  22. data/lib/webrat/core/locators/locator.rb +5 -5
  23. data/lib/webrat/core/locators/select_option_locator.rb +11 -11
  24. data/lib/webrat/core/logging.rb +7 -4
  25. data/lib/webrat/core/matchers/have_content.rb +19 -15
  26. data/lib/webrat/core/matchers/have_selector.rb +44 -22
  27. data/lib/webrat/core/matchers/have_tag.rb +11 -61
  28. data/lib/webrat/core/matchers/have_xpath.rb +89 -35
  29. data/lib/webrat/core/methods.rb +13 -11
  30. data/lib/webrat/core/mime.rb +3 -3
  31. data/lib/webrat/core/save_and_open_page.rb +9 -9
  32. data/lib/webrat/core/scope.rb +82 -62
  33. data/lib/webrat/core/session.rb +61 -18
  34. data/lib/webrat/core/xml.rb +16 -16
  35. data/lib/webrat/core/xml/hpricot.rb +3 -3
  36. data/lib/webrat/core/xml/nokogiri.rb +14 -14
  37. data/lib/webrat/core/xml/rexml.rb +3 -3
  38. data/lib/webrat/core_extensions/blank.rb +1 -1
  39. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  40. data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
  41. data/lib/webrat/core_extensions/meta_class.rb +1 -1
  42. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  43. data/lib/webrat/mechanize.rb +9 -9
  44. data/lib/webrat/merb.rb +5 -61
  45. data/lib/webrat/merb_session.rb +67 -0
  46. data/lib/webrat/rack.rb +45 -14
  47. data/lib/webrat/rails.rb +31 -11
  48. data/lib/webrat/rspec-rails.rb +2 -2
  49. data/lib/webrat/selenium.rb +27 -39
  50. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  51. data/lib/webrat/selenium/application_servers.rb +5 -0
  52. data/lib/webrat/selenium/application_servers/base.rb +44 -0
  53. data/lib/webrat/selenium/application_servers/external.rb +24 -0
  54. data/lib/webrat/selenium/application_servers/merb.rb +48 -0
  55. data/lib/webrat/selenium/application_servers/rails.rb +42 -0
  56. data/lib/webrat/selenium/application_servers/sinatra.rb +35 -0
  57. data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
  58. data/lib/webrat/selenium/location_strategy_javascript/label.js +1 -2
  59. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
  60. data/lib/webrat/selenium/matchers.rb +4 -108
  61. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  62. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  63. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  64. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  65. data/lib/webrat/selenium/selenium_rc_server.rb +84 -0
  66. data/lib/webrat/selenium/selenium_session.rb +86 -68
  67. data/lib/webrat/selenium/silence_stream.rb +18 -0
  68. metadata +21 -16
  69. data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +0 -131
  70. 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
- matches_nokogiri?(stringlike)
27
+ nokogiri_matches(stringlike)
16
28
  else
17
- matches_rexml?(stringlike)
29
+ rexml_matches(stringlike)
18
30
  end
19
31
  end
20
-
21
- def matches_rexml?(stringlike)
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
- matched = @query.map do |q|
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 matches_nokogiri?(stringlike)
52
+
53
+ def nokogiri_matches(stringlike)
42
54
  if Nokogiri::XML::NodeSet === stringlike
43
- @query = query.map { |q| q.gsub(%r'//', './') }
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
- matched = @document.xpath(*@query)
50
- matched.any? && (!@block || @block.call(matched))
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
- [@expected].flatten.compact
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
- raise Test::Unit::AssertionFailedError.new(hs.failure_message) unless hs.matches?(response_body)
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
- raise Test::Unit::AssertionFailedError.new(hs.negative_failure_message) if hs.matches?(response_body)
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
@@ -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.session_class.new(self)
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
@@ -1,6 +1,6 @@
1
1
  module Webrat #:nodoc:
2
2
  module MIME #:nodoc:
3
-
3
+
4
4
  def self.mime_type(string_or_symbol) #:nodoc:
5
5
  if string_or_symbol.is_a?(String)
6
6
  string_or_symbol
@@ -24,6 +24,6 @@ module Webrat #:nodoc:
24
24
  end
25
25
  end
26
26
  end
27
-
27
+
28
28
  end
29
- end
29
+ end
@@ -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
@@ -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
- # attaches_file "Resume", "/path/to/the/resume.txt"
204
- # attaches_file "Photo", "/path/to/the/image.png", "image/png"
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 &nbsp; 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 #:nodoc:
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
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