aslakhellesoy-webrat 0.3.2.2 → 0.4.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 (70) hide show
  1. data/History.txt +158 -19
  2. data/Rakefile +36 -11
  3. data/lib/webrat.rb +8 -11
  4. data/lib/webrat/core/configuration.rb +67 -25
  5. data/lib/webrat/core/elements/area.rb +7 -7
  6. data/lib/webrat/core/elements/element.rb +11 -11
  7. data/lib/webrat/core/elements/field.rb +70 -51
  8. data/lib/webrat/core/elements/form.rb +17 -17
  9. data/lib/webrat/core/elements/label.rb +8 -8
  10. data/lib/webrat/core/elements/link.rb +13 -11
  11. data/lib/webrat/core/elements/select_option.rb +9 -9
  12. data/lib/webrat/core/locators.rb +2 -2
  13. data/lib/webrat/core/locators/area_locator.rb +10 -10
  14. data/lib/webrat/core/locators/button_locator.rb +13 -13
  15. data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
  16. data/lib/webrat/core/locators/field_labeled_locator.rb +19 -13
  17. data/lib/webrat/core/locators/field_locator.rb +7 -7
  18. data/lib/webrat/core/locators/field_named_locator.rb +10 -10
  19. data/lib/webrat/core/locators/form_locator.rb +6 -6
  20. data/lib/webrat/core/locators/label_locator.rb +9 -9
  21. data/lib/webrat/core/locators/link_locator.rb +12 -12
  22. data/lib/webrat/core/locators/locator.rb +5 -5
  23. data/lib/webrat/core/locators/select_option_locator.rb +11 -11
  24. data/lib/webrat/core/logging.rb +7 -4
  25. data/lib/webrat/core/matchers/have_content.rb +19 -15
  26. data/lib/webrat/core/matchers/have_selector.rb +44 -22
  27. data/lib/webrat/core/matchers/have_tag.rb +11 -61
  28. data/lib/webrat/core/matchers/have_xpath.rb +89 -35
  29. data/lib/webrat/core/methods.rb +13 -11
  30. data/lib/webrat/core/mime.rb +3 -3
  31. data/lib/webrat/core/save_and_open_page.rb +9 -9
  32. data/lib/webrat/core/scope.rb +82 -62
  33. data/lib/webrat/core/session.rb +61 -18
  34. data/lib/webrat/core/xml.rb +16 -16
  35. data/lib/webrat/core/xml/hpricot.rb +3 -3
  36. data/lib/webrat/core/xml/nokogiri.rb +14 -14
  37. data/lib/webrat/core/xml/rexml.rb +3 -3
  38. data/lib/webrat/core_extensions/blank.rb +1 -1
  39. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  40. data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
  41. data/lib/webrat/core_extensions/meta_class.rb +1 -1
  42. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  43. data/lib/webrat/mechanize.rb +9 -9
  44. data/lib/webrat/merb.rb +5 -61
  45. data/lib/webrat/merb_session.rb +67 -0
  46. data/lib/webrat/rack.rb +45 -14
  47. data/lib/webrat/rails.rb +31 -11
  48. data/lib/webrat/rspec-rails.rb +2 -2
  49. data/lib/webrat/selenium.rb +27 -39
  50. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  51. data/lib/webrat/selenium/application_servers.rb +5 -0
  52. data/lib/webrat/selenium/application_servers/base.rb +44 -0
  53. data/lib/webrat/selenium/application_servers/external.rb +24 -0
  54. data/lib/webrat/selenium/application_servers/merb.rb +48 -0
  55. data/lib/webrat/selenium/application_servers/rails.rb +42 -0
  56. data/lib/webrat/selenium/application_servers/sinatra.rb +35 -0
  57. data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
  58. data/lib/webrat/selenium/location_strategy_javascript/label.js +1 -2
  59. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
  60. data/lib/webrat/selenium/matchers.rb +4 -108
  61. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  62. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  63. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  64. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  65. data/lib/webrat/selenium/selenium_rc_server.rb +84 -0
  66. data/lib/webrat/selenium/selenium_session.rb +86 -68
  67. data/lib/webrat/selenium/silence_stream.rb +18 -0
  68. metadata +21 -16
  69. data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +0 -131
  70. data/lib/webrat/sinatra.rb +0 -29
@@ -2,18 +2,18 @@ require "webrat/core/locators/locator"
2
2
 
3
3
  module Webrat
4
4
  module Locators
5
-
5
+
6
6
  class FormLocator < Locator # :nodoc:
7
-
7
+
8
8
  def locate
9
9
  Form.load(@session, form_element)
10
10
  end
11
-
11
+
12
12
  def form_element
13
13
  Webrat::XML.css_at(@dom, "#" + @value)
14
14
  end
15
-
15
+
16
16
  end
