diabolo-webrat 0.4.2 → 0.4.3

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 (54) hide show
  1. data/History.txt +22 -3
  2. data/Rakefile +6 -1
  3. data/lib/webrat/core/configuration.rb +4 -4
  4. data/lib/webrat/core/elements/area.rb +7 -7
  5. data/lib/webrat/core/elements/element.rb +11 -11
  6. data/lib/webrat/core/elements/field.rb +50 -50
  7. data/lib/webrat/core/elements/form.rb +17 -17
  8. data/lib/webrat/core/elements/label.rb +6 -6
  9. data/lib/webrat/core/elements/link.rb +13 -11
  10. data/lib/webrat/core/elements/select_option.rb +9 -9
  11. data/lib/webrat/core/locators/area_locator.rb +10 -10
  12. data/lib/webrat/core/locators/button_locator.rb +13 -13
  13. data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
  14. data/lib/webrat/core/locators/field_labeled_locator.rb +10 -10
  15. data/lib/webrat/core/locators/field_locator.rb +7 -7
  16. data/lib/webrat/core/locators/field_named_locator.rb +10 -10
  17. data/lib/webrat/core/locators/form_locator.rb +6 -6
  18. data/lib/webrat/core/locators/label_locator.rb +8 -8
  19. data/lib/webrat/core/locators/link_locator.rb +11 -12
  20. data/lib/webrat/core/locators/locator.rb +5 -5
  21. data/lib/webrat/core/locators/select_option_locator.rb +11 -11
  22. data/lib/webrat/core/locators.rb +2 -2
  23. data/lib/webrat/core/logging.rb +3 -3
  24. data/lib/webrat/core/matchers/have_content.rb +12 -12
  25. data/lib/webrat/core/matchers/have_selector.rb +9 -9
  26. data/lib/webrat/core/matchers/have_tag.rb +4 -4
  27. data/lib/webrat/core/matchers/have_xpath.rb +24 -24
  28. data/lib/webrat/core/methods.rb +9 -9
  29. data/lib/webrat/core/mime.rb +3 -3
  30. data/lib/webrat/core/save_and_open_page.rb +9 -9
  31. data/lib/webrat/core/scope.rb +51 -51
  32. data/lib/webrat/core/session.rb +7 -7
  33. data/lib/webrat/core/xml/hpricot.rb +3 -3
  34. data/lib/webrat/core/xml/nokogiri.rb +11 -11
  35. data/lib/webrat/core/xml/rexml.rb +3 -3
  36. data/lib/webrat/core/xml.rb +16 -16
  37. data/lib/webrat/core_extensions/blank.rb +1 -1
  38. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  39. data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
  40. data/lib/webrat/core_extensions/meta_class.rb +1 -1
  41. data/lib/webrat/mechanize.rb +9 -9
  42. data/lib/webrat/merb.rb +1 -1
  43. data/lib/webrat/merb_session.rb +10 -10
  44. data/lib/webrat/rails.rb +2 -2
  45. data/lib/webrat/rspec-rails.rb +2 -2
  46. data/lib/webrat/selenium/matchers/have_content.rb +4 -4
  47. data/lib/webrat/selenium/matchers/have_selector.rb +4 -4
  48. data/lib/webrat/selenium/matchers/have_tag.rb +16 -16
  49. data/lib/webrat/selenium/matchers/have_xpath.rb +4 -4
  50. data/lib/webrat/selenium/matchers.rb +1 -1
  51. data/lib/webrat/selenium/selenium_session.rb +12 -18
  52. data/lib/webrat/selenium.rb +3 -77
  53. data/lib/webrat.rb +4 -4
  54. metadata +1 -1
