davidtrogers-webrat 0.4.4.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/.gitignore +3 -1
  2. data/Gemfile +19 -0
  3. data/History.txt +99 -9
  4. data/Rakefile +141 -207
  5. data/Thorfile +118 -0
  6. data/lib/webrat.rb +10 -23
  7. data/lib/webrat/{mechanize.rb → adapters/mechanize.rb} +6 -2
  8. data/lib/webrat/adapters/merb.rb +11 -0
  9. data/lib/webrat/adapters/rack.rb +25 -0
  10. data/lib/webrat/{rails.rb → adapters/rails.rb} +5 -37
  11. data/lib/webrat/adapters/sinatra.rb +9 -0
  12. data/lib/webrat/core.rb +0 -1
  13. data/lib/webrat/core/configuration.rb +22 -18
  14. data/lib/webrat/core/elements/area.rb +2 -2
  15. data/lib/webrat/core/elements/element.rb +3 -3
  16. data/lib/webrat/core/elements/field.rb +113 -31
  17. data/lib/webrat/core/elements/form.rb +4 -4
  18. data/lib/webrat/core/elements/label.rb +4 -4
  19. data/lib/webrat/core/elements/link.rb +8 -7
  20. data/lib/webrat/core/elements/select_option.rb +15 -2
  21. data/lib/webrat/core/locators.rb +1 -1
  22. data/lib/webrat/core/locators/area_locator.rb +3 -3
  23. data/lib/webrat/core/locators/button_locator.rb +6 -6
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +3 -3
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +2 -2
  26. data/lib/webrat/core/locators/field_named_locator.rb +3 -3
  27. data/lib/webrat/core/locators/form_locator.rb +1 -1
  28. data/lib/webrat/core/locators/label_locator.rb +2 -2
  29. data/lib/webrat/core/locators/link_locator.rb +16 -8
  30. data/lib/webrat/core/locators/select_option_locator.rb +5 -5
  31. data/lib/webrat/core/logging.rb +4 -5
  32. data/lib/webrat/core/matchers/have_content.rb +3 -8
  33. data/lib/webrat/core/matchers/have_xpath.rb +3 -28
  34. data/lib/webrat/core/methods.rb +5 -4
  35. data/lib/webrat/core/mime.rb +11 -22
  36. data/lib/webrat/core/save_and_open_page.rb +7 -29
  37. data/lib/webrat/core/scope.rb +17 -2
  38. data/lib/webrat/core/session.rb +31 -19
  39. data/lib/webrat/core/xml.rb +41 -84
  40. data/lib/webrat/integrations/merb.rb +10 -0
  41. data/lib/webrat/integrations/rails.rb +25 -0
  42. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  43. data/lib/webrat/integrations/selenium.rb +11 -0
  44. data/lib/webrat/rspec-rails.rb +2 -13
  45. data/lib/webrat/selenium.rb +0 -11
  46. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  47. data/lib/webrat/selenium/application_servers.rb +5 -0
  48. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  49. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  50. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  51. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  52. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  53. data/lib/webrat/selenium/location_strategy_javascript/label.js +30 -3
  54. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +1 -0
  55. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +24 -4
  56. data/lib/webrat/selenium/matchers/have_content.rb +22 -10
  57. data/lib/webrat/selenium/matchers/have_selector.rb +8 -0
  58. data/lib/webrat/selenium/matchers/have_xpath.rb +8 -0
  59. data/lib/webrat/selenium/selenium_rc_server.rb +8 -6
  60. data/lib/webrat/selenium/selenium_session.rb +43 -14
  61. data/lib/webrat/selenium/silence_stream.rb +2 -2
  62. data/spec/fakes/{test_session.rb → test_adapter.rb} +4 -5
  63. data/spec/integration/mechanize/Rakefile +7 -0
  64. data/spec/integration/mechanize/config.ru +2 -0
  65. data/spec/integration/mechanize/sample_app.rb +20 -0
  66. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  67. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  68. data/spec/integration/merb/app/controllers/testing.rb +9 -0
  69. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  70. data/spec/integration/merb/config/router.rb +1 -0
  71. data/spec/integration/merb/spec/spec_helper.rb +2 -0
  72. data/spec/integration/merb/spec/webrat_spec.rb +7 -0
  73. data/spec/integration/rack/app.rb +89 -0
  74. data/spec/integration/rack/test/helper.rb +21 -0
  75. data/spec/integration/rack/test/webrat_rack_test.rb +57 -51
  76. data/spec/integration/rails/app/controllers/{application.rb → application_controller.rb} +0 -0
  77. data/spec/integration/rails/app/controllers/webrat_controller.rb +16 -9
  78. data/spec/integration/rails/app/views/buttons/show.html.erb +0 -2
  79. data/spec/integration/rails/app/views/links/show.html.erb +2 -1
  80. data/spec/integration/rails/app/views/webrat/buttons.html.erb +0 -2
  81. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  82. data/spec/integration/rails/config/environment.rb +1 -1
  83. data/spec/integration/rails/config/routes.rb +2 -0
  84. data/spec/integration/rails/test/integration/button_click_test.rb +12 -26
  85. data/spec/integration/rails/test/integration/fill_in_test.rb +1 -1
  86. data/spec/integration/rails/test/integration/link_click_test.rb +8 -2
  87. data/spec/integration/rails/test/integration/webrat_test.rb +53 -5
  88. data/spec/integration/rails/test/test_helper.rb +7 -5
  89. data/spec/integration/sinatra/test/test_helper.rb +3 -2
  90. data/spec/private/core/configuration_spec.rb +8 -27
  91. data/spec/private/core/field_spec.rb +14 -16
  92. data/spec/private/core/link_spec.rb +1 -1
  93. data/spec/private/core/session_spec.rb +23 -26
  94. data/spec/private/mechanize/{mechanize_session_spec.rb → mechanize_adapter_spec.rb} +4 -12
  95. data/spec/private/nokogiri_spec.rb +2 -2
  96. data/spec/private/rails/{rails_session_spec.rb → rails_adapter_spec.rb} +11 -42
  97. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  98. data/spec/public/basic_auth_spec.rb +13 -2
  99. data/spec/public/click_button_spec.rb +10 -12
  100. data/spec/public/click_link_spec.rb +21 -0
  101. data/spec/public/fill_in_spec.rb +15 -0
  102. data/spec/public/matchers/contain_spec.rb +12 -19
  103. data/spec/public/matchers/have_selector_spec.rb +6 -2
  104. data/spec/public/matchers/have_xpath_spec.rb +3 -3
  105. data/spec/public/save_and_open_spec.rb +15 -17
  106. data/spec/public/select_spec.rb +232 -26
  107. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  108. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  109. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  110. data/spec/spec_helper.rb +5 -1
  111. data/vendor/selenium-server.jar +0 -0
  112. metadata +119 -69
  113. data/.dotest/0001 +0 -34
  114. data/.dotest/0002 +0 -34
  115. data/.dotest/binary +0 -1
  116. data/.dotest/final-commit +0 -1
  117. data/.dotest/head-name +0 -1
  118. data/.dotest/info +0 -5
  119. data/.dotest/keep +0 -1
  120. data/.dotest/last +0 -1
  121. data/.dotest/msg +0 -0
  122. data/.dotest/msg-clean +0 -0
  123. data/.dotest/next +0 -1
  124. data/.dotest/onto +0 -1
  125. data/.dotest/orig-head +0 -1
  126. data/.dotest/patch +0 -29
  127. data/.dotest/sign +0 -1
  128. data/.dotest/utf8 +0 -1
  129. data/.dotest/whitespace +0 -1
  130. data/VERSION +0 -1
  131. data/lib/webrat/core/xml/hpricot.rb +0 -19
  132. data/lib/webrat/core/xml/nokogiri.rb +0 -76
  133. data/lib/webrat/core/xml/rexml.rb +0 -24
  134. data/lib/webrat/merb_session.rb +0 -65
  135. data/lib/webrat/rack.rb +0 -24
  136. data/lib/webrat/rack_test.rb +0 -32
  137. data/lib/webrat/selenium/application_server.rb +0 -73
  138. data/lib/webrat/selenium/merb_application_server.rb +0 -48
  139. data/lib/webrat/selenium/rails_application_server.rb +0 -42
  140. data/lib/webrat/selenium/sinatra_application_server.rb +0 -35
  141. data/lib/webrat/sinatra.rb +0 -44
  142. data/spec/integration/rack/rack_app.rb +0 -16
  143. data/spec/integration/rack/test/test_helper.rb +0 -20
  144. data/spec/private/core/logging_spec.rb +0 -10
  145. data/spec/private/merb/merb_session_spec.rb +0 -42
