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.
Files changed (63) hide show
  1. data/History.txt +140 -30
  2. data/README.rdoc +85 -0
  3. data/Rakefile +72 -22
  4. data/install.rb +1 -1
  5. data/lib/webrat.rb +12 -17
  6. data/lib/webrat/core.rb +9 -7
  7. data/lib/webrat/core/configuration.rb +87 -0
  8. data/lib/webrat/core/{area.rb → elements/area.rb} +7 -20
  9. data/lib/webrat/core/elements/element.rb +33 -0
  10. data/lib/webrat/core/elements/field.rb +394 -0
  11. data/lib/webrat/core/elements/form.rb +103 -0
  12. data/lib/webrat/core/elements/label.rb +31 -0
  13. data/lib/webrat/core/{link.rb → elements/link.rb} +15 -26
  14. data/lib/webrat/core/elements/select_option.rb +35 -0
  15. data/lib/webrat/core/locators.rb +13 -85
  16. data/lib/webrat/core/locators/area_locator.rb +38 -0
  17. data/lib/webrat/core/locators/button_locator.rb +54 -0
  18. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  19. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  20. data/lib/webrat/core/locators/field_locator.rb +25 -0
  21. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  22. data/lib/webrat/core/locators/form_locator.rb +19 -0
  23. data/lib/webrat/core/locators/label_locator.rb +34 -0
  24. data/lib/webrat/core/locators/link_locator.rb +66 -0
  25. data/lib/webrat/core/locators/locator.rb +20 -0
  26. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  27. data/lib/webrat/core/logging.rb +5 -9
  28. data/lib/webrat/core/matchers/have_content.rb +19 -44
  29. data/lib/webrat/core/matchers/have_selector.rb +15 -2
  30. data/lib/webrat/core/matchers/have_tag.rb +15 -2
  31. data/lib/webrat/core/matchers/have_xpath.rb +21 -28
  32. data/lib/webrat/core/methods.rb +32 -15
  33. data/lib/webrat/core/mime.rb +3 -3
  34. data/lib/webrat/core/save_and_open_page.rb +50 -0
  35. data/lib/webrat/core/scope.rb +183 -41
  36. data/lib/webrat/core/session.rb +125 -63
  37. data/lib/webrat/core/xml.rb +115 -0
  38. data/lib/webrat/core/xml/hpricot.rb +19 -0
  39. data/lib/webrat/core/xml/nokogiri.rb +76 -0
  40. data/lib/webrat/core/xml/rexml.rb +24 -0
  41. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  42. data/lib/webrat/mechanize.rb +58 -12
  43. data/lib/webrat/merb.rb +7 -73
  44. data/lib/webrat/merb_session.rb +65 -0
  45. data/lib/webrat/rack.rb +1 -1
  46. data/lib/webrat/rails.rb +56 -55
  47. data/lib/webrat/rspec-rails.rb +13 -0
  48. data/lib/webrat/selenium.rb +92 -1
  49. data/lib/webrat/selenium/matchers.rb +146 -0
  50. data/lib/webrat/selenium/selenium_session.rb +179 -80
  51. data/lib/webrat/sinatra.rb +14 -4
  52. data/vendor/selenium-server.jar +0 -0
  53. metadata +36 -17
  54. data/README.txt +0 -90
  55. data/TODO.txt +0 -10
  56. data/init.rb +0 -3
  57. data/lib/webrat/core/field.rb +0 -332
  58. data/lib/webrat/core/flunk.rb +0 -7
  59. data/lib/webrat/core/form.rb +0 -130
  60. data/lib/webrat/core/label.rb +0 -18
  61. data/lib/webrat/core/nokogiri.rb +0 -44
  62. data/lib/webrat/core/select_option.rb +0 -29
  63. data/lib/webrat/rails/redirect_actions.rb +0 -18