data/History.txt CHANGED
@@ -1,13 +1,32 @@
1
- == Git (Unreleased)
1
+ == 0.4.4 / 2009-04-06
2
+
3
+ * Major enhancements
4
+
5
+ * Make selenium process management code more robust and informative
6
+
7
+ * Minor enhancements
8
+
9
+ * Add support for Rails javascript post links (Mark Menard)
10
+ * Upgrade selenium-client dependency to 1.2.14, and update for new waiting
11
+ API (Balint Erdi)
12
+ * Change default app environment from "selenium" to "test"
13
+
14
+ * Bug fixes
15
+
16
+ * Don't create a new instance of WWW::Mechanize for each request
17
+ (Mark Menard)
18
+ * Select fields with duplicate selected options sent an incorrect value (Noah Davis)
19
+
20
+ == 0.4.3 / 2009-03-17
2
21
 
3
22
  * Minor enhancements
4
23
 
24
+ * Support Rails 2.3. Use Rack::Utils to parse params (Matthew Ford)
5
25
  * Support for "modular" Sinatra app style (Simon Rozet)
26
+ * Initial Merb and Sinatra compatibility for Selenium mode (Corey Donohoe)
6
27
  * When faced with a label with no for attribute, that contains a hidden field
7
28
  and another field, as can be the case in Rails 2.3's checkbox view,
8
29
  webrat now locates the non-hidden field. (Luke Melia)
9
- * When using Rails 2.3, use Rack::Utils to parse params (Matthew Ford)
10
- * Initial Merb and Sinatra compatibility for Selenium mode (Corey Donohoe)
11
30
  * Add application_framework config for Selenium mode to determine how to
12
31
  start and stop the app server (Corey Donohoe)
13
32
 
data/Rakefile CHANGED
@@ -148,4 +148,9 @@ end
148
148
 
149
149
  task :default => :spec
150
150
 
151
- task :precommit => ["spec", "spec:jruby", "spec:integration"]
151
+ task :precommit => ["spec", "spec:jruby", "spec:integration"]
152
+
153
+ desc 'Removes trailing whitespace'
154
+ task :whitespace do
155
+ sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
156
+ end
@@ -57,14 +57,14 @@ module Webrat
57
57
  # How many redirects to the same URL should be halted as an infinite redirect
58
58
  # loop? Defaults to 10
59
59
  attr_accessor :infinite_redirect_limit
60
-
60
+
61
61
  def initialize # :nodoc:
62
62
  self.open_error_files = true
63
63
  self.parse_with_nokogiri = !Webrat.on_java?
64
- self.application_environment = :selenium
64
+ self.application_environment = :test
65
65
  self.application_port = 3001
66
66
  self.application_address = 'localhost'
67
- self.application_framework = 'rails'
67
+ self.application_framework = :rails
68
68
  self.selenium_server_port = 4444
69
69
  self.infinite_redirect_limit = 10
70
70
  self.selenium_browser_key = '*firefox'
@@ -82,7 +82,7 @@ module Webrat
82
82
  # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
83
83
  def mode=(mode)
84
84
  @mode = mode.to_sym
85
-
85
+
86
86
  # This is a temporary hack to support backwards compatibility
87
87
  # with Merb 1.0.8 until it's updated to use the new Webrat.configure
88
88
  # syntax
@@ -2,21 +2,21 @@ require "webrat/core/elements/element"
2
2
 
3
3
  module Webrat
4
4
  class Area < Element #:nodoc:
5
-
5
+
6
6
  def self.xpath_search
7
7
  ".//area"
8
8
  end
9
-
9
+
10
10
  def click(method = nil, options = {})
11
11
  @session.request_page(absolute_href, :get, {})
12
12
  end
13
-
13
+
14
14
  protected
15
-
15
+
16
16
  def href
17
17
  Webrat::XML.attribute(@element, "href")
18
18
  end
19
-
19
+
20
20
  def absolute_href
21
21
  if href =~ /^\?/
22
22
  "#{@session.current_url}#{href}"
@@ -26,6 +26,6 @@ module Webrat
26
26
  href
27
27
  end
28
28
  end
29
-
29
+
30
30
  end
31
- end
31
+ end
@@ -1,33 +1,33 @@
1
1
  module Webrat
2
-
2
+
3
3
  class Element # :nodoc:
4
-
4
+
5
5
  def self.load_all(session, dom)
6
- Webrat::XML.xpath_search(dom, xpath_search).map do |element|
6
+ Webrat::XML.xpath_search(dom, xpath_search).map do |element|
7
7
  load(session, element)