@@ -20,24 +20,24 @@ module Webrat
20
20
  end
21
21
 
22
22
  def matches_id?(element)
23
- (@value.is_a?(Regexp) && Webrat::XML.attribute(element, "id") =~ @value) ||
24
- (!@value.is_a?(Regexp) && Webrat::XML.attribute(element, "id") == @value.to_s)
23
+ (@value.is_a?(Regexp) && element["id"] =~ @value) ||
24
+ (!@value.is_a?(Regexp) && element["id"] == @value.to_s)
25
25
  end
26
26
 
27
27
  def matches_value?(element)
28
- Webrat::XML.attribute(element, "value") =~ /^\W*#{Regexp.escape(@value.to_s)}/i
28
+ element["value"] =~ /^\W*#{Regexp.escape(@value.to_s)}/i
29
29
  end
30
30
 
31
31
  def matches_html?(element)
32
- Webrat::XML.inner_html(element) =~ /#{Regexp.escape(@value.to_s)}/i
32
+ element.inner_html =~ /#{Regexp.escape(@value.to_s)}/i
33
33
  end
34
34
 
35
35
  def matches_alt?(element)
36
- Webrat::XML.attribute(element, "alt") =~ /^\W*#{Regexp.escape(@value.to_s)}/i
36
+ element["alt"] =~ /^\W*#{Regexp.escape(@value.to_s)}/i
37
37
  end
