Skip to content

Commit

Permalink
catches spec failed exception again
Browse files Browse the repository at this point in the history
  • Loading branch information
Mike Gaffney committed Jun 3, 2009
1 parent abac202 commit 977f643
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 60 deletions.
129 changes: 69 additions & 60 deletions lib/webrat/selenium/selenium_session.rb
Expand Up @@ -5,61 +5,61 @@
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
include Webrat::SaveAndOpenPage
include Webrat::Selenium::SilenceStream

def initialize(*args) # :nodoc:
end

def simulate
end

def automate
yield
end

def visit(url)
selenium.open(url)
end

webrat_deprecate :visits, :visit

def fill_in(field_identifier, options)
locator = "webrat=#{field_identifier}"
selenium.wait_for_element locator, :timeout_in_seconds => 5
selenium.type(locator, "#{options[:with]}")
end

webrat_deprecate :fills_in, :fill_in

def response
SeleniumResponse.new(self, response_body)
end

def response_body #:nodoc:
selenium.get_html_source
end

def current_url
selenium.location
end

def click_button(button_text_or_regexp = nil, options = {})
if button_text_or_regexp.is_a?(Hash) && options == {}
pattern, options = nil, button_text_or_regexp
Expand All @@ -68,164 +68,173 @@ def click_button(button_text_or_regexp = nil, options = {})
end
pattern ||= '*'
locator = "button=#{pattern}"

selenium.wait_for_element locator, :timeout_in_seconds => 5
selenium.click locator
end

webrat_deprecate :clicks_button, :click_button

def click_link(link_text_or_regexp, options = {})
pattern = adjust_if_regexp(link_text_or_regexp)
locator = "webratlink=#{pattern}"
selenium.wait_for_element locator, :timeout_in_seconds => 5
selenium.click locator
end

webrat_deprecate :clicks_link, :click_link

def click_link_within(selector, link_text, options = {})
locator = "webratlinkwithin=#{selector}|#{link_text}"
selenium.wait_for_element locator, :timeout_in_seconds => 5
selenium.click locator
end

webrat_deprecate :clicks_link_within, :click_link_within

def select(option_text, options = {})
id_or_name_or_label = options[:from]

if id_or_name_or_label
select_locator = "webrat=#{id_or_name_or_label}"
else
select_locator = "webratselectwithoption=#{option_text}"
end

selenium.wait_for_element select_locator, :timeout_in_seconds => 5
selenium.select(select_locator, option_text)
end

webrat_deprecate :selects, :select

def choose(label_text)
locator = "webrat=#{label_text}"
selenium.wait_for_element locator, :timeout_in_seconds => 5
selenium.click locator
end

webrat_deprecate :chooses, :choose

def check(label_text)
locator = "webrat=#{label_text}"
selenium.wait_for_element locator, :timeout_in_seconds => 5
selenium.click locator
end
alias_method :uncheck, :check

webrat_deprecate :checks, :check

def fire_event(field_identifier, event)
locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.fire_event(locator, "#{event}")
end

def key_down(field_identifier, key_code)
locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.key_down(locator, key_code)
end

def key_up(field_identifier, key_code)
locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.key_up(locator, key_code)
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 ::Selenium::CommandError, Webrat::WebratError
value = nil
rescue Exception => e
raise e unless yieldable_exceptions.include?(e.class)
end

return value if value

sleep 0.25
end

raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
true
end

def selenium
return $browser if $browser
setup
$browser
end

webrat_deprecate :browser, :selenium


def save_and_open_screengrab
return unless File.exist?(saved_page_dir)

filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"

if $browser.chrome_backend?
$browser.capture_entire_page_screenshot(filename, '')
else
$browser.capture_screenshot(filename)
end
open_in_browser(filename)
open_in_browser(filename)

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:
Webrat::Selenium::SeleniumRCServer.boot
Webrat::Selenium::ApplicationServer.boot

create_browser
$browser.start

extend_selenium
define_location_strategies
$browser.window_maximize
end


def create_browser
$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

at_exit do
silence_stream(STDOUT) do
$browser.stop
end
end
end

def adjust_if_regexp(text_or_regexp) #:nodoc:
if text_or_regexp.is_a?(Regexp)
"evalregex:#{text_or_regexp.inspect}"
else
"evalregex:/#{text_or_regexp}/"
end
end

def extend_selenium #:nodoc:
extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
extenions_js = File.read(extensions_file)
selenium.get_eval(extenions_js)
end

def define_location_strategies #:nodoc:
Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
strategy_js = File.read(file)
Expand Down
33 changes: 33 additions & 0 deletions spec/public/selenium/selenium_session_spec.rb
@@ -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

0 comments on commit 977f643

Please sign in to comment.