auxesis-webrat 0.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 (67) hide show
  1. data/History.txt +264 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.rdoc +85 -0
  4. data/Rakefile +151 -0
  5. data/install.rb +1 -0
  6. data/lib/webrat.rb +34 -0
  7. data/lib/webrat/core.rb +14 -0
  8. data/lib/webrat/core/configuration.rb +89 -0
  9. data/lib/webrat/core/elements/area.rb +31 -0
  10. data/lib/webrat/core/elements/element.rb +33 -0
  11. data/lib/webrat/core/elements/field.rb +404 -0
  12. data/lib/webrat/core/elements/form.rb +132 -0
  13. data/lib/webrat/core/elements/label.rb +31 -0
  14. data/lib/webrat/core/elements/link.rb +90 -0
  15. data/lib/webrat/core/elements/select_option.rb +35 -0
  16. data/lib/webrat/core/locators.rb +20 -0
  17. data/lib/webrat/core/locators/area_locator.rb +38 -0
  18. data/lib/webrat/core/locators/button_locator.rb +54 -0
  19. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  20. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  21. data/lib/webrat/core/locators/field_locator.rb +25 -0
  22. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  23. data/lib/webrat/core/locators/form_locator.rb +19 -0
  24. data/lib/webrat/core/locators/label_locator.rb +34 -0
  25. data/lib/webrat/core/locators/link_locator.rb +66 -0
  26. data/lib/webrat/core/locators/locator.rb +20 -0
  27. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  28. data/lib/webrat/core/logging.rb +21 -0
  29. data/lib/webrat/core/matchers.rb +4 -0
  30. data/lib/webrat/core/matchers/have_content.rb +69 -0
  31. data/lib/webrat/core/matchers/have_selector.rb +52 -0
  32. data/lib/webrat/core/matchers/have_tag.rb +71 -0
  33. data/lib/webrat/core/matchers/have_xpath.rb +93 -0
  34. data/lib/webrat/core/methods.rb +61 -0
  35. data/lib/webrat/core/mime.rb +29 -0
  36. data/lib/webrat/core/save_and_open_page.rb +50 -0
  37. data/lib/webrat/core/scope.rb +350 -0
  38. data/lib/webrat/core/session.rb +259 -0
  39. data/lib/webrat/core/xml.rb +115 -0
  40. data/lib/webrat/core/xml/hpricot.rb +19 -0
  41. data/lib/webrat/core/xml/nokogiri.rb +76 -0
  42. data/lib/webrat/core/xml/rexml.rb +24 -0
  43. data/lib/webrat/core_extensions/blank.rb +58 -0
  44. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  45. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  46. data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +131 -0
  47. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  48. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  49. data/lib/webrat/mechanize.rb +74 -0
  50. data/lib/webrat/merb.rb +9 -0
  51. data/lib/webrat/merb_session.rb +73 -0
  52. data/lib/webrat/rack.rb +24 -0
  53. data/lib/webrat/rails.rb +105 -0
  54. data/lib/webrat/rspec-rails.rb +13 -0
  55. data/lib/webrat/selenium.rb +99 -0
  56. data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
  57. data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  58. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  59. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
  60. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  61. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  62. data/lib/webrat/selenium/matchers.rb +4 -0
  63. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  64. data/lib/webrat/selenium/selenium_session.rb +237 -0
  65. data/lib/webrat/sinatra.rb +30 -0
  66. data/vendor/selenium-server.jar +0 -0
  67. metadata +136 -0