38
38
 
39
39
  def button_elements
40
- Webrat::XML.xpath_search(@dom, *ButtonField.xpath_search)
40
+ @dom.xpath(*ButtonField.xpath_search)
41
41
  end
42
42
 
43
43
  def error_message
@@ -12,15 +12,15 @@ module Webrat
12
12
  def field_element
13
13
  field_elements.detect do |field_element|
14
14
  if @value.is_a?(Regexp)
15
- Webrat::XML.attribute(field_element, "id") =~ @value
15
+ field_element["id"] =~ @value
16
16
  else
17
- Webrat::XML.attribute(field_element, "id") == @value.to_s
17
+ field_element["id"] == @value.to_s
18
18
  end
19
19
  end
20
20
  end
21
21
 
22
22
  def field_elements
23
- Webrat::XML.xpath_search(@dom, *Field.xpath_search)
23
+ @dom.xpath(*Field.xpath_search)
24
24
  end
25
25
 
26
26
  def error_message
@@ -25,7 +25,7 @@ module Webrat
25
25
  end
26
26
 
27
27
  def label_elements
28
- Webrat::XML.xpath_search(@dom, Label.xpath_search)
28
+ @dom.xpath(*Label.xpath_search)
29
29
  end
30
30
 
31
31
  def error_message
@@ -33,7 +33,7 @@ module Webrat
33
33
  end
34
34
 
35
35
  def text(element)
36
- str = Webrat::XML.all_inner_text(element)
36
+ str = element.inner_text
37
37
  str.gsub!("\n","")
38
38
  str.strip!
39
39
  str.squeeze!(" ")
@@ -11,19 +11,19 @@ module Webrat
11
11
 
12
12
  def field_element
13
13
  field_elements.detect do |field_element|
14
- Webrat::XML.attribute(field_element, "name") == @value.to_s
14
+ field_element["name"] == @value.to_s
15
15
  end
16
16
  end
17
17
 
18
18
  def field_elements
19
- Webrat::XML.xpath_search(@dom, *xpath_searches)
19
+ @dom.xpath(*xpath_searches)
20
20
  end
21
21
 
22
22
  def xpath_searches
23
23
  if @field_types.any?
