benschwarz-webrat 0.3.2.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 (65) hide show
  1. data/History.txt +184 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.rdoc +81 -0
  4. data/Rakefile +104 -0
  5. data/install.rb +1 -0
  6. data/lib/webrat.rb +34 -0
  7. data/lib/webrat/core.rb +13 -0
  8. data/lib/webrat/core/configuration.rb +44 -0
  9. data/lib/webrat/core/elements/area.rb +31 -0
  10. data/lib/webrat/core/elements/element.rb +29 -0
  11. data/lib/webrat/core/elements/field.rb +386 -0
  12. data/lib/webrat/core/elements/form.rb +103 -0
  13. data/lib/webrat/core/elements/label.rb +31 -0
  14. data/lib/webrat/core/elements/link.rb +94 -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 +50 -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 +55 -0
  31. data/lib/webrat/core/matchers/have_selector.rb +37 -0
  32. data/lib/webrat/core/matchers/have_tag.rb +57 -0
  33. data/lib/webrat/core/matchers/have_xpath.rb +83 -0
  34. data/lib/webrat/core/methods.rb +54 -0
  35. data/lib/webrat/core/mime.rb +29 -0
  36. data/lib/webrat/core/scope.rb +318 -0
  37. data/lib/webrat/core/session.rb +241 -0
  38. data/lib/webrat/core/xml.rb +99 -0
  39. data/lib/webrat/core/xml/hpricot.rb +19 -0
  40. data/lib/webrat/core/xml/nokogiri.rb +44 -0
  41. data/lib/webrat/core/xml/rexml.rb +24 -0
  42. data/lib/webrat/core_extensions/blank.rb +58 -0
  43. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  44. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  45. data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +131 -0
  46. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  47. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  48. data/lib/webrat/mechanize.rb +43 -0
  49. data/lib/webrat/merb.rb +77 -0
  50. data/lib/webrat/rack.rb +26 -0
  51. data/lib/webrat/rails.rb +88 -0
  52. data/lib/webrat/rails/redirect_actions.rb +18 -0
  53. data/lib/webrat/rspec-rails.rb +13 -0
  54. data/lib/webrat/selenium.rb +58 -0
  55. data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
  56. data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  57. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  58. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
  59. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  60. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  61. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  62. data/lib/webrat/selenium/selenium_session.rb +186 -0
  63. data/lib/webrat/sinatra.rb +21 -0
  64. data/vendor/selenium-server.jar +0 -0
  65. metadata +144 -0