@@ -0,0 +1 @@
1
+ puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
@@ -0,0 +1,34 @@
1
+ require "rubygems"
2
+
3
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
4
+
5
+ module Webrat
6
+ # The common base class for all exceptions raised by Webrat.
7
+ class WebratError < StandardError
8
+ end
9
+
10
+ VERSION = '0.4.1'
11
+
12
+ def self.require_xml
13
+ gem "nokogiri", ">= 1.0.6"
14
+
15
+ if on_java?
16
+ # We need Nokogiri's CSS to XPath support, even if using REXML and Hpricot for parsing and searching
17
+ require "nokogiri/css"
18
+ require "hpricot"
19
+ require "rexml/document"
20
+ else
21
+ require "nokogiri"
22
+ require "webrat/core/xml/nokogiri"
23
+ end
24
+ end
25
+
26
+ def self.on_java?
27
+ RUBY_PLATFORM =~ /java/
28
+ end
29
+
30
+ end
31
+
32
+ Webrat.require_xml
33
+
34
+ require "webrat/core"
@@ -0,0 +1,14 @@
1
+ require "webrat/core/configuration"
2
+ require "webrat/core/xml"
3
+ require "webrat/core/xml/nokogiri"
4
+ require "webrat/core/logging"
5
+ require "webrat/core/elements/form"
6
+ require "webrat/core/scope"
7
+ require "webrat/core/elements/link"
8
+ require "webrat/core/elements/area"
9
+ require "webrat/core/elements/label"
10
+ require "webrat/core/elements/select_option"
11
+ require "webrat/core/session"
12
+ require "webrat/core/methods"
13
+ require "webrat/core/matchers"
14
+ require "webrat/core/save_and_open_page"
@@ -0,0 +1,89 @@
1
+ require "webrat/core_extensions/deprecate"
2
+
3
+ module Webrat
4
+
5
+ # Configures Webrat. If this is not done, Webrat will be created
6
+ # with all of the default settings.
7
+ def self.configure(configuration = Webrat.configuration)
8
+ yield configuration if block_given?
9
+ @@configuration = configuration
10
+ end
11
+
12
+ def self.configuration # :nodoc:
13
+ @@configuration ||= Webrat::Configuration.new
14
+ end
15
+
16
+ # Webrat can be configured using the Webrat.configure method. For example:
17
+ #
18
+ # Webrat.configure do |config|
19
+ # config.parse_with_nokogiri = false
20
+ # end
21
+ class Configuration
22
+
23
+ # Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used
24
+ attr_writer :parse_with_nokogiri
25
+
26
+ # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc.
27
+ attr_reader :mode # :nodoc:
28
+
29
+ # Save and open pages with error status codes (500-599) in a browser? Defualts to true.
30
+ attr_writer :open_error_files
31
+
32
+ # Which rails environment should the selenium tests be run in? Defaults to selenium.
33
+ attr_accessor :application_environment
34
+ webrat_deprecate :selenium_environment, :application_environment
35
+ webrat_deprecate :selenium_environment=, :application_environment=
36
+
37
+ # Which port is the application running on for selenium testing? Defaults to 3001.
38
+ attr_accessor :application_port
39
+ webrat_deprecate :selenium_port, :application_port
40
+ webrat_deprecate :selenium_port=, :application_port=
41
+
42
+ # Which server the application is running on for selenium testing? Defaults to localhost
43
+ attr_accessor :application_address
44
+
45
+ # Which server Selenium server is running on. Defaults to nil(server starts in webrat process and runs locally)
46
+ attr_accessor :selenium_server_address
47
+
48
+ # Which server Selenium port is running on. Defaults to 4444
49
+ attr_accessor :selenium_server_port
50
+
51
+ # Set the key that Selenium uses to determine the browser running. Default *firefox
52
+ attr_accessor :selenium_browser_key
53
+
54
+ def initialize # :nodoc:
55
+ self.open_error_files = true
56
+ self.parse_with_nokogiri = !Webrat.on_java?
57
+ self.application_environment = :selenium
58
+ self.application_port = 3001
59
+ self.application_address = 'localhost'
60
+ self.selenium_server_port = 4444
61
+ self.selenium_browser_key = '*firefox'
62
+ end
63
+
64
+ def parse_with_nokogiri? #:nodoc:
65
+ @parse_with_nokogiri ? true : false
66
+ end
67
+
68
+ def open_error_files? #:nodoc:
69
+ @open_error_files ? true : false
70
+ end
71
+
72
+ # Allows setting of webrat's mode, valid modes are:
73
+ # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
74
+ def mode=(mode)
75
+ @mode = mode.to_sym
76
+
77
+ # This is a temporary hack to support backwards compatibility
78
+ # with Merb 1.0.8 until it's updated to use the new Webrat.configure
79
+ # syntax
80
+ if @mode == :merb
81
+ require("webrat/merb_session")
82
+ else
83
+ require("webrat/#{mode}")
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+ end
@@ -0,0 +1,31 @@
1
+ require "webrat/core/elements/element"
2
+
3
+ module Webrat
4
+ class Area < Element #:nodoc:
5
+
6
+ def self.xpath_search
7
+ ".//area"
8
+ end
9
+
10
+ def click(method = nil, options = {})
11
+ @session.request_page(absolute_href, :get, {})
12
+ end
13
+
14
+ protected
15
+
16
+ def href
17
+ Webrat::XML.attribute(@element, "href")
18
+ end
19
+
20
+ def absolute_href
21
+ if href =~ /^\?/
22
+ "#{@session.current_url}#{href}"
23
+ elsif href !~ %r{^https?://[\w|.]+(/.*)} && (href !~ /^\//)
24
+ "#{@session.current_url}/#{href}"
25
+ else
26
+ href
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ module Webrat
2
+
3
+ class Element # :nodoc:
4
+
5
+ def self.load_all(session, dom)
6
+ Webrat::XML.xpath_search(dom, xpath_search).map do |element|
7
+ load(session, element)
8
+ end
9
+ end
10
+
11
+ def self.load(session, element)
12
+ return nil if element.nil?
13
+ session.elements[Webrat::XML.xpath_to(element)] ||= self.new(session, element)
14
+ end
15
+
16
+ attr_reader :element
17
+
18
+ def initialize(session, element)
19
+ @session = session
20
+ @element = element
21
+ end
22
+
23
+ def path
24
+ Webrat::XML.xpath_to(@element)
25
+ end
26
+
27
+ def inspect
28
+ "#<#{self.class} @element=#{element.inspect}>"
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,404 @@
1
+ require "cgi"
2
+ require "webrat/core_extensions/blank"
3
+ require "webrat/core_extensions/nil_to_param"
4
+
5
+ require "webrat/core/elements/element"
6
+
7
+ module Webrat
8
+ # Raised when Webrat is asked to manipulate a disabled form field
9
+ class DisabledFieldError < WebratError
10
+ end
11
+
12
+ class Field < Element #:nodoc:
13
+ attr_reader :value
14
+
15
+ def self.xpath_search
16
+ [".//button", ".//input", ".//textarea", ".//select"]
17
+ end
18
+
19
+ def self.field_classes
20
+ @field_classes || []
21
+ end
22
+
23
+ def self.inherited(klass)
24
+ @field_classes ||= []
25
+ @field_classes << klass
26
+ # raise args.inspect
27
+ end
28
+
29
+ def self.load(session, element)
30
+ return nil if element.nil?
31
+ session.elements[Webrat::XML.xpath_to(element)] ||= field_class(element).new(session, element)
32
+ end
33
+
34
+ def self.field_class(element)
35
+ case element.name
36
+ when "button" then ButtonField
37
+ when "select" then SelectField
38
+ when "textarea" then TextareaField
39
+ else
40
+ case Webrat::XML.attribute(element, "type")
41
+ when "checkbox" then CheckboxField
42
+ when "hidden" then HiddenField
43
+ when "radio" then RadioField
44
+ when "password" then PasswordField
45
+ when "file" then FileField
46
+ when "reset" then ResetField
47
+ when "submit" then ButtonField
48
+ when "button" then ButtonField
49
+ when "image" then ButtonField
50
+ else TextField
51
+ end
52
+ end
53
+ end
54
+
55
+ def initialize(*args)
56
+ super
57
+ @value = default_value
58
+ end
59
+
60
+ def label_text
61
+ return nil if labels.empty?
62
+ labels.first.text
63
+ end
64
+
65
+ def id
66
+ Webrat::XML.attribute(@element, "id")
67
+ end
68
+
69
+ def disabled?
70
+ @element.attributes.has_key?("disabled") && Webrat::XML.attribute(@element, "disabled") != 'false'
71
+ end
72
+
73
+ def raise_error_if_disabled
74
+ return unless disabled?
75
+ raise DisabledFieldError.new("Cannot interact with disabled form element (#{self})")
76
+ end
77
+
78
+ def to_param
79
+ return nil if disabled?
80
+
81
+ case Webrat.configuration.mode
82
+ when :rails
83
+ rails_request_parser.parse_query_parameters("#{name}=#{escaped_value}")
84
+ when :merb
85
+ ::Merb::Parse.query("#{name}=#{escaped_value}")
86
+ else
87
+ { name => escaped_value }
88
+ end
89
+ end
90
+
91
+ def to_multipart_param
92
+ { name => escaped_value }
93
+ end
94
+
95
+ def set(value)
96
+ @value = value
97
+ end
98
+
99
+ def unset
100
+ @value = default_value
101
+ end
102
+
103
+ def name
104
+ Webrat::XML.attribute(@element, "name")
105
+ end
106
+
107
+ protected
108
+
109
+ def rails_request_parser
110
+ if defined?(ActionController::AbstractRequest)
111
+ ActionController::AbstractRequest
112
+ else
113
+ # For Rails > 2.2
114
+ ActionController::UrlEncodedPairParser
115
+ end
116
+ end
117
+
118
+ def form
119
+ Form.load(@session, form_element)
120
+ end
121
+
122
+ def form_element
123
+ parent = @element.parent
124
+
125
+ while parent.respond_to?(:parent)
126
+ return parent if parent.name == 'form'
127
+ parent = parent.parent
128
+ end
129
+ end
130
+
131
+ def escaped_value
132
+ CGI.escape(@value.to_s)
133
+ end
134
+
135
+ def labels
136
+ @labels ||= label_elements.map do |element|
137
+ Label.load(@session, element)
138
+ end
139
+ end
140
+
141
+ def label_elements
142
+ return @label_elements unless @label_elements.nil?
143
+ @label_elements = []
144
+
145
+ parent = @element.parent
146
+ while parent.respond_to?(:parent)
147
+ if parent.name == 'label'
148
+ @label_elements.push parent
149
+ break
150
+ end
151
+ parent = parent.parent
152
+ end
153
+
154
+ unless id.blank?
155
+ @label_elements += Webrat::XML.xpath_search(form.element, ".//label[@for = '#{id}']")
156
+ end
157
+
158
+ @label_elements
159
+ end
160
+
161
+ def default_value
162
+ Webrat::XML.attribute(@element, "value")
163
+ end
164
+
165
+ def replace_param_value(params, oval, nval)
166
+ output = Hash.new
167
+ params.each do |key, value|
168
+ case value
169
+ when Hash
170
+ value = replace_param_value(value, oval, nval)
171
+ when Array
172
+ value = value.map { |o| o == oval ? nval : oval }
173
+ when oval
174
+ value = nval
175
+ end
176
+ output[key] = value
177
+ end
178
+ output
179
+ end
180
+ end
181
+
182
+ class ButtonField < Field #:nodoc:
183
+
184
+ def self.xpath_search
185
+ [".//button", ".//input[@type = 'submit']", ".//input[@type = 'button']", ".//input[@type = 'image']"]
186
+ end
187
+
188
+ def to_param
189
+ return nil if @value.nil?
190
+ super
191
+ end
192
+
193
+ def default_value
194
+ nil
195
+ end
196
+
197
+ def click
198
+ raise_error_if_disabled
199
+ set(Webrat::XML.attribute(@element, "value")) unless Webrat::XML.attribute(@element, "name").blank?
200
+ form.submit
201
+ end
202
+
203
+ end
204
+
205
+ class HiddenField < Field #:nodoc:
206
+
207
+ def self.xpath_search
208
+ ".//input[@type = 'hidden']"
209
+ end
210
+
211
+ def to_param
212
+ if collection_name?
213
+ super
214
+ else
215
+ checkbox_with_same_name = form.field_named(name, CheckboxField)
216
+
217
+ if checkbox_with_same_name.to_param.blank?
218
+ super
219
+ else
220
+ nil
221
+ end
222
+ end
223
+ end
224
+
225
+ protected
226
+
227
+ def collection_name?
228
+ name =~ /\[\]/
229
+ end
230
+
231
+ end
232
+
233
+ class CheckboxField < Field #:nodoc:
234
+
235
+ def self.xpath_search
236
+ ".//input[@type = 'checkbox']"
237
+ end
238
+
239
+ def to_param
240
+ return nil if @value.nil?
241
+ super
242
+ end
243
+
244
+ def check
245
+ raise_error_if_disabled
246
+ set(Webrat::XML.attribute(@element, "value") || "on")
247
+ end
248
+
249
+ def checked?
250
+ Webrat::XML.attribute(@element, "checked") == "checked"
251
+ end
252
+
253
+ def uncheck
254
+ raise_error_if_disabled
255
+ set(nil)
256
+ end
257
+
258
+ protected
259
+
260
+ def default_value
261
+ if Webrat::XML.attribute(@element, "checked") == "checked"
262
+ Webrat::XML.attribute(@element, "value") || "on"
263
+ else
264
+ nil
265
+ end
266
+ end
267
+
268
+ end
269
+
270
+ class PasswordField < Field #:nodoc:
271
+
272
+ def self.xpath_search
273
+ ".//input[@type = 'password']"
274
+ end
275
+
276
+ end
277
+
278
+ class RadioField < Field #:nodoc:
279
+
280
+ def self.xpath_search
281
+ ".//input[@type = 'radio']"
282
+ end
283
+
284
+ def to_param
285
+ return nil if @value.nil?
286
+ super
287
+ end
288
+
289
+ def choose
290
+ raise_error_if_disabled
291
+ other_options.each do |option|
292
+ option.set(nil)
293
+ end
294
+
295
+ set(Webrat::XML.attribute(@element, "value") || "on")
296
+ end
297
+
298
+ def checked?
299
+ Webrat::XML.attribute(@element, "checked") == "checked"
300
+ end
301
+
302
+ protected
303
+
304
+ def other_options
305
+ form.fields.select { |f| f.name == name }
306
+ end
307
+
308
+ def default_value
309
+ if Webrat::XML.attribute(@element, "checked") == "checked"
310
+ Webrat::XML.attribute(@element, "value") || "on"
311
+ else
312
+ nil
313
+ end
314
+ end
315
+
316
+ end
317
+
318
+ class TextareaField < Field #:nodoc:
319
+
320
+ def self.xpath_search
321
+ ".//textarea"
322
+ end
323
+
324
+ protected
325
+
326
+ def default_value
327
+ Webrat::XML.inner_html(@element)
328
+ end
329
+
330
+ end
331
+
332
+ class FileField < Field #:nodoc:
333
+
334
+ def self.xpath_search
335
+ ".//input[@type = 'file']"
336
+ end
337
+
338
+ attr_accessor :content_type
339
+
340
+ def set(value, content_type = nil)
341
+ super(value)
342
+ @content_type = content_type
343
+ end
344
+
345
+ def to_param
346
+ if @value.nil?
347
+ super
348
+ else
349
+ if Webrat.configuration.mode == :merb
350
+ nil
351
+ else
352
+ replace_param_value(super, @value, test_uploaded_file)
353
+ end
354
+ end
355
+ end
356
+
357
+ protected
358
+
359
+ def test_uploaded_file
360
+ if content_type
361
+ ActionController::TestUploadedFile.new(@value, content_type)
362
+ else
363
+ ActionController::TestUploadedFile.new(@value)
364
+ end
365
+ end
366
+
367
+ end
368
+
369
+ class TextField < Field #:nodoc:
370
+ def self.xpath_search
371
+ [".//input[@type = 'text']", ".//input[not(@type)]"]
372
+ end
373
+ end
374
+
375
+ class ResetField < Field #:nodoc:
376
+ def self.xpath_search
377
+ ".//input[@type = 'reset']"
378
+ end
379
+ end
380
+
381
+ class SelectField < Field #:nodoc:
382
+
383
+ def self.xpath_search
384
+ ".//select"
385
+ end
386
+
387
+ def options
388
+ @options ||= SelectOption.load_all(@session, @element)
389
+ end
390
+
391
+ protected
392
+
393
+ def default_value
394
+ selected_options = Webrat::XML.xpath_search(@element, ".//option[@selected = 'selected']")
395
+ selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
396
+
397
+ selected_options.map do |option|
398
+ return "" if option.nil?
399
+ Webrat::XML.attribute(option, "value") || Webrat::XML.inner_html(option)
400
+ end
401
+ end
402
+
403
+ end
404
+ end