24
24
  @field_types.map { |field_type| field_type.xpath_search }.flatten
25
25
  else
26
- Array(Field.xpath_search)
26
+ Field.xpath_search
27
27
  end
28
28
  end
29
29
 
@@ -10,7 +10,7 @@ module Webrat
10
10
  end
11
11
 
12
12
  def form_element
13
- Webrat::XML.css_at(@dom, "#" + @value)
13
+ @dom.css("#" + @value).first
14
14
  end
15
15
 
16
16
  end
@@ -17,11 +17,11 @@ module Webrat
17
17
  end
18
18
 
19
19
  def label_elements
20
- Webrat::XML.xpath_search(@dom, Label.xpath_search)
20
+ @dom.xpath(*Label.xpath_search)
21
21
  end
22
22
 
23
23
  def text(label_element)
24
- str = Webrat::XML.all_inner_text(label_element)
24
+ str = label_element.inner_text
25
25
  str.gsub!("\n","")
26
26
  str.strip!
27
27
  str.squeeze!(" ")
@@ -10,7 +10,7 @@ module Webrat
10
10
  end
11
11
 
12
12
  def link_element
13
- matching_links.min { |a, b| Webrat::XML.all_inner_text(a).length <=> Webrat::XML.all_inner_text(b).length }
13
+ matching_links.min { |a, b| a.inner_text.length <=> b.inner_text.length }
14
14
  end
15
15
 
16
16
  def matching_links
@@ -27,25 +27,33 @@ module Webrat
27
27
  matcher = /#{Regexp.escape(@value.to_s)}/i
28
28
  end
29
29
 
30
- replace_nbsp(Webrat::XML.all_inner_text(link)) =~ matcher ||
31
- replace_nbsp_ref(Webrat::XML.inner_html(link)) =~ matcher ||
32
- Webrat::XML.attribute(link, "title")=~ matcher
30
+ replace_nbsp(link.inner_text) =~ matcher ||
31
+ replace_nbsp_ref(link.inner_html) =~ matcher ||
32
+ link["title"] =~ matcher
33
33
  end
34
34
 
35
35
  def matches_id?(link)
36
36
  if @value.is_a?(Regexp)
37
- (Webrat::XML.attribute(link, "id") =~ @value) ? true : false
37
+ link["id"] =~ @value ? true : false
38
38
  else
39
- (Webrat::XML.attribute(link, "id") == @value) ? true : false
39
+ link["id"] == @value ? true : false
40
40
  end
41
41
  end
42
42
 
43
43
  def link_elements
44
- Webrat::XML.xpath_search(@dom, *Link.xpath_search)
44
+ @dom.xpath(*Link.xpath_search)
45
45
  end
46
46
 
47
47
  def replace_nbsp(str)
48
- str.gsub([0xA0].pack('U'), ' ')
48
+ if str.respond_to?(:valid_encoding?)
49
+ if str.valid_encoding?
50
+ str.gsub(/\xc2\xa0/u, ' ')
51
+ else
52
+ str.force_encoding('UTF-8').gsub(/\xc2\xa0/u, ' ')
53
+ end
54
+ else
55
+ str.gsub(/\xc2\xa0/u, ' ')
56
+ end
49
57
  end
50
58
 
51
59
  def replace_nbsp_ref(str)
@@ -19,17 +19,17 @@ module Webrat
19
19
 
20
20
  field.options.detect do |o|
21
21
  if @option_text.is_a?(Regexp)
22
- Webrat::XML.inner_html(o.element) =~ @option_text
22
+ o.element.inner_text =~ @option_text
23
23
  else
24
- Webrat::XML.inner_html(o.element) == @option_text.to_s
24
+ o.inner_text == @option_text.to_s
25
25
  end
26
26
  end
27
27
  else
28
28
  option_element = option_elements.detect do |o|
29
29
  if @option_text.is_a?(Regexp)
30
- Webrat::XML.inner_html(o) =~ @option_text
30
+ o.inner_text =~ @option_text
31
31
  else
32
- Webrat::XML.inner_html(o) == @option_text.to_s
32
+ o.inner_text == @option_text.to_s
33
33
  end
34
34
  end