8
8
  end
9
9
  end
10
-
10
+
11
11
  def self.load(session, element)
12
12
  return nil if element.nil?
13
13
  session.elements[Webrat::XML.xpath_to(element)] ||= self.new(session, element)
14
14
  end
15
-
15
+
16
16
  attr_reader :element
17
-
17
+
18
18
  def initialize(session, element)
19
19
  @session = session
20
20
  @element = element
21
21
  end
22
-
22
+
23
23
  def path
24
24
  Webrat::XML.xpath_to(@element)
25
25
  end
26
-
26
+
27
27
  def inspect
28
28
  "#<#{self.class} @element=#{element.inspect}>"
29
29
  end
30
-
30
+
31
31
  end
32
-
33
- end
32
+
33
+ end
@@ -8,10 +8,10 @@ module Webrat
8
8
  # Raised when Webrat is asked to manipulate a disabled form field
9
9
  class DisabledFieldError < WebratError
10
10
  end
11
-
11
+
12
12
  class Field < Element #:nodoc:
13
13
  attr_reader :value
14
-
14
+
15
15
  def self.xpath_search
16
16
  [".//button", ".//input", ".//textarea", ".//select"]
17
17
  end
@@ -19,22 +19,22 @@ module Webrat
19
19
  def self.xpath_search_excluding_hidden
20
20
  [".//button", ".//input[ @type != 'hidden']", ".//textarea", ".//select"]
21
21
  end
22
-
22
+
23
23
  def self.field_classes
24
24
  @field_classes || []
25
25
  end
26
-
26
+
27
27
  def self.inherited(klass)
28
28
  @field_classes ||= []
29
29
  @field_classes << klass
30
30
  # raise args.inspect
31
31
  end
32
-
32
+
33
33
  def self.load(session, element)
34
34
  return nil if element.nil?
35
35
  session.elements[Webrat::XML.xpath_to(element)] ||= field_class(element).new(session, element)
36
36
  end
37
-
37
+
38
38
  def self.field_class(element)
39
39
  case element.name
40
40
  when "button" then ButtonField
@@ -55,7 +55,7 @@ module Webrat
55
55
  end
56
56
  end
57
57
  end
58
-
58
+
59
59
  def initialize(*args)
60
60
  super
61
61
  @value = default_value
@@ -65,7 +65,7 @@ module Webrat
65
65
  return nil if labels.empty?
66
66
  labels.first.text
67
67
  end
68
-
68
+
69
69
  def id
70
70
  Webrat::XML.attribute(@element, "id")
71
71
  end
@@ -73,15 +73,15 @@ module Webrat
73
73
  def disabled?
74
74
  @element.attributes.has_key?("disabled") && Webrat::XML.attribute(@element, "disabled") != 'false'
75
75
  end
76
-
76
+
77
77
  def raise_error_if_disabled
78
78
  return unless disabled?
79
79
  raise DisabledFieldError.new("Cannot interact with disabled form element (#{self})")
80
80
  end
81
-
81
+
82
82
  def to_param
83
83
  return nil if disabled?
84
-
84
+
85
85
  case Webrat.configuration.mode
86
86
  when :rails
87
87
  parse_rails_request_params("#{name}=#{escaped_value}")
@@ -91,17 +91,17 @@ module Webrat
91
91
  { name => escaped_value }
92
92
  end
93
93
  end
94
-
94
+
95
95
  def set(value)
96
96
  @value = value
97
97
  end
98
-
98
+
99
99
  def unset
100
100
  @value = default_value
101
101
  end
102
-
102
+
103
103
  protected
104
-
104
+
105
105
  def parse_rails_request_params(params)
106
106
  if defined?(ActionController::AbstractRequest)
107
107
  ActionController::AbstractRequest.parse_query_parameters(params)
@@ -113,38 +113,38 @@ module Webrat
113
113
  Rack::Utils.parse_nested_query(params)
114
114
  end
115
115
  end
116
-
116
+
117
117
  def form
118
118
  Form.load(@session, form_element)
