Added auto-waiting #contain and #have_selector matchers for Selenium
This commit is contained in:
parent
0fb3ed6b11
commit
0888c683a3
@ -1,5 +1,5 @@
|
|||||||
# Supports using the matchers in controller, helper, and view specs if you're
|
# Supports using the matchers in controller, helper, and view specs if you're
|
||||||
# using rspec-rails. Just add a require statement to spec/spec_helper.rb:
|
# using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
|
||||||
#
|
#
|
||||||
# require 'webrat/rspec-rails'
|
# require 'webrat/rspec-rails'
|
||||||
#
|
#
|
||||||
|
@ -81,6 +81,14 @@ module Webrat
|
|||||||
@_result = Test::Unit::TestResult.new
|
@_result = Test::Unit::TestResult.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def response
|
||||||
|
webrat_session.response
|
||||||
|
end
|
||||||
|
|
||||||
|
def wait_for(*args, &block)
|
||||||
|
webrat_session.wait_for(*args, &block)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
80
lib/webrat/selenium/matchers.rb
Normal file
80
lib/webrat/selenium/matchers.rb
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
module Webrat
|
||||||
|
module Selenium
|
||||||
|
module Matchers
|
||||||
|
|
||||||
|
class HaveSelector
|
||||||
|
def initialize(expected)
|
||||||
|
@expected = expected
|
||||||
|
end
|
||||||
|
|
||||||
|
def matches?(response)
|
||||||
|
response.session.wait_for do
|
||||||
|
response.selenium.is_element_present("css=#{@expected}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# ==== Returns
|
||||||
|
# String:: The failure message.
|
||||||
|
def failure_message
|
||||||
|
"expected following text to match selector #{@expected}:\n#{@document}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# ==== Returns
|
||||||
|
# String:: The failure message to be displayed in negative matches.
|
||||||
|
def negative_failure_message
|
||||||
|
"expected following text to not match selector #{@expected}:\n#{@document}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def have_selector(content)
|
||||||
|
HaveSelector.new(content)
|
||||||
|
end
|
||||||
|
|
||||||
|
class HasContent #:nodoc:
|
||||||
|
def initialize(content)
|
||||||
|
@content = content
|
||||||
|
end
|
||||||
|
|
||||||
|
def matches?(response)
|
||||||
|
if @content.is_a?(Regexp)
|
||||||
|
text_finder = "regexp:#{@content.source}"
|
||||||
|
else
|
||||||
|
text_finder = @content
|
||||||
|
end
|
||||||
|
|
||||||
|
response.session.wait_for do
|
||||||
|
response.selenium.is_text_present(text_finder)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# ==== Returns
|
||||||
|
# String:: The failure message.
|
||||||
|
def failure_message
|
||||||
|
"expected the following element's content to #{content_message}:\n#{@element}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# ==== Returns
|
||||||
|
# String:: The failure message to be displayed in negative matches.
|
||||||
|
def negative_failure_message
|
||||||
|
"expected the following element's content to not #{content_message}:\n#{@element}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def content_message
|
||||||
|
case @content
|
||||||
|
when String
|
||||||
|
"include \"#{@content}\""
|
||||||
|
when Regexp
|
||||||
|
"match #{@content.inspect}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Matches the contents of an HTML document with
|
||||||
|
# whatever string is supplied
|
||||||
|
def contain(content)
|
||||||
|
HasContent.new(content)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -1,4 +1,21 @@
|
|||||||
module Webrat
|
module Webrat
|
||||||
|
class TimeoutError < WebratError
|
||||||
|
end
|
||||||
|
|
||||||
|
class SeleniumResponse
|
||||||
|
attr_reader :body
|
||||||
|
attr_reader :session
|
||||||
|
|
||||||
|
def initialize(session, body)
|
||||||
|
@session = session
|
||||||
|
@body = body
|
||||||
|
end
|
||||||
|
|
||||||
|
def selenium
|
||||||
|
session.selenium
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class SeleniumSession
|
class SeleniumSession
|
||||||
|
|
||||||
def initialize(*args) # :nodoc:
|
def initialize(*args) # :nodoc:
|
||||||
@ -18,6 +35,10 @@ module Webrat
|
|||||||
|
|
||||||
webrat_deprecate :fills_in, :fill_in
|
webrat_deprecate :fills_in, :fill_in
|
||||||
|
|
||||||
|
def response
|
||||||
|
SeleniumResponse.new(self, response_body)
|
||||||
|
end
|
||||||
|
|
||||||
def response_body #:nodoc:
|
def response_body #:nodoc:
|
||||||
selenium.get_html_source
|
selenium.get_html_source
|
||||||
end
|
end
|
||||||
@ -100,6 +121,30 @@ module Webrat
|
|||||||
selenium.key_up(locator, key_code)
|
selenium.key_up(locator, key_code)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def wait_for(params={})
|
||||||
|
timeout = params[:timeout] || 5
|
||||||
|
message = params[:message] || "Timeout exceeded"
|
||||||
|
|
||||||
|
begin_time = Time.now
|
||||||
|
|
||||||
|
while (Time.now - begin_time) < timeout
|
||||||
|
value = nil
|
||||||
|
|
||||||
|
begin
|
||||||
|
value = yield
|
||||||
|
rescue ::Spec::Expectations::ExpectationNotMetError, ::Selenium::CommandError, Webrat::WebratError
|
||||||
|
value = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
return value if value
|
||||||
|
|
||||||
|
sleep 0.25
|
||||||
|
end
|
||||||
|
|
||||||
|
raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
def selenium
|
def selenium
|
||||||
return $browser if $browser
|
return $browser if $browser
|
||||||
setup
|
setup
|
||||||
|
Loading…
Reference in New Issue
Block a user