35
35
 
@@ -38,7 +38,7 @@ module Webrat
38
38
  end
39
39
 
40
40
  def option_elements
41
- Webrat::XML.xpath_search(@dom, *SelectOption.xpath_search)
41
+ @dom.xpath(*SelectOption.xpath_search)
42
42
  end
43
43
 
44
44
  def error_message
@@ -1,3 +1,5 @@
1
+ require "logger"
2
+
1
3
  module Webrat
2
4
  module Logging #:nodoc:
3
5
 
@@ -11,12 +13,9 @@ module Webrat
11
13
  when :rails
12
14
  defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : nil
13
15
  when :merb
14
- Merb.logger
16
+ ::Merb.logger
15
17
  else
16
- @logger ||= begin
17
- require "logger"
18
- ::Logger.new("webrat.log")
19
- end
18
+ @logger ||= ::Logger.new("webrat.log")
20
19
  end
21
20
  end
22
21
 
@@ -7,17 +7,12 @@ module Webrat
7
7
  end
8
8
 
9
9
  def matches?(stringlike)
10
- if Webrat.configuration.parse_with_nokogiri?
11
- @document = Webrat.nokogiri_document(stringlike)
12
- else
13
- @document = Webrat.hpricot_document(stringlike)
14
- end
15
-
16
- @element = Webrat::XML.inner_text(@document)
10
+ @document = Webrat::XML.document(stringlike)
11
+ @element = @document.inner_text
17
12
 
18
13
  case @content
19
14
  when String
20
- @element.include?(@content)
15
+ @element.gsub(/\s+/, ' ').include?(@content)
21
16
  when Regexp
22
17
  @element.match(@content)
23
18
  end
@@ -1,5 +1,4 @@
1
- require "webrat/core/xml/nokogiri"
2
- require "webrat/core/xml/rexml"
1
+ require "webrat/core/xml"
3
2
 
4
3
  module Webrat
5
4
  module Matchers
@@ -16,38 +15,14 @@ module Webrat
16
15
  matched = matches(stringlike)
17
16
 
18
17
  if @options[:count]
19
- matched.size == @options[:count] && (!@block || @block.call(matched))
18
+ matched.size == @options[:count].to_i && (!@block || @block.call(matched))
20
19
  else
21
20
  matched.any? && (!@block || @block.call(matched))
22
21
  end
23
22
  end
24
23
 
25
24
  def matches(stringlike)
26
- if Webrat.configuration.parse_with_nokogiri?
27
- nokogiri_matches(stringlike)
28
- else
29
- rexml_matches(stringlike)
30
- end
31
- end
32
-
33
- def rexml_matches(stringlike)
34
- if REXML::Node === stringlike || Array === stringlike
35
- @query = query.map { |q| q.gsub(%r'^//', './/') }
36
- else
37
- @query = query
38
- end
39
-
40
- add_options_conditions_to(@query)
41
-
42
- @document = Webrat.rexml_document(stringlike)
43
-
44
- @query.map do |q|
45
- if @document.is_a?(Array)
46
- @document.map { |d| REXML::XPath.match(d, q) }
47
- else
48
- REXML::XPath.match(@document, q)
49
- end
50
- end.flatten.compact
25
+ nokogiri_matches(stringlike)
51
26
  end
52
27
 
53
28
  def nokogiri_matches(stringlike)
@@ -16,10 +16,10 @@ module Webrat
16
16
  end
17
17
 
18
18
  def webrat_session
19
- if Webrat.configuration.mode == :rack_test
20
- @_webrat_session ||= ::Webrat::RackTestSession.new(rack_test_session)
21
- else
22
- @_webrat_session ||= ::Webrat.session_class.new(self)
19
+ @_webrat_session ||= begin
20
+ session = Webrat.session_class.new
21
+ session.adapter = Webrat.adapter_class.new(self) if session.respond_to?(:adapter=)
22
+ session
23
23
  end
24
24
  end
25
25
 
@@ -39,6 +39,7 @@ module Webrat
39
39
  :unchecks, :uncheck,
40
40
  :chooses, :choose,
41
41
  :selects, :select,