119
119
  end
120
-
120
+
121
121
  def form_element
122
122
  parent = @element.parent
123
-
123
+
124
124
  while parent.respond_to?(:parent)
125
125
  return parent if parent.name == 'form'
126
126
  parent = parent.parent
127
127
  end
128
128
  end
129
-
129
+
130
130
  def name
131
131
  Webrat::XML.attribute(@element, "name")
132
132
  end
133
-
133
+
134
134
  def escaped_value
135
135
  CGI.escape(@value.to_s)
136
136
  end
137
-
137
+
138
138
  def labels
139
139
  @labels ||= label_elements.map do |element|
140
140
  Label.load(@session, element)
141
141
  end
142
142
  end
143
-
143
+
144
144
  def label_elements
145
145
  return @label_elements unless @label_elements.nil?
146
146
  @label_elements = []
147
-
147
+
148
148
  parent = @element.parent
149
149
  while parent.respond_to?(:parent)
150
150
  if parent.name == 'label'
@@ -153,18 +153,18 @@ module Webrat
153
153
  end
154
154
  parent = parent.parent
155
155
  end
156
-
156
+
157
157
  unless id.blank?
158
158
  @label_elements += Webrat::XML.xpath_search(form.element, ".//label[@for = '#{id}']")
159
159
  end
160
-
160
+
161
161
  @label_elements
162
162
  end
163
-
163
+
164
164
  def default_value
165
165
  Webrat::XML.attribute(@element, "value")
166
166
  end
167
-
167
+
168
168
  def replace_param_value(params, oval, nval)
169
169
  output = Hash.new
170
170
  params.each do |key, value|
@@ -181,13 +181,13 @@ module Webrat
181
181
  output
182
182
  end
183
183
  end
184
-
184
+
185
185
  class ButtonField < Field #:nodoc:
186
186
 
187
187
  def self.xpath_search
188
188
  [".//button", ".//input[@type = 'submit']", ".//input[@type = 'button']", ".//input[@type = 'image']"]
189
189
  end
190
-
190
+
191
191
  def to_param
192
192
  return nil if @value.nil?
193
193
  super
@@ -210,7 +210,7 @@ module Webrat
210
210
  def self.xpath_search
211
211
  ".//input[@type = 'hidden']"
212
212
  end
213
-
213
+
214
214
  def to_param
215
215
  if collection_name?
216
216
  super
@@ -238,7 +238,7 @@ module Webrat
238
238
  def self.xpath_search
239
239
  ".//input[@type = 'checkbox']"
240
240
  end
241
-
241
+
242
242
  def to_param
243
243
  return nil if @value.nil?
244
244
  super
@@ -248,7 +248,7 @@ module Webrat
248
248
  raise_error_if_disabled
249
249
  set(Webrat::XML.attribute(@element, "value") || "on")
250
250
  end
251
-
251
+
252
252
  def checked?
253
253
  Webrat::XML.attribute(@element, "checked") == "checked"
254
254
  end
@@ -271,11 +271,11 @@ module Webrat
271
271
  end
272
272
 
273
273
  class PasswordField < Field #:nodoc:
274
-
274
+
275
275
  def self.xpath_search
276
276
  ".//input[@type = 'password']"
277
277
  end
278
-
278
+
279
279
  end
280
280
 
281
281
  class RadioField < Field #:nodoc:
@@ -283,31 +283,31 @@ module Webrat
283
283
  def self.xpath_search
284
284
  ".//input[@type = 'radio']"
285
285
  end
286
-
286
+
287
287
  def to_param
288
288
  return nil if @value.nil?
289
289
  super
290
290
  end
291
-
291
+
292
292
  def choose
293
293
  raise_error_if_disabled
294
294
  other_options.each do |option|
295
295
  option.set(nil)
296
296
  end
297
-
297
+
298
298
  set(Webrat::XML.attribute(@element, "value") || "on")
299
299
  end
300
-
300
+
301
301
  def checked?
302
302
  Webrat::XML.attribute(@element, "checked") == "checked"
303
303
  end
304
-
304
+
305
305
  protected