17
-
17
+
18
18
  end
19
- end
19
+ end
@@ -3,23 +3,23 @@ require "webrat/core/locators/locator"
3
3
 
4
4
  module Webrat
5
5
  module Locators
6
-
6
+
7
7
  class LabelLocator < Locator # :nodoc:
8
-
8
+
9
9
  def locate
10
10
  Label.load(@session, label_element)
11
11
  end
12
-
12
+
13
13
  def label_element
14
14
  label_elements.detect do |label_element|
15
- text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}\b/i
15
+ text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
16
16
  end
17
17
  end
18
-
18
+
19
19
  def label_elements
20
20
  Webrat::XML.xpath_search(@dom, Label.xpath_search)
21
21
  end
22
-
22
+
23
23
  def text(label_element)
24
24
  str = Webrat::XML.all_inner_text(label_element)
25
25
  str.gsub!("\n","")
@@ -27,8 +27,8 @@ module Webrat
27
27
  str.squeeze!(" ")
28
28
  str
29
29
  end
30
-
30
+
31
31
  end
32
-
32
+
33
33
  end
34
- end
34
+ end
@@ -2,24 +2,24 @@ require "webrat/core/locators/locator"
2
2
 
3
3
  module Webrat
4
4
  module Locators
5
-
5
+
6
6
  class LinkLocator < Locator # :nodoc:
7
-
7
+
8
8
  def locate
9
9
  Link.load(@session, link_element)
10
10
  end
11
-
11
+
12
12
  def link_element
13
13
  matching_links.min { |a, b| Webrat::XML.all_inner_text(a).length <=> Webrat::XML.all_inner_text(b).length }
14
14
  end
15
-
15
+
16
16
  def matching_links
17
17
  @matching_links ||= link_elements.select do |link_element|
18
18
  matches_text?(link_element) ||
19
19
  matches_id?(link_element)
20
20
  end
21
21
  end
22
-
22
+
23
23
  def matches_text?(link)
24
24
  if @value.is_a?(Regexp)
25
25
  matcher = @value
@@ -39,11 +39,11 @@ module Webrat
39
39
  (Webrat::XML.attribute(link, "id") == @value) ? true : false
40
40
  end
41
41
  end
42
-
42
+
43
43
  def link_elements
44
44
  Webrat::XML.xpath_search(@dom, *Link.xpath_search)
45
45
  end
46
-
46
+
47
47
  def replace_nbsp(str)
48
48
  str.gsub([0xA0].pack('U'), ' ')
49
49
  end
@@ -51,16 +51,16 @@ module Webrat
51
51
  def replace_nbsp_ref(str)
52
52
  str.gsub('&#xA0;',' ').gsub('&nbsp;', ' ')
53
53
  end
54
-
54
+
55
55
  def error_message
56
56
  "Could not find link with text or title or id #{@value.inspect}"
57
57
  end
58
-
58
+
59
59
  end
60
-
60
+
61
61
  def find_link(text_or_title_or_id) #:nodoc:
62
62
  LinkLocator.new(@session, dom, text_or_title_or_id).locate!
63
63
  end
64
-
64
+
65
65
  end
66
- end
66
+ end
@@ -1,6 +1,6 @@
1
1
  module Webrat
2
2
  module Locators
3
-
3
+
4
4
  class Locator # :nodoc:
5
5
 
6
6
  def initialize(session, dom, value, *field_types)
@@ -9,12 +9,12 @@ module Webrat
9
9
  @value = value
10
10
  @field_types = field_types
11
11
  end
12
-
12
+
13
13
  def locate!
14
14
  locate || raise(NotFoundError.new(error_message))
15
15
  end
16
-
16
+
17
17
  end
18
-
18
+
19
19
  end
20
- end
20
+ end
@@ -3,20 +3,20 @@ require "webrat/core/locators/locator"
3
3
 
4
4
  module Webrat
5
5
  module Locators
6
-
6
+
7
7
  class SelectOptionLocator < Locator # :nodoc:
8
-
8
+
9
9
  def initialize(session, dom, option_text, id_or_name_or_label)
10
10
  @session = session
11
11
  @dom = dom
12
12
  @option_text = option_text
13
13
  @id_or_name_or_label = id_or_name_or_label
14
14
  end
15
-
15
+
16
16
  def locate
17
17
  if @id_or_name_or_label
18
18
  field = FieldLocator.new(@session, @dom, @id_or_name_or_label, SelectField).locate!
19
-
19
+
20
20
  field.options.detect do |o|
21
21
  if @option_text.is_a?(Regexp)
22
22
  Webrat::XML.inner_html(o.element) =~ @option_text
@@ -32,15 +32,15 @@ module Webrat
32
32
  Webrat::XML.inner_html(o) == @option_text.to_s