42
+ :unselects, :unselect,
42
43
  :attaches_file, :attach_file,
43
44
  :current_page,
44
45
  :current_url,
@@ -1,29 +1,18 @@
1
1
  module Webrat #:nodoc:
2
2
  module MIME #:nodoc:
3
+ MIME_TYPES = Rack::Mime::MIME_TYPES.dup.merge(
4
+ ".multipart_form" => "multipart/form-data",
5
+ ".url_encoded_form" => "application/x-www-form-urlencoded"
6
+ ).freeze
3
7
 
4
- def self.mime_type(string_or_symbol) #:nodoc:
5
- if string_or_symbol.is_a?(String)
6
- string_or_symbol
7
- else
8
- case string_or_symbol
9
- when :text then "text/plain"
10
- when :html then "text/html"
11
- when :js then "text/javascript"
12
- when :css then "text/css"
13
- when :ics then "text/calendar"
14
- when :csv then "text/csv"
15
- when :xml then "application/xml"
16
- when :rss then "application/rss+xml"
17
- when :atom then "application/atom+xml"
18
- when :yaml then "application/x-yaml"
19
- when :multipart_form then "multipart/form-data"
20
- when :url_encoded_form then "application/x-www-form-urlencoded"
21
- when :json then "application/json"
22
- else
23
- raise ArgumentError.new("Invalid Mime type: #{string_or_symbol.inspect}")
24
- end
25
- end
8
+ def mime_type(type)
9
+ return type if type.nil? || type.to_s.include?("/")
10
+ type = ".#{type}" unless type.to_s[0] == ?.
11
+ MIME_TYPES.fetch(type) { |type|
12
+ raise ArgumentError.new("Invalid Mime type: #{type}")
13
+ }
26
14
  end
27
15
 
16
+ module_function :mime_type
28
17
  end
29
18
  end
@@ -6,44 +6,22 @@ module Webrat
6
6
  # Example:
7
7
  # save_and_open_page
8
8
  def save_and_open_page
9
- return unless File.exist?(saved_page_dir)
9
+ return unless File.exist?(Webrat.configuration.saved_pages_dir)
10
10
 
11
- filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.html"
11
+ filename = "#{Webrat.configuration.saved_pages_dir}/webrat-#{Time.now.to_i}.html"
12
12
 
13
13
  File.open(filename, "w") do |f|
14
- f.write rewrite_css_and_image_references(response_body)
14
+ f.write 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
- 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
21
+ require "launchy"
22
+ Launchy::Browser.run(path)
23
+ rescue LoadError
24
+ warn "Sorry, you need to install launchy to open pages: `gem install launchy`"
47
25
  end
48
26
 
49
27
  end
@@ -112,6 +112,21 @@ module Webrat
112
112
 
113
113
  webrat_deprecate :selects, :select
114
114
 
115
+ # Verifies that a an option element exists on the current page with the specified
116
+ # text. You can optionally restrict the search to a specific select list by
117
+ # assigning <tt>options[:from]</tt> the value of the select list's name or
118
+ # a label. Remove the option's value before the form is submitted.
119
+ #
120
+ # Examples:
121
+ # unselect "January"
122
+ # unselect "February", :from => "event_month"
123
+ # unselect "February", :from => "Event Month"
124
+ def unselect(option_text, options={})
125
+ select_option(option_text, options[:from]).unchoose
126
+ end
127
+
128
+ webrat_deprecate :unselects, :unselect
129
+
115
130
  DATE_TIME_SUFFIXES = {
116
131
  :year => '1i',
117
132
  :month => '2i',
@@ -312,12 +327,12 @@ module Webrat
312
327
  dom = Webrat::XML.html_document(@response_body)
313
328
  end
314
329
 
315
- Webrat.define_dom_method(@response, dom)
330
+ Webrat::XML.define_dom_method(@response, dom)
316
331
  return dom
317
332
  end
318
333
 
319
334
  def scoped_dom
320
- Webrat::XML.css_at(@scope.dom, @selector)
335
+ @scope.dom.css(@selector).first
321
336
  end
322
337
 
323
338
  def locate_field(field_locator, *field_types) #:nodoc: