catches spec failed exception again
This commit is contained in:
parent
abac2023bc
commit
977f643dca
@ -5,61 +5,61 @@ require "webrat/selenium/application_server"
|
|||||||
module Webrat
|
module Webrat
|
||||||
class TimeoutError < WebratError
|
class TimeoutError < WebratError
|
||||||
end
|
end
|
||||||
|
|
||||||
class SeleniumResponse
|
class SeleniumResponse
|
||||||
attr_reader :body
|
attr_reader :body
|
||||||
attr_reader :session
|
attr_reader :session
|
||||||
|
|
||||||
def initialize(session, body)
|
def initialize(session, body)
|
||||||
@session = session
|
@session = session
|
||||||
@body = body
|
@body = body
|
||||||
end
|
end
|
||||||
|
|
||||||
def selenium
|
def selenium
|
||||||
session.selenium
|
session.selenium
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class SeleniumSession
|
class SeleniumSession
|
||||||
include Webrat::SaveAndOpenPage
|
include Webrat::SaveAndOpenPage
|
||||||
include Webrat::Selenium::SilenceStream
|
include Webrat::Selenium::SilenceStream
|
||||||
|
|
||||||
def initialize(*args) # :nodoc:
|
def initialize(*args) # :nodoc:
|
||||||
end
|
end
|
||||||
|
|
||||||
def simulate
|
def simulate
|
||||||
end
|
end
|
||||||
|
|
||||||
def automate
|
def automate
|
||||||
yield
|
yield
|
||||||
end
|
end
|
||||||
|
|
||||||
def visit(url)
|
def visit(url)
|
||||||
selenium.open(url)
|
selenium.open(url)
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :visits, :visit
|
webrat_deprecate :visits, :visit
|
||||||
|
|
||||||
def fill_in(field_identifier, options)
|
def fill_in(field_identifier, options)
|
||||||
locator = "webrat=#{field_identifier}"
|
locator = "webrat=#{field_identifier}"
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.type(locator, "#{options[:with]}")
|
selenium.type(locator, "#{options[:with]}")
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :fills_in, :fill_in
|
webrat_deprecate :fills_in, :fill_in
|
||||||
|
|
||||||
def response
|
def response
|
||||||
SeleniumResponse.new(self, response_body)
|
SeleniumResponse.new(self, response_body)
|
||||||
end
|
end
|
||||||
|
|
||||||
def response_body #:nodoc:
|
def response_body #:nodoc:
|
||||||
selenium.get_html_source
|
selenium.get_html_source
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_url
|
def current_url
|
||||||
selenium.location
|
selenium.location
|
||||||
end
|
end
|
||||||
|
|
||||||
def click_button(button_text_or_regexp = nil, options = {})
|
def click_button(button_text_or_regexp = nil, options = {})
|
||||||
if button_text_or_regexp.is_a?(Hash) && options == {}
|
if button_text_or_regexp.is_a?(Hash) && options == {}
|
||||||
pattern, options = nil, button_text_or_regexp
|
pattern, options = nil, button_text_or_regexp
|
||||||
@ -68,150 +68,159 @@ module Webrat
|
|||||||
end
|
end
|
||||||
pattern ||= '*'
|
pattern ||= '*'
|
||||||
locator = "button=#{pattern}"
|
locator = "button=#{pattern}"
|
||||||
|
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.click locator
|
selenium.click locator
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :clicks_button, :click_button
|
webrat_deprecate :clicks_button, :click_button
|
||||||
|
|
||||||
def click_link(link_text_or_regexp, options = {})
|
def click_link(link_text_or_regexp, options = {})
|
||||||
pattern = adjust_if_regexp(link_text_or_regexp)
|
pattern = adjust_if_regexp(link_text_or_regexp)
|
||||||
locator = "webratlink=#{pattern}"
|
locator = "webratlink=#{pattern}"
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.click locator
|
selenium.click locator
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :clicks_link, :click_link
|
webrat_deprecate :clicks_link, :click_link
|
||||||
|
|
||||||
def click_link_within(selector, link_text, options = {})
|
def click_link_within(selector, link_text, options = {})
|
||||||
locator = "webratlinkwithin=#{selector}|#{link_text}"
|
locator = "webratlinkwithin=#{selector}|#{link_text}"
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.click locator
|
selenium.click locator
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :clicks_link_within, :click_link_within
|
webrat_deprecate :clicks_link_within, :click_link_within
|
||||||
|
|
||||||
def select(option_text, options = {})
|
def select(option_text, options = {})
|
||||||
id_or_name_or_label = options[:from]
|
id_or_name_or_label = options[:from]
|
||||||
|
|
||||||
if id_or_name_or_label
|
if id_or_name_or_label
|
||||||
select_locator = "webrat=#{id_or_name_or_label}"
|
select_locator = "webrat=#{id_or_name_or_label}"
|
||||||
else
|
else
|
||||||
select_locator = "webratselectwithoption=#{option_text}"
|
select_locator = "webratselectwithoption=#{option_text}"
|
||||||
end
|
end
|
||||||
|
|
||||||
selenium.wait_for_element select_locator, :timeout_in_seconds => 5
|
selenium.wait_for_element select_locator, :timeout_in_seconds => 5
|
||||||
selenium.select(select_locator, option_text)
|
selenium.select(select_locator, option_text)
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :selects, :select
|
webrat_deprecate :selects, :select
|
||||||
|
|
||||||
def choose(label_text)
|
def choose(label_text)
|
||||||
locator = "webrat=#{label_text}"
|
locator = "webrat=#{label_text}"
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.click locator
|
selenium.click locator
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :chooses, :choose
|
webrat_deprecate :chooses, :choose
|
||||||
|
|
||||||
def check(label_text)
|
def check(label_text)
|
||||||
locator = "webrat=#{label_text}"
|
locator = "webrat=#{label_text}"
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.click locator
|
selenium.click locator
|
||||||
end
|
end
|
||||||
alias_method :uncheck, :check
|
alias_method :uncheck, :check
|
||||||
|
|
||||||
webrat_deprecate :checks, :check
|
webrat_deprecate :checks, :check
|
||||||
|
|
||||||
def fire_event(field_identifier, event)
|
def fire_event(field_identifier, event)
|
||||||
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
||||||
selenium.fire_event(locator, "#{event}")
|
selenium.fire_event(locator, "#{event}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def key_down(field_identifier, key_code)
|
def key_down(field_identifier, key_code)
|
||||||
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
||||||
selenium.key_down(locator, key_code)
|
selenium.key_down(locator, key_code)
|
||||||
end
|
end
|
||||||
|
|
||||||
def key_up(field_identifier, key_code)
|
def key_up(field_identifier, key_code)
|
||||||
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
||||||
selenium.key_up(locator, key_code)
|
selenium.key_up(locator, key_code)
|
||||||
end
|
end
|
||||||
|
|
||||||
def wait_for(params={})
|
def wait_for(params={})
|
||||||
timeout = params[:timeout] || 5
|
timeout = params[:timeout] || 5
|
||||||
message = params[:message] || "Timeout exceeded"
|
message = params[:message] || "Timeout exceeded"
|
||||||
|
|
||||||
begin_time = Time.now
|
begin_time = Time.now
|
||||||
|
|
||||||
while (Time.now - begin_time) < timeout
|
while (Time.now - begin_time) < timeout
|
||||||
value = nil
|
value = nil
|
||||||
|
|
||||||
begin
|
begin
|
||||||
value = yield
|
value = yield
|
||||||
rescue ::Selenium::CommandError, Webrat::WebratError
|
rescue Exception => e
|
||||||
value = nil
|
raise e unless yieldable_exceptions.include?(e.class)
|
||||||
end
|
end
|
||||||
|
|
||||||
return value if value
|
return value if value
|
||||||
|
|
||||||
sleep 0.25
|
sleep 0.25
|
||||||
end
|
end
|
||||||
|
|
||||||
raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
|
raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def selenium
|
def selenium
|
||||||
return $browser if $browser
|
return $browser if $browser
|
||||||
setup
|
setup
|
||||||
$browser
|
$browser
|
||||||
end
|
end
|
||||||
|
|
||||||
webrat_deprecate :browser, :selenium
|
webrat_deprecate :browser, :selenium
|
||||||
|
|
||||||
|
|
||||||
def save_and_open_screengrab
|
def save_and_open_screengrab
|
||||||
return unless File.exist?(saved_page_dir)
|
return unless File.exist?(saved_page_dir)
|
||||||
|
|
||||||
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
|
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
|
||||||
|
|
||||||
if $browser.chrome_backend?
|
if $browser.chrome_backend?
|
||||||
$browser.capture_entire_page_screenshot(filename, '')
|
$browser.capture_entire_page_screenshot(filename, '')
|
||||||
else
|
else
|
||||||
$browser.capture_screenshot(filename)
|
$browser.capture_screenshot(filename)
|
||||||
end
|
end
|
||||||
open_in_browser(filename)
|
open_in_browser(filename)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
def yieldable_exceptions
|
||||||
|
return [::Selenium::CommandError, Webrat::WebratError] unless lib_defined?(::Spec::Expectations::ExpectationNotMetError)
|
||||||
|
[::Spec::Expectations::ExpectationNotMetError, ::Selenium::CommandError, Webrat::WebratError]
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
def lib_defined?(library)
|
||||||
|
defined?(library)
|
||||||
|
end
|
||||||
|
|
||||||
def setup #:nodoc:
|
def setup #:nodoc:
|
||||||
Webrat::Selenium::SeleniumRCServer.boot
|
Webrat::Selenium::SeleniumRCServer.boot
|
||||||
Webrat::Selenium::ApplicationServer.boot
|
Webrat::Selenium::ApplicationServer.boot
|
||||||
|
|
||||||
create_browser
|
create_browser
|
||||||
$browser.start
|
$browser.start
|
||||||
|
|
||||||
extend_selenium
|
extend_selenium
|
||||||
define_location_strategies
|
define_location_strategies
|
||||||
$browser.window_maximize
|
$browser.window_maximize
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def create_browser
|
def create_browser
|
||||||
$browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
|
$browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
|
||||||
Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
|
Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
|
||||||
$browser.set_speed(0) unless Webrat.configuration.selenium_server_address
|
$browser.set_speed(0) unless Webrat.configuration.selenium_server_address
|
||||||
|
|
||||||
at_exit do
|
at_exit do
|
||||||
silence_stream(STDOUT) do
|
silence_stream(STDOUT) do
|
||||||
$browser.stop
|
$browser.stop
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def adjust_if_regexp(text_or_regexp) #:nodoc:
|
def adjust_if_regexp(text_or_regexp) #:nodoc:
|
||||||
if text_or_regexp.is_a?(Regexp)
|
if text_or_regexp.is_a?(Regexp)
|
||||||
"evalregex:#{text_or_regexp.inspect}"
|
"evalregex:#{text_or_regexp.inspect}"
|
||||||
@ -219,13 +228,13 @@ module Webrat
|
|||||||
"evalregex:/#{text_or_regexp}/"
|
"evalregex:/#{text_or_regexp}/"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def extend_selenium #:nodoc:
|
def extend_selenium #:nodoc:
|
||||||
extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
|
extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
|
||||||
extenions_js = File.read(extensions_file)
|
extenions_js = File.read(extensions_file)
|
||||||
selenium.get_eval(extenions_js)
|
selenium.get_eval(extenions_js)
|
||||||
end
|
end
|
||||||
|
|
||||||
def define_location_strategies #:nodoc:
|
def define_location_strategies #:nodoc:
|
||||||
Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
|
Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
|
||||||
strategy_js = File.read(file)
|
strategy_js = File.read(file)
|
||||||
|
33
spec/public/selenium/selenium_session_spec.rb
Normal file
33
spec/public/selenium/selenium_session_spec.rb
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
||||||
|
|
||||||
|
require "webrat/selenium/silence_stream"
|
||||||
|
require "webrat/selenium/selenium_session"
|
||||||
|
|
||||||
|
describe Webrat::SeleniumSession do
|
||||||
|
|
||||||
|
before :each do
|
||||||
|
Webrat.configuration.mode = :selenium
|
||||||
|
@selenium = Webrat::SeleniumSession.new()
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should provide a list yieldable exceptions without spec if spec isn't defined" do
|
||||||
|
@selenium.should_receive(:lib_defined?).with(::Spec::Expectations::ExpectationNotMetError).and_return(false)
|
||||||
|
@selenium.yieldable_exceptions.should == [::Selenium::CommandError, Webrat::WebratError]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should provide a list yieldable exceptions with rspec" do
|
||||||
|
@selenium.should_receive(:lib_defined?).with(::Spec::Expectations::ExpectationNotMetError).and_return(true)
|
||||||
|
@selenium.yieldable_exceptions.should == [::Spec::Expectations::ExpectationNotMetError, ::Selenium::CommandError, Webrat::WebratError]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should handle yieldable exceptions in the wait_for" do
|
||||||
|
begin
|
||||||
|
@selenium.wait_for(:timeout => 0.25) do
|
||||||
|
raise Webrat::WebratError.new
|
||||||
|
end
|
||||||
|
fail("didn't throw")
|
||||||
|
rescue Webrat::TimeoutError
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user