dbrady-webrat 0.4.4

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 (70) hide show
  1. data/History.txt +325 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.rdoc +85 -0
  4. data/Rakefile +156 -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 +98 -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 +403 -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 +92 -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 +73 -0
  31. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  32. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  33. data/lib/webrat/core/matchers/have_xpath.rb +147 -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 +281 -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/meta_class.rb +6 -0
  47. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  48. data/lib/webrat/mechanize.rb +74 -0
  49. data/lib/webrat/merb.rb +9 -0
  50. data/lib/webrat/merb_session.rb +65 -0
  51. data/lib/webrat/rack.rb +24 -0
  52. data/lib/webrat/rails.rb +105 -0
  53. data/lib/webrat/rspec-rails.rb +13 -0
  54. data/lib/webrat/selenium.rb +80 -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/matchers.rb +4 -0
  62. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  63. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  64. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  65. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  66. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  67. data/lib/webrat/selenium/selenium_session.rb +241 -0
  68. data/lib/webrat/sinatra.rb +53 -0
  69. data/vendor/selenium-server.jar +0 -0
  70. metadata +141 -0
@@ -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
@@ -0,0 +1,34 @@
1
+ require "webrat/core_extensions/detect_mapped"
2
+ require "webrat/core/locators/locator"
3
+
4
+ module Webrat
5
+ module Locators
6
+
7
+ class LabelLocator < Locator # :nodoc:
8
+
9
+ def locate
10
+ Label.load(@session, label_element)
11
+ end
12
+
13
+ def label_element
14
+ label_elements.detect do |label_element|
15
+ text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}\b/i
16
+ end
17
+ end
18
+
19
+ def label_elements
20
+ Webrat::XML.xpath_search(@dom, Label.xpath_search)
21
+ end
22
+
23
+ def text(label_element)
24
+ str = Webrat::XML.all_inner_text(label_element)
25
+ str.gsub!("\n","")
26
+ str.strip!
27
+ str.squeeze!(" ")
28
+ str
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,66 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class LinkLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Link.load(@session, link_element)
10
+ end
11
+
12
+ def link_element
13
+ matching_links.min { |a, b| Webrat::XML.all_inner_text(a).length <=> Webrat::XML.all_inner_text(b).length }
14
+ end
15
+
16
+ def matching_links
17
+ @matching_links ||= link_elements.select do |link_element|
18
+ matches_text?(link_element) ||
19
+ matches_id?(link_element)
20
+ end
21
+ end
22
+
23
+ def matches_text?(link)
24
+ if @value.is_a?(Regexp)
25
+ matcher = @value
26
+ else
27
+ matcher = /#{Regexp.escape(@value.to_s)}/i
28
+ end
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
33
+ end
34
+
35
+ def matches_id?(link)
36
+ if @value.is_a?(Regexp)
37
+ (Webrat::XML.attribute(link, "id") =~ @value) ? true : false
38
+ else
39
+ (Webrat::XML.attribute(link, "id") == @value) ? true : false
40
+ end
41
+ end
42
+
43
+ def link_elements
44
+ Webrat::XML.xpath_search(@dom, *Link.xpath_search)
45
+ end
46
+
47
+ def replace_nbsp(str)
48
+ str.gsub([0xA0].pack('U'), ' ')
49
+ end
50
+
51
+ def replace_nbsp_ref(str)
52
+ str.gsub('&#xA0;',' ').gsub('&nbsp;', ' ')
53
+ end
54
+
55
+ def error_message
56
+ "Could not find link with text or title or id #{@value.inspect}"
57
+ end
58
+
59
+ end
60
+
61
+ def find_link(text_or_title_or_id) #:nodoc:
62
+ LinkLocator.new(@session, dom, text_or_title_or_id).locate!
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,20 @@
1
+ module Webrat
2
+ module Locators
3
+
4
+ class Locator # :nodoc:
5
+
6
+ def initialize(session, dom, value, *field_types)
7
+ @session = session
8
+ @dom = dom
9
+ @value = value
10
+ @field_types = field_types
11
+ end
12
+
13
+ def locate!
14
+ locate || raise(NotFoundError.new(error_message))
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,59 @@
1
+ require "webrat/core_extensions/detect_mapped"
2
+ require "webrat/core/locators/locator"
3
+
4
+ module Webrat
5
+ module Locators
6
+
7
+ class SelectOptionLocator < Locator # :nodoc:
8
+
9
+ def initialize(session, dom, option_text, id_or_name_or_label)
10
+ @session = session
11
+ @dom = dom
12
+ @option_text = option_text
13
+ @id_or_name_or_label = id_or_name_or_label
14
+ end
15
+
16
+ def locate
17
+ if @id_or_name_or_label
18
+ field = FieldLocator.new(@session, @dom, @id_or_name_or_label, SelectField).locate!
19
+
20
+ field.options.detect do |o|
21
+ if @option_text.is_a?(Regexp)
22
+ Webrat::XML.inner_html(o.element) =~ @option_text
23
+ else
24
+ Webrat::XML.inner_html(o.element) == @option_text.to_s
25
+ end
26
+ end
27
+ else
28
+ option_element = option_elements.detect do |o|
29
+ if @option_text.is_a?(Regexp)
30
+ Webrat::XML.inner_html(o) =~ @option_text
31
+ else
32
+ Webrat::XML.inner_html(o) == @option_text.to_s
33
+ end
34
+ end
35
+
36
+ SelectOption.load(@session, option_element)
37
+ end
38
+ end
39
+
40
+ def option_elements
41
+ Webrat::XML.xpath_search(@dom, *SelectOption.xpath_search)
42
+ end
43
+
44
+ def error_message
45
+ if @id_or_name_or_label
46
+ "The '#{@option_text}' option was not found in the #{@id_or_name_or_label.inspect} select box"
47
+ else
48
+ "Could not find option #{@option_text.inspect}"
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ def select_option(option_text, id_or_name_or_label = nil) #:nodoc:
55
+ SelectOptionLocator.new(@session, dom, option_text, id_or_name_or_label).locate!
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,21 @@
1
+ module Webrat
2
+ module Logging #:nodoc:
3
+
4
+ def debug_log(message) # :nodoc:
5
+ return unless logger
6
+ logger.debug message
7
+ end
8
+
9
+ def logger # :nodoc:
10
+ case Webrat.configuration.mode
11
+ when :rails
12
+ defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : nil
13
+ when :merb
14
+ Merb.logger
15
+ else
16
+ nil
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,4 @@
1
+ require "webrat/core/matchers/have_xpath"
2
+ require "webrat/core/matchers/have_selector"
3
+ require "webrat/core/matchers/have_tag"
4
+ require "webrat/core/matchers/have_content"
@@ -0,0 +1,73 @@
1
+ module Webrat
2
+ module Matchers
3
+
4
+ class HasContent #:nodoc:
5
+ def initialize(content)
6
+ @content = content
7
+ end
8
+
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)
17
+
18
+ case @content
19
+ when String
20
+ @element.include?(@content)
21
+ when Regexp
22
+ @element.match(@content)
23
+ end
24
+ end
25
+
26
+ # ==== Returns
27
+ # String:: The failure message.
28
+ def failure_message
29
+ "expected the following element's content to #{content_message}:\n#{squeeze_space(@element)}"
30
+ end
31
+
32
+ # ==== Returns
33
+ # String:: The failure message to be displayed in negative matches.
34
+ def negative_failure_message
35
+ "expected the following element's content to not #{content_message}:\n#{squeeze_space(@element)}"
36
+ end
37
+
38
+ def squeeze_space(inner_text)
39
+ inner_text.gsub(/^\s*$/, "").squeeze("\n")
40
+ end
41
+
42
+ def content_message
43
+ case @content
44
+ when String
45
+ "include \"#{@content}\""
46
+ when Regexp
47
+ "match #{@content.inspect}"
48
+ end
49
+ end
50
+ end
51
+
52
+ # Matches the contents of an HTML document with
53
+ # whatever string is supplied
54
+ def contain(content)
55
+ HasContent.new(content)
56
+ end
57
+
58
+ # Asserts that the body of the response contain
59
+ # the supplied string or regexp
60
+ def assert_contain(content)
61
+ hc = HasContent.new(content)
62
+ assert hc.matches?(response_body), hc.failure_message
63
+ end
64
+
65
+ # Asserts that the body of the response
66
+ # does not contain the supplied string or regepx
67
+ def assert_not_contain(content)
68
+ hc = HasContent.new(content)
69
+ assert !hc.matches?(response_body), hc.negative_failure_message
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,74 @@
1
+ require "webrat/core/matchers/have_xpath"
2
+
3
+ module Webrat
4
+ module Matchers
5
+
6
+ class HaveSelector < HaveXpath #:nodoc:
7
+ # ==== Returns
8
+ # String:: The failure message.
9
+ def failure_message
10
+ "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
11
+ end
12
+
13
+ # ==== Returns
14
+ # String:: The failure message to be displayed in negative matches.
15
+ def negative_failure_message
16
+ "expected following output to omit a #{tag_inspect}:\n#{@document}"
17
+ end
18
+
19
+ def tag_inspect
20
+ options = @options.dup
21
+ count = options.delete(:count)
22
+ content = options.delete(:content)
23
+
24
+ html = "<#{@expected}"
25
+ options.each do |k,v|
26
+ html << " #{k}='#{v}'"
27
+ end
28
+
29
+ if content
30
+ html << ">#{content}</#{@expected}>"
31
+ else
32
+ html << "/>"
33
+ end
34
+
35
+ html
36
+ end
37
+
38
+ def query
39
+ Nokogiri::CSS.parse(@expected.to_s).map do |ast|
40
+ ast.to_xpath
41
+ end.first
42
+ end
43
+
44
+ end
45
+
46
+ # Matches HTML content against a CSS 3 selector.
47
+ #
48
+ # ==== Parameters
49
+ # expected<String>:: The CSS selector to look for.
50
+ #
51
+ # ==== Returns
52
+ # HaveSelector:: A new have selector matcher.
53
+ def have_selector(name, attributes = {}, &block)
54
+ HaveSelector.new(name, attributes, &block)
55
+ end
56
+ alias_method :match_selector, :have_selector
57
+
58
+
59
+ # Asserts that the body of the response contains
60
+ # the supplied selector
61
+ def assert_have_selector(name, attributes = {}, &block)
62
+ matcher = HaveSelector.new(name, attributes, &block)
63
+ assert matcher.matches?(response_body), matcher.failure_message
64
+ end
65
+
66
+ # Asserts that the body of the response
67
+ # does not contain the supplied string or regepx
68
+ def assert_have_no_selector(name, attributes = {}, &block)
69
+ matcher = HaveSelector.new(name, attributes, &block)
70
+ assert !matcher.matches?(response_body), matcher.negative_failure_message
71
+ end
72
+
73
+ end
74
+ end