306
306
 
307
307
  def other_options
308
308
  form.fields.select { |f| f.name == name }
309
309
  end
310
-
310
+
311
311
  def default_value
312
312
  if Webrat::XML.attribute(@element, "checked") == "checked"
313
313
  Webrat::XML.attribute(@element, "value") || "on"
@@ -323,7 +323,7 @@ module Webrat
323
323
  def self.xpath_search
324
324
  ".//textarea"
325
325
  end
326
-
326
+
327
327
  protected
328
328
 
329
329
  def default_value
@@ -331,13 +331,13 @@ module Webrat
331
331
  end
332
332
 
333
333
  end
334
-
334
+
335
335
  class FileField < Field #:nodoc:
336
-
336
+
337
337
  def self.xpath_search
338
338
  ".//input[@type = 'file']"
339
339
  end
340
-
340
+
341
341
  attr_accessor :content_type
342
342
 
343
343
  def set(value, content_type = nil)
@@ -352,9 +352,9 @@ module Webrat
352
352
  replace_param_value(super, @value, test_uploaded_file)
353
353
  end
354
354
  end
355
-
355
+
356
356
  protected
357
-
357
+
358
358
  def test_uploaded_file
359
359
  if content_type
360
360
  ActionController::TestUploadedFile.new(@value, content_type)
@@ -386,17 +386,17 @@ module Webrat
386
386
  def options
387
387
  @options ||= SelectOption.load_all(@session, @element)
388
388
  end
389
-
389
+
390
390
  protected
391
391
 
392
392
  def default_value
393
393
  selected_options = Webrat::XML.xpath_search(@element, ".//option[@selected = 'selected']")
394
- selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
395
-
394
+ selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
395
+
396
396
  selected_options.map do |option|
397
397
  return "" if option.nil?
398
398
  Webrat::XML.attribute(option, "value") || Webrat::XML.inner_html(option)
399
- end
399
+ end.uniq
400
400
  end
401
401
 
402
402
  end
@@ -7,7 +7,7 @@ require "webrat/core/locators/field_named_locator"
7
7
  module Webrat
8
8
  class Form < Element #:nodoc:
9
9
  attr_reader :element
10
-
10
+
11
11
  def self.xpath_search
12
12
  ".//form"
13
13
  end
@@ -15,21 +15,21 @@ module Webrat
15
15
  def fields
16
16
  @fields ||= Field.load_all(@session, @element)
17
17
  end
18
-
18
+
19
19
  def submit
20
20
  @session.request_page(form_action, form_method, params)
21
21
  end
22
-
22
+
23
23
  def field_named(name, *field_types)
24
24
  Webrat::Locators::FieldNamedLocator.new(@session, dom, name, *field_types).locate
25
25
  end
26
-
26
+
27
27
  protected
28
-
28
+
29
29
  def dom
30
30
  Webrat::XML.xpath_at(@session.dom, path)
31
31
  end
32
-
32
+
33
33
  def fields_by_type(field_types)
34
34
  if field_types.any?
35
35
  fields.select { |f| field_types.include?(f.class) }
@@ -37,26 +37,26 @@ module Webrat
37
37
  fields
38
38
  end
39
39
  end
40
-
40
+
41
41
  def params
42
42
  all_params = {}
43
-
43
+
44
44
  fields.each do |field|
45
45
  next if field.to_param.nil?
46
46
  merge(all_params, field.to_param)
47
47
  end
48
-
48
+
49
49
  all_params
50
50
  end
51
-
51
+
52
52
  def form_method
53
53
  Webrat::XML.attribute(@element, "method").blank? ? :get : Webrat::XML.attribute(@element, "method").downcase
54
54
  end
55
-
55
+
56
56
  def form_action
57
57
  Webrat::XML.attribute(@element, "action").blank? ? @session.current_url : Webrat::XML.attribute(@element, "action")
58
58
  end
59
-
59
+
60
60
  def merge(all_params, new_param)
61
61
  new_param.each do |key, value|
62
62
  case all_params[key]
@@ -69,7 +69,7 @@ module Webrat
69
69
  end