33
33
  end
34
34
  end
35
-
35
+
36
36
  SelectOption.load(@session, option_element)
37
37
  end
38
38
  end
39
-
39
+
40
40
  def option_elements
41
41
  Webrat::XML.xpath_search(@dom, *SelectOption.xpath_search)
42
42
  end
43
-
43
+
44
44
  def error_message
45
45
  if @id_or_name_or_label
46
46
  "The '#{@option_text}' option was not found in the #{@id_or_name_or_label.inspect} select box"
@@ -48,12 +48,12 @@ module Webrat
48
48
  "Could not find option #{@option_text.inspect}"
49
49
  end
50
50
  end
51
-
51
+
52
52
  end
53
-
53
+
54
54
  def select_option(option_text, id_or_name_or_label = nil) #:nodoc:
55
55
  SelectOptionLocator.new(@session, dom, option_text, id_or_name_or_label).locate!
56
56
  end
57
-
57
+
58
58
  end
59
- end
59
+ end
@@ -1,6 +1,6 @@
1
1
  module Webrat
2
2
  module Logging #:nodoc:
3
-
3
+
4
4
  def debug_log(message) # :nodoc:
5
5
  return unless logger
6
6
  logger.debug message
@@ -13,9 +13,12 @@ module Webrat
13
13
  when :merb
14
14
  Merb.logger
15
15
  else
16
- nil
16
+ @logger ||= begin
17
+ require "logger"
18
+ ::Logger.new("webrat.log")
19
+ end
17
20
  end
18
21
  end
19
-
22
+
20
23
  end
21
- end
24
+ end
@@ -1,20 +1,20 @@
1
1
  module Webrat
2
2
  module Matchers
3
-
3
+
4
4
  class HasContent #:nodoc:
5
5
  def initialize(content)
6
6
  @content = content
7
7
  end
8
-
8
+
9
9
  def matches?(stringlike)
10
10
  if Webrat.configuration.parse_with_nokogiri?
11
11
  @document = Webrat.nokogiri_document(stringlike)
12
12
  else
13
13
  @document = Webrat.hpricot_document(stringlike)
14
14
  end
15
-
15
+
16
16
  @element = Webrat::XML.inner_text(@document)
17
-
17
+
18
18
  case @content
19
19
  when String
20
20
  @element.include?(@content)
@@ -22,19 +22,23 @@ module Webrat
22
22
  @element.match(@content)
23
23
  end
24
24
  end
25
-
25
+
26
26
  # ==== Returns
27
27
  # String:: The failure message.
28
28
  def failure_message
29
- "expected the following element's content to #{content_message}:\n#{@element}"
29
+ "expected the following element's content to #{content_message}:\n#{squeeze_space(@element)}"
30
30
  end
31
31
 
32
32
  # ==== Returns
33
33
  # String:: The failure message to be displayed in negative matches.
34
34
  def negative_failure_message
35
- "expected the following element's content to not #{content_message}:\n#{@element}"
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")
36
40
  end
37
-
41
+
38
42
  def content_message
39
43
  case @content
40
44
  when String
@@ -44,26 +48,26 @@ module Webrat
44
48
  end
45
49
  end
46
50
  end
47
-
51
+
48
52
  # Matches the contents of an HTML document with
49
53
  # whatever string is supplied
50
54
  def contain(content)
51
55
  HasContent.new(content)
52
56
  end
53
-
57
+
54
58
  # Asserts that the body of the response contain
55
59
  # the supplied string or regexp
56
60
  def assert_contain(content)
57
61
  hc = HasContent.new(content)
58
- raise Test::Unit::AssertionFailedError.new(hc.failure_message) unless hc.matches?(response_body)
62
+ assert hc.matches?(response_body), hc.failure_message
59
63
  end
60
-
64
+
61
65
  # Asserts that the body of the response
62
66
  # does not contain the supplied string or regepx
63
67
  def assert_not_contain(content)
64
68
  hc = HasContent.new(content)
65
- raise Test::Unit::AssertionFailedError.new(hc.negative_failure_message) if hc.matches?(response_body)
69
+ assert !hc.matches?(response_body), hc.negative_failure_message
66
70
  end
67
-
71
+
68
72
  end
69
- end
73
+ end
@@ -1,26 +1,48 @@
1
+ require "webrat/core/matchers/have_xpath"
2
+
1
3
  module Webrat
2
4
  module Matchers
3
-
4
- class HaveSelector < HaveXpath #:nodoc:
5
5
 
6
+ class HaveSelector < HaveXpath #:nodoc:
6
7
  # ==== Returns
7
8
  # String:: The failure message.
8
9
  def failure_message
9
- "expected following text to match selector #{@expected}:\n#{@document}"
10
+ "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
10
11
  end
11
-
12
+
12
13
  # ==== Returns
