diff --git a/History.txt b/History.txt index 89656c3d..b03d799d 100644 --- a/History.txt +++ b/History.txt @@ -37,6 +37,7 @@ * Minor enhancements + * have_tag and the corresponding asserts work outside of merb, including selenium mode. (Amos King) * Create tmp/pids directory if directory does not exist. (Amos King) * Added Selenium grid configuration and support. (Amos King && Cornel Borcean) * Support passing an ActiveRecord model to #within when in Rails mode [#68] (Luke Melia) diff --git a/lib/webrat/selenium/matchers.rb b/lib/webrat/selenium/matchers.rb index a30de0de..a106f729 100644 --- a/lib/webrat/selenium/matchers.rb +++ b/lib/webrat/selenium/matchers.rb @@ -1,4 +1,4 @@ require "webrat/selenium/matchers/have_xpath" require "webrat/selenium/matchers/have_selector" -# require "webrat/core/matchers/have_tag" +require "webrat/selenium/matchers/have_tag" require "webrat/selenium/matchers/have_content" \ No newline at end of file diff --git a/lib/webrat/selenium/matchers/have_tag.rb b/lib/webrat/selenium/matchers/have_tag.rb new file mode 100644 index 00000000..a7c87ee0 --- /dev/null +++ b/lib/webrat/selenium/matchers/have_tag.rb @@ -0,0 +1,72 @@ +module Webrat + module Selenium + module Matchers + + class HaveTag < HaveSelector #:nodoc: + # ==== Returns + # String:: The failure message. + def failure_message + "expected following output to contain a #{tag_inspect} tag:\n#{@document}" + end + + # ==== Returns + # String:: The failure message to be displayed in negative matches. + def negative_failure_message + "expected following output to omit a #{tag_inspect}:\n#{@document}" + end + + def tag_inspect + options = @expected.last.dup + content = options.delete(:content) + + html = "<#{@expected.first}" + options.each do |k,v| + html << " #{k}='#{v}'" + end + + if content + html << ">#{content}" + else + html << "/>" + end + + html + end + + def query + options = @expected.last.dup + selector = @expected.first.to_s + + selector << ":contains('#{options.delete(:content)}')" if options[:content] + + options.each do |key, value| + selector << "[#{key}='#{value}']" + end + + Nokogiri::CSS::Parser.parse(selector).map { |ast| ast.to_xpath } + end + end + + def have_tag(name, attributes = {}, &block) + HaveTag.new([name, attributes], &block) + end + + alias_method :match_tag, :have_tag + + # Asserts that the body of the response contains + # the supplied tag with the associated selectors + def assert_have_tag(name, attributes = {}) + ht = HaveTag.new([name, attributes]) + assert ht.matches?(response), ht.failure_message + end + + # Asserts that the body of the response + # does not contain the supplied string or regepx + def assert_have_no_tag(name, attributes = {}) + ht = HaveTag.new([name, attributes]) + assert !ht.matches?(response), ht.negative_failure_message + end + + end + end +end \ No newline at end of file