@@ -0,0 +1,31 @@
1
+ require "webrat/core/elements/element"
2
+
3
+ module Webrat
4
+ class Label < Element #:nodoc:
5
+
6
+ attr_reader :element
7
+
8
+ def self.xpath_search
9
+ ".//label"
10
+ end
11
+
12
+ def for_id
13
+ Webrat::XML.attribute(@element, "for")
14
+ end
15
+
16
+ def field
17
+ Field.load(@session, field_element)
18
+ end
19
+
20
+ protected
21
+
22
+ def field_element
23
+ if for_id.blank?
24
+ Webrat::XML.xpath_at(@element, *Field.xpath_search)
25
+ else
26
+ Webrat::XML.css_search(@session.dom, "#" + for_id).first
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,94 @@
1
+ require "webrat/core_extensions/blank"
2
+
3
+ require "webrat/core/elements/element"
4
+
5
+ module Webrat
6
+ class Link < Element #:nodoc:
7
+
8
+ def self.xpath_search
9
+ ".//a[@href]"
10
+ end
11
+
12
+ def self.css_search
13
+ "a[@href]"
14
+ end
15
+
16
+ def click(options = {})
17
+ method = options[:method] || http_method
18
+ return if href =~ /^#/ && method == :get
19
+
20
+ options[:javascript] = true if options[:javascript].nil?
21
+
22
+ if options[:javascript]
23
+ @session.request_page(absolute_href, method, data)
24
+ else
25
+ @session.request_page(absolute_href, :get, {})
26
+ end
27
+ end
28
+
29
+ protected
30
+
31
+ def id
32
+ Webrat::XML.attribute(@element, "id")
33
+ end
34
+
35
+ def data
36
+ authenticity_token.blank? ? {} : {"authenticity_token" => authenticity_token}
37
+ end
38
+
39
+ def title
40
+ Webrat::XML.attribute(@element, "title")
41
+ end
42
+
43
+ def href
44
+ Webrat::XML.attribute(@element, "href")
45
+ end
46
+
47
+ def absolute_href
48
+ if href =~ /^\?/
49
+ "#{@session.current_url}#{href}"
50
+ elsif href !~ %r{^https?://} && (href !~ /^\//)
51
+ "#{@session.current_url}/#{href}"
52
+ else
53
+ href
54
+ end
55
+ end
56
+
57
+ def authenticity_token
58
+ return unless onclick && onclick.include?("s.setAttribute('name', 'authenticity_token');") &&
59
+ onclick =~ /s\.setAttribute\('value', '([a-f0-9]{40})'\);/
60
+ $LAST_MATCH_INFO.captures.first
61
+ end
62
+
63
+ def onclick
64
+ Webrat::XML.attribute(@element, "onclick")
65
+ end
66
+
67
+ def http_method
68
+ if !onclick.blank? && onclick.include?("f.submit()")
69
+ http_method_from_js_form
70
+ else
71
+ :get
72
+ end
73
+ end
74
+
75
+ def http_method_from_js_form
76
+ if onclick.include?("m.setAttribute('name', '_method')")
77
+ http_method_from_fake_method_param
78
+ else
79
+ :post
80
+ end
81
+ end
82
+
83
+ def http_method_from_fake_method_param
84
+ if onclick.include?("m.setAttribute('value', 'delete')")
85
+ :delete
86
+ elsif onclick.include?("m.setAttribute('value', 'put')")
87
+ :put
88
+ else
89
+ raise Webrat::WebratError.new("No HTTP method for _method param in #{onclick.inspect}")
90
+ end
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,35 @@
1
+ require "webrat/core/elements/element"
2
+
3
+ module Webrat
4
+ class SelectOption < Element #:nodoc:
5
+
6
+ def self.xpath_search
7
+ ".//option"
8
+ end
9
+
10
+ def choose
11
+ select.raise_error_if_disabled
12
+ select.set(value)
13
+ end
14
+
15
+ protected
16
+
17
+ def select
18
+ SelectField.load(@session, select_element)
19
+ end
20
+
21
+ def select_element
22
+ parent = @element.parent
23
+
24
+ while parent.respond_to?(:parent)
25
+ return parent if parent.name == 'select'
26
+ parent = parent.parent
27
+ end
28
+ end
29
+
30
+ def value
31
+ Webrat::XML.attribute(@element, "value") || Webrat::XML.inner_html(@element)
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ require "webrat/core/locators/area_locator"
2
+ require "webrat/core/locators/button_locator"
3
+ require "webrat/core/locators/field_labeled_locator"
4
+ require "webrat/core/locators/label_locator"
5
+ require "webrat/core/locators/field_named_locator"
6
+ require "webrat/core/locators/field_by_id_locator"
7
+ require "webrat/core/locators/select_option_locator"
8
+ require "webrat/core/locators/link_locator"
9
+ require "webrat/core/locators/field_locator"
10
+ require "webrat/core/locators/form_locator"
11
+
12
+ module Webrat
13
+ module Locators
14
+
15
+ def field_by_xpath(xpath)
16
+ Field.load(@session, Webrat::XML.xpath_at(dom, xpath))
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,38 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class AreaLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Area.load(@session, area_element)
10
+ end
11
+
12
+ def area_element
13
+ area_elements.detect do |area_element|
14
+ Webrat::XML.attribute(area_element, "title") =~ matcher ||
15
+ Webrat::XML.attribute(area_element, "id") =~ matcher
16
+ end
17
+ end
18
+
19
+ def matcher
20
+ /#{Regexp.escape(@value.to_s)}/i
21
+ end
22
+
23
+ def area_elements
24
+ Webrat::XML.xpath_search(@dom, Area.xpath_search)
25
+ end
26
+
27
+ def error_message
28
+ "Could not find area with name #{@value}"
29
+ end
30
+
31
+ end
32
+
33
+ def find_area(id_or_title) #:nodoc:
34
+ AreaLocator.new(@session, dom, id_or_title).locate!
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,54 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class ButtonLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ ButtonField.load(@session, button_element)
10
+ end
11
+
12
+ def button_element
13
+ button_elements.detect do |element|
14
+ @value.nil? ||
15
+ matches_id?(element) ||
16
+ matches_value?(element) ||
17
+ matches_html?(element) ||
18
+ matches_alt?(element)
19
+ end
20
+ end
21
+
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)
25
+ end
26
+
27
+ def matches_value?(element)
28
+ Webrat::XML.attribute(element, "value") =~ /^\W*#{Regexp.escape(@value.to_s)}/i
29
+ end
30
+
31
+ def matches_html?(element)
32
+ Webrat::XML.inner_html(element) =~ /#{Regexp.escape(@value.to_s)}/i
33
+ end
34
+
35
+ def matches_alt?(element)
36
+ Webrat::XML.attribute(element, "alt") =~ /^\W*#{Regexp.escape(@value.to_s)}/i
37
+ end
38
+
39
+ def button_elements
40
+ Webrat::XML.xpath_search(@dom, *ButtonField.xpath_search)
41
+ end
42
+
43
+ def error_message
44
+ "Could not find button #{@value.inspect}"
45
+ end
46
+
47
+ end
48
+
49
+ def find_button(value) #:nodoc:
50
+ ButtonLocator.new(@session, dom, value).locate!
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,37 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FieldByIdLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Field.load(@session, field_element)
10
+ end
11
+
12
+ def field_element
13
+ field_elements.detect do |field_element|
14
+ if @value.is_a?(Regexp)
15
+ Webrat::XML.attribute(field_element, "id") =~ @value
16
+ else
17
+ Webrat::XML.attribute(field_element, "id") == @value.to_s
18
+ end
19
+ end
20
+ end
21
+
22
+ def field_elements
23
+ Webrat::XML.xpath_search(@dom, *Field.xpath_search)
24
+ end
25
+
26
+ def error_message
27
+ "Could not find field with id #{@value.inspect}"
28
+ end
29
+
30
+ end
31
+
32
+ def field_with_id(id, *field_types)
33
+ FieldByIdLocator.new(@session, dom, id, *field_types).locate!
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,50 @@
1
+ require "webrat/core_extensions/detect_mapped"
2
+ require "webrat/core/locators/locator"
3
+
4
+ module Webrat
5
+ module Locators
6
+
7
+ class FieldLabeledLocator < Locator # :nodoc:
8
+
9
+ def locate
10
+ matching_labels.any? && matching_labels.first.field
11
+ end
12
+
13
+ def matching_labels
14
+ matching_label_elements.sort_by do |label_element|
15
+ text(label_element).length
16
+ end.map do |label_element|
17
+ Label.load(@session, label_element)
18
+ end
19
+ end
20
+
21
+ def matching_label_elements
22
+ label_elements.select do |label_element|
23
+ text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}\b/i
24
+ end
25
+ end
26
+
27
+ def label_elements
28
+ Webrat::XML.xpath_search(@dom, Label.xpath_search)
29
+ end
30
+
31
+ def error_message
32
+ "Could not find field labeled #{@value.inspect}"
33
+ end
34
+
35
+ def text(element)
36
+ str = Webrat::XML.all_inner_text(element)
37
+ str.gsub!("\n","")
38
+ str.strip!
39
+ str.squeeze!(" ")
40
+ str
41
+ end
42
+
43
+ end
44
+
45
+ def field_labeled(label, *field_types)
46
+ FieldLabeledLocator.new(@session, dom, label, *field_types).locate!
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,25 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FieldLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ FieldByIdLocator.new(@session, @dom, @value).locate ||
10
+ FieldNamedLocator.new(@session, @dom, @value, *@field_types).locate ||
11
+ FieldLabeledLocator.new(@session, @dom, @value, *@field_types).locate
12
+ end
13
+
14
+ def error_message
15
+ "Could not find field: #{@value.inspect}"
16
+ end
17
+
18
+ end
19
+
20
+ def field(*args) # :nodoc:
21
+ FieldLocator.new(@session, dom, *args).locate!
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FieldNamedLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Field.load(@session, field_element)
10
+ end
11
+
12
+ def field_element
13
+ field_elements.detect do |field_element|
14
+ Webrat::XML.attribute(field_element, "name") == @value.to_s
15
+ end
16
+ end
17
+
18
+ def field_elements
19
+ Webrat::XML.xpath_search(@dom, *xpath_searches)
20
+ end
21
+
22
+ def xpath_searches
23
+ if @field_types.any?
24
+ @field_types.map { |field_type| field_type.xpath_search }.flatten
25
+ else
26
+ Array(Field.xpath_search)
27
+ end
28
+ end
29
+
30
+ def error_message
31
+ "Could not find field named #{@value.inspect}"
32
+ end
33
+
34
+ end
35
+
36
+ def field_named(name, *field_types)
37
+ FieldNamedLocator.new(@session, dom, name, *field_types).locate!
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FormLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Form.load(@session, form_element)
10
+ end
11
+
12
+ def form_element
13
+ Webrat::XML.css_at(@dom, "#" + @value)
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end