13
14
  # String:: The failure message to be displayed in negative matches.
14
15
  def negative_failure_message
15
- "expected following text to not match selector #{@expected}:\n#{@document}"
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
16
36
  end
17
-
37
+
18
38
  def query
19
- Nokogiri::CSS::Parser.parse(*super).map { |ast| ast.to_xpath }
39
+ Nokogiri::CSS.parse(@expected.to_s).map do |ast|
40
+ ast.to_xpath
41
+ end.first
20
42
  end
21
-
43
+
22
44
  end
23
-
45
+
24
46
  # Matches HTML content against a CSS 3 selector.
25
47
  #
26
48
  # ==== Parameters
@@ -28,25 +50,25 @@ module Webrat
28
50
  #
29
51
  # ==== Returns
30
52
  # HaveSelector:: A new have selector matcher.
31
- def have_selector(expected, &block)
32
- HaveSelector.new(expected, &block)
53
+ def have_selector(name, attributes = {}, &block)
54
+ HaveSelector.new(name, attributes, &block)
33
55
  end
34
56
  alias_method :match_selector, :have_selector
35
-
36
-
57
+
58
+
37
59
  # Asserts that the body of the response contains
38
60
  # the supplied selector
39
- def assert_have_selector(expected)
40
- hs = HaveSelector.new(expected)
41
- raise Test::Unit::AssertionFailedError.new(hs.failure_message) unless hs.matches?(response_body)
61
+ def assert_have_selector(name, attributes = {}, &block)
62
+ matcher = HaveSelector.new(name, attributes, &block)
63
+ assert matcher.matches?(response_body), matcher.failure_message
42
64
  end
43
-
65
+
44
66
  # Asserts that the body of the response
45
67
  # does not contain the supplied string or regepx
46
- def assert_have_no_selector(expected)
47
- hs = HaveSelector.new(expected)
48
- raise Test::Unit::AssertionFailedError.new(hs.negative_failure_message) if hs.matches?(response_body)
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
49
71
  end
50
-
72
+
51
73
  end
52
- end
74
+ end
@@ -1,71 +1,21 @@
1
+ require "webrat/core/matchers/have_selector"
2
+
1
3
  module Webrat
2
-
3
4
  module HaveTagMatcher
4
5
 
5
- class HaveTag < ::Webrat::Matchers::HaveSelector #:nodoc:
6
- # ==== Returns
7
- # String:: The failure message.
8
- def failure_message
9
- "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
10
- end
11
-
12
- # ==== Returns
13
- # String:: The failure message to be displayed in negative matches.
14
- def negative_failure_message
15
- "expected following output to omit a #{tag_inspect}:\n#{@document}"
16
- end
17
-
18
- def tag_inspect
19
- options = @expected.last.dup
20
- content = options.delete(:content)
21
-
22
- html = "<#{@expected.first}"
23
- options.each do |k,v|
24
- html << " #{k}='#{v}'"
25
- end
26
-
27
- if content
28
- html << ">#{content}</#{@expected.first}>"
29
- else
30
- html << "/>"
31
- end
32
-
33
- html
34
- end
35
-
36
- def query
37
- options = @expected.last.dup
38
- selector = @expected.first.to_s
39
-
40
- selector << ":contains('#{options.delete(:content)}')" if options[:content]
41
-
42
- options.each do |key, value|
43
- selector << "[#{key}='#{value}']"
44
- end
45
-
46
- Nokogiri::CSS::Parser.parse(selector).map { |ast| ast.to_xpath }
47
- end
6
+ def have_tag(*args, &block)
7
+ have_selector(*args, &block)
48
8
  end
49
9
 
50
- def have_tag(name, attributes = {}, &block)
51
- HaveTag.new([name, attributes], &block)
52
- end
53
-
54
10
  alias_method :match_tag, :have_tag
55
-
56
- # Asserts that the body of the response contains
57
- # the supplied tag with the associated selectors
58
- def assert_have_tag(name, attributes = {})
59
- ht = HaveTag.new([name, attributes])
60
- raise Test::Unit::AssertionFailedError.new(ht.failure_message) unless ht.matches?(response_body)
11
+
12
+ def assert_have_tag(*args, &block)
13
+ assert_have_selector(*args, &block)
61
14
  end
62
-
63
- # Asserts that the body of the response
64
- # does not contain the supplied string or regepx
65
- def assert_have_no_tag(name, attributes = {})
66
- ht = HaveTag.new([name, attributes])
67
- raise Test::Unit::AssertionFailedError.new(ht.negative_failure_message) if ht.matches?(response_body)
15
+
16
+ def assert_have_no_tag(*args, &block)
17
+ assert_have_no_selector(*args, &block)
68
18
  end
69
19
 
70
20
  end
71
- end
21
+ end