teamcapybara--capybara/lib/capybara/selenium/driver.rb

127 lines
3.0 KiB
Ruby
Raw Normal View History

require 'selenium-webdriver'
2011-04-11 05:24:00 +00:00
class Capybara::Selenium::Driver < Capybara::Driver::Base
DEFAULT_OPTIONS = {
:browser => :firefox
}
2012-02-01 13:23:17 +00:00
SPECIAL_OPTIONS = [:browser]
attr_reader :app, :rack_server, :options
def browser
unless @browser
@browser = Selenium::WebDriver.for(options[:browser], options.reject { |key,val| SPECIAL_OPTIONS.include?(key) })
main = Process.pid
at_exit do
# Store the exit status of the test run since it goes away after calling the at_exit proc...
@exit_status = $!.status if $!.is_a?(SystemExit)
quit if Process.pid == main
exit @exit_status if @exit_status # Force exit with stored status
end
end
@browser
end
def initialize(app, options={})
@app = app
@browser = nil
@exit_status = nil
@options = DEFAULT_OPTIONS.merge(options)
@rack_server = Capybara::Server.new(@app)
@rack_server.boot if Capybara.run_server
end
def visit(path)
2010-01-01 19:13:54 +00:00
browser.navigate.to(url(path))
end
def source
browser.page_source
end
def body
2010-01-01 19:13:54 +00:00
browser.page_source
end
def current_url
2010-01-01 19:13:54 +00:00
browser.current_url
end
def find(selector)
2011-04-11 05:24:00 +00:00
browser.find_elements(:xpath, selector).map { |node| Capybara::Selenium::Node.new(self, node) }
end
def wait?; true; end
def execute_script(script)
browser.execute_script script
end
def evaluate_script(script)
2010-01-01 19:13:54 +00:00
browser.execute_script "return #{script}"
end
2010-01-01 21:46:05 +00:00
def save_screenshot(path, options={})
browser.save_screenshot(path)
end
2010-07-29 13:25:45 +00:00
def reset!
# Use instance variable directly so we avoid starting the browser just to reset the session
if @browser
2012-02-01 13:23:17 +00:00
begin @browser.manage.delete_all_cookies
rescue Selenium::WebDriver::Error::UnhandledError
# delete_all_cookies fails when we've previously gone
# to about:blank, so we rescue this error and do nothing
# instead.
end
@browser.navigate.to('about:blank')
end
end
2010-01-12 20:27:39 +00:00
def within_frame(frame_id)
old_window = browser.window_handle
browser.switch_to.frame(frame_id)
yield
ensure
browser.switch_to.window old_window
2010-01-12 19:40:10 +00:00
end
def find_window( selector )
original_handle = browser.window_handle
browser.window_handles.each do |handle|
browser.switch_to.window handle
if( selector == browser.execute_script("return window.name") ||
browser.title.include?(selector) ||
browser.current_url.include?(selector) ||
(selector == handle) )
browser.switch_to.window original_handle
return handle
end
end
raise Capybara::ElementNotFound, "Could not find a window identified by #{selector}"
end
def within_window(selector, &blk)
handle = find_window( selector )
browser.switch_to.window(handle, &blk)
2010-08-27 19:00:08 +00:00
end
def quit
@browser.quit
rescue Errno::ECONNREFUSED
# Browser must have already gone
end
2011-07-13 13:39:17 +00:00
def invalid_element_errors
2011-11-09 22:02:53 +00:00
[Selenium::WebDriver::Error::ObsoleteElementError, Selenium::WebDriver::Error::UnhandledError]
2011-07-13 13:39:17 +00:00
end
private
def url(path)
rack_server.url(path)
end
end