@@ -1,7 +0,0 @@
1
- module Flunk
2
-
3
- def flunk(message) #:nodoc:
4
- raise message
5
- end
6
-
7
- end
@@ -1,130 +0,0 @@
1
- require "webrat/core/field"
2
- require "webrat/core_extensions/blank"
3
-
4
- module Webrat
5
- class Form #:nodoc:
6
- attr_reader :element
7
-
8
- def initialize(session, element)
9
- @session = session
10
- @element = element
11
- @fields = nil
12
- end
13
-
14
- def field(locator, *field_types)
15
- field_with_id(locator, *field_types) ||
16
- field_named(locator, *field_types) ||
17
- field_labeled(locator, *field_types) ||
18
- nil
19
- end
20
-
21
- def find_select_option(option_text)
22
- select_fields = fields_by_type([SelectField])
23
-
24
- select_fields.each do |select_field|
25
- result = select_field.find_option(option_text)
26
- return result if result
27
- end
28
-
29
- nil
30
- end
31
-
32
- def find_button(value = nil)
33
- return fields_by_type([ButtonField]).first if value.nil?
34
- possible_buttons = fields_by_type([ButtonField])
35
- possible_buttons.detect { |possible_button| possible_button.matches_id?(value) } ||
36
- possible_buttons.detect { |possible_button| possible_button.matches_value?(value) }
37
- end
38
-
39
- def fields
40
- return @fields if @fields
41
-
42
- @fields = (@element.search(".//button", ".//input", ".//textarea", ".//select")).collect do |field_element|
43
- Field.class_for_element(field_element).new(self, field_element)
44
- end
45
- end
46
-
47
- def submit
48
- @session.request_page(form_action, form_method, params)
49
- end
50
-
51
- def field_with_id(id, *field_types)
52
- possible_fields = fields_by_type(field_types)
53
- possible_fields.detect { |possible_field| possible_field.matches_id?(id) }
54
- end
55
-
56
- def field_named(name, *field_types)
57
- possible_fields = fields_by_type(field_types)
58
- possible_fields.detect { |possible_field| possible_field.matches_name?(name) }
59
- end
60
-
61
- def field_labeled(label, *field_types)
62
- possible_fields = fields_by_type(field_types)
63
- matching_fields = possible_fields.select do |possible_field|
64
- possible_field.matches_label?(label)
65
- end
66
- matching_fields.min { |a, b| a.label_text.length <=> b.label_text.length }
67
- end
68
-
69
- protected
70
-
71
- def fields_by_type(field_types)
72
- if field_types.any?
73
- fields.select { |f| field_types.include?(f.class) }
74
- else
75
- fields
76
- end
77
- end
78
-
79
- def params
80
- all_params = {}
81
-
82
- fields.each do |field|
83
- next if field.to_param.nil?
84
- merge(all_params, field.to_param)
85
- end
86
-
87
- all_params
88
- end
89
-
90
- def form_method
91
- @element["method"].blank? ? :get : @element["method"].downcase
92
- end
93
-
94
- def form_action
95
- @element["action"].blank? ? @session.current_url : @element["action"]
96
- end
97
-
98
- HASH = [Hash, HashWithIndifferentAccess] rescue [Hash]
99
-
100
- def merge(all_params, new_param)
101
- new_param.each do |key, value|
102
- case all_params[key]
103
- when *HASH
104
- merge_hash_values(all_params[key], value)
105
- when Array
106
- all_params[key] += value
107
- else
108
- all_params[key] = value
109
- end
110
- end
111
- end
112
-
113
- def merge_hash_values(a, b) # :nodoc:
114
- a.keys.each do |k|
115
- if b.has_key?(k)
116
- case [a[k], b[k]].map{|value| value.class}
117
- when [Hash, Hash]
118
- a[k] = merge_hash_values(a[k], b[k])
119
- b.delete(k)
120
- when [Array, Array]
121
- a[k] += b[k]
122
- b.delete(k)
123
- end
124
- end
125
- end
126
- a.merge!(b)
127
- end
128
-
129
- end
130
- end
@@ -1,18 +0,0 @@
1
- module Webrat
2
- class Label #:nodoc:
3
-
4
- def initialize(field, element)
5
- @field = field
6
- @element = element
7
- end
8
-
9
- def matches_text?(label_text)
10
- text =~ /^\W*#{Regexp.escape(label_text.to_s)}\b/i
11
- end
12
-
13
- def text
14
- @element.inner_text
15
- end
16
-
17
- end
18
- end
@@ -1,44 +0,0 @@
1
- require "webrat/core_extensions/meta_class"
2
-
3
- module Webrat
4
-
5
- def self.nokogiri_document(stringlike) #:nodoc:
6
- return stringlike.dom if stringlike.respond_to?(:dom)
7
-
8
- if Nokogiri::HTML::Document === stringlike
9
- stringlike
10
- elsif Nokogiri::XML::NodeSet === stringlike
11
- stringlike
12
- elsif StringIO === stringlike
13
- Nokogiri::HTML(stringlike.string)
14
- elsif stringlike.respond_to?(:body)
15
- Nokogiri::HTML(stringlike.body.to_s)
16
- else
17
- Nokogiri::HTML(stringlike.to_s)
18
- end
19
- end
20
-
21
- def self.define_dom_method(object, dom) #:nodoc:
22
- object.meta_class.send(:define_method, :dom) do
23
- dom
24
- end
25
- end
26
-
27
- end
28
-
29
-
30
- module Nokogiri
31
- module CSS
32
- class XPathVisitor
33
-
34
- def visit_pseudo_class_text(node) #:nodoc:
35
- "@type='text'"
36
- end
37
-
38
- def visit_pseudo_class_password(node) #:nodoc:
39
- "@type='password'"
40
- end
41
-
42
- end
43
- end
44
- end
@@ -1,29 +0,0 @@
1
- module Webrat
2
- class SelectOption #:nodoc:
3
-
4
- def initialize(select, element)
5
- @select = select
6
- @element = element
7
- end
8
-
9
- def matches_text?(text)
10
- if text.is_a?(Regexp)
11
- @element.inner_html =~ text
12
- else
13
- @element.inner_html == text.to_s
14
- end
15
- end
16
-
17
- def choose
18
- @select.raise_error_if_disabled
19
- @select.set(value)
20
- end
21
-
22
- protected
23
-
24
- def value
25
- @element["value"] || @element.inner_html
26
- end
27
-
28
- end
29
- end
@@ -1,18 +0,0 @@
1
- # For Rails before http://dev.rubyonrails.org/ticket/10497 was committed
2
- module Webrat
3
- module RedirectActions #:nodoc:
4
-
5
- def put_via_redirect(path, parameters = {}, headers = {})
6
- put path, parameters, headers
7
- follow_redirect! while redirect?
8
- status
9
- end
10
-
11
- def delete_via_redirect(path, parameters = {}, headers = {})
12
- delete path, parameters, headers
13
- follow_redirect! while redirect?
14
- status
15
- end
16
-
17
- end
18
- end