70
70
  end
71
71
  end
72
-
72
+
73
73
  def merge_hash_values(a, b) # :nodoc:
74
74
  a.keys.each do |k|
75
75
  if b.has_key?(k)
@@ -85,19 +85,19 @@ module Webrat
85
85
  end
86
86
  a.merge!(b)
87
87
  end
88
-
88
+
89
89
  def hash_classes
90
90
  klasses = [Hash]
91
-
91
+
92
92
  case Webrat.configuration.mode
93
93
  when :rails
94
94
  klasses << HashWithIndifferentAccess
95
95
  when :merb
96
96
  klasses << Mash
97
97
  end
98
-
98
+
99
99
  klasses
100
100
  end
101
-
101
+
102
102
  end
103
103
  end
@@ -2,9 +2,9 @@ require "webrat/core/elements/element"
2
2
 
3
3
  module Webrat
4
4
  class Label < Element #:nodoc:
5
-
5
+
6
6
  attr_reader :element
7
-
7
+
8
8
  def self.xpath_search
9
9
  ".//label"
10
10
  end
@@ -12,13 +12,13 @@ module Webrat
12
12
  def for_id
13
13
  Webrat::XML.attribute(@element, "for")
14
14
  end
15
-
15
+
16
16
  def field
17
17
  Field.load(@session, field_element)
18
18
  end
19
-
19
+
20
20
  protected
21
-
21
+
22
22
  def field_element
23
23
  if for_id.blank?
24
24
  Webrat::XML.xpath_at(@element, *Field.xpath_search_excluding_hidden)
@@ -26,6 +26,6 @@ module Webrat
26
26
  Webrat::XML.css_search(@session.current_dom, "#" + for_id).first
27
27
  end
28
28
  end
29
-
29
+
30
30
  end
31
31
  end
@@ -4,30 +4,30 @@ require "webrat/core/elements/element"
4
4
 
5
5
  module Webrat
6
6
  class Link < Element #:nodoc:
7
-
7
+
8
8
  def self.xpath_search
9
9
  ".//a[@href]"
10
10
  end
11
-
11
+
12
12
  def click(options = {})
13
13
  method = options[:method] || http_method
14
14
  return if href =~ /^#/ && method == :get
15
-
15
+
16
16
  options[:javascript] = true if options[:javascript].nil?
17
-
17
+
18
18
  if options[:javascript]
19
19
  @session.request_page(absolute_href, method, data)
20
20
  else
21
21
  @session.request_page(absolute_href, :get, {})
22
22
  end
23
23
  end
24
-
24
+
25
25
  protected
26
-
26
+
27
27
  def id
28
28
  Webrat::XML.attribute(@element, "id")
29
29
  end
30
-
30
+
31
31
  def data
32
32
  authenticity_token.blank? ? {} : {"authenticity_token" => authenticity_token}
33
33
  end
@@ -49,17 +49,17 @@ module Webrat
49
49
  href
50
50
  end
51
51
  end
52
-
52
+
53
53
  def authenticity_token
54
54
  return unless onclick && onclick.include?("s.setAttribute('name', 'authenticity_token');") &&
55
55
  onclick =~ /s\.setAttribute\('value', '([a-f0-9]{40})'\);/
56
56
  $LAST_MATCH_INFO.captures.first
57
57
  end
58
-
58
+
59
59
  def onclick
60
60
  Webrat::XML.attribute(@element, "onclick")
61
61
  end
62
-
62
+
63
63
  def http_method
64
64
  if !onclick.blank? && onclick.include?("f.submit()")
65
65
  http_method_from_js_form
@@ -81,10 +81,12 @@ module Webrat
81
81
  :delete
82
82
  elsif onclick.include?("m.setAttribute('value', 'put')")
83
83
  :put
84
+ elsif onclick.include?("m.setAttribute('value', 'post')")
85
+ :post
84
86
  else
85
87
  raise Webrat::WebratError.new("No HTTP method for _method param in #{onclick.inspect}")
86
88
  end
87
89
  end
88
-
90
+
89
91
  end
90
92
  end