Class: Capybara::Selenium::Driver

### Home Classes Methods

### In Files

- lib/capybara/selenium/driver.rb

### Parent

Capybara::Driver::Base

### Methods

- ::new
- #accept_modal
- #browser
- #close_window
- #current_url
- #current_window_handle
- #dismiss_modal
- #evaluate_script
- #execute_script
- #find_css
- #find_window
- #find_xpath
- #go_back
- #go_forward
- #html
- #invalid_element_errors
- #maximize_window
- #needs_server?
- #no_such_window_error
- #open_new_window
- #quit
- #reset!
- #resize_window_to
- #save_screenshot
- #switch_to_window
- #title
- #visit
- #wait?
- #window_handles
- #window_size
- #within_frame
- #within_window

### Files

- another_test_file.txt
- test_file.txt

### Class/Module Index

Quicksearch

- Capybara
- Capybara::Ambiguous
- Capybara::CapybaraError
- Capybara::DSL
- Capybara::Driver
- Capybara::Driver::Base
- Capybara::Driver::Node
- Capybara::DriverNotFoundError
- Capybara::ElementNotFound
- Capybara::ExpectationNotMet
- Capybara::Features
- Capybara::FileNotFound
- Capybara::FrozenInTime
- Capybara::Helpers
- Capybara::InfiniteRedirectError
- Capybara::ModalNotFound
- Capybara::Node
- Capybara::Node::Actions
- Capybara::Node::Base
- Capybara::Node::Document
- Capybara::Node::DocumentMatchers
- Capybara::Node::Element
- Capybara::Node::Finders
- Capybara::Node::Matchers
- Capybara::Node::Simple
- Capybara::NotSupportedByDriverError
- Capybara::Queries
- Capybara::Queries::BaseQuery
- Capybara::Queries::TextQuery
- Capybara::Queries::TitleQuery
- Capybara::Query
- Capybara::RSpecMatchers
- Capybara::RSpecMatchers::BecomeClosed
- Capybara::RSpecMatchers::HaveSelector
- Capybara::RSpecMatchers::HaveText
- Capybara::RSpecMatchers::HaveTitle
- Capybara::RSpecMatchers::Matcher
- Capybara::RackTest
- Capybara::RackTest::Browser
- Capybara::RackTest::CSSHandlers
- Capybara::RackTest::Driver
- Capybara::RackTest::Form
- Capybara::RackTest::Form::NilUploadedFile
- Capybara::RackTest::Node
- Capybara::ReadOnlyElementError
- Capybara::Result
- Capybara::ScopeError
- Capybara::Selector
- Capybara::Selector::Filter
- Capybara::Selenium
- Capybara::Selenium::Driver
- Capybara::Selenium::Node
- Capybara::Server
- Capybara::Server::Middleware
- Capybara::Session
- Capybara::SpecHelper
- Capybara::UnselectNotAllowed
- Capybara::Window
- Capybara::WindowError
- TestApp
- TestApp::TestAppError
- Object

No matching classes.

# Capybara::Selenium::Driver

### Constants

DEFAULT_OPTIONS
SPECIAL_OPTIONS

### Attributes

app[R]
options[R]

### Public Class Methods

new(app, options={}) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 26
    def initialize(app, options={})
      begin
        require 'selenium-webdriver'
      rescue LoadError => e
        if e.message =~ /selenium-webdriver/
          raise LoadError, "Capybara's selenium driver is unable to load `selenium-webdriver`, please install the gem and add `gem 'selenium-webdriver'` to your Gemfile if you are using bundler."
        else
          raise e
        end
      end

      @app = app
      @browser = nil
      @exit_status = nil
      @frame_handles = {}
      @options = DEFAULT_OPTIONS.merge(options)
    end

### Public Instance Methods

accept_modal(type, options={}, &blk) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 207
    def accept_modal(type, options={}, &blk)
      yield if block_given?
      modal = find_modal(options)
      modal.send_keys options[:with] if options[:with]
      message = modal.text
      modal.accept
      message
    end

browser() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 11
    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

close_window(handle) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 166
    def close_window(handle)
      within_given_window(handle) do
        browser.close
      end
    end

current_url() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 64
    def current_url
      browser.current_url
    end

current_window_handle() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 142
    def current_window_handle
      browser.window_handle
    end

dismiss_modal(type, options={}, &blk) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 216
    def dismiss_modal(type, options={}, &blk)
      yield if block_given?
      modal = find_modal(options)
      message = modal.text
      modal.dismiss
      message
    end

evaluate_script(script) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 83
    def evaluate_script(script)
      browser.execute_script "return #{script}"
    end

execute_script(script) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 79
    def execute_script(script)
      browser.execute_script script
    end

find_css(selector) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 72
    def find_css(selector)
      browser.find_elements(:css, selector).map { |node| Capybara::Selenium::Node.new(self, node) }
    end

find_window(locator) click to toggle source

@api private

    # File lib/capybara/selenium/driver.rb, line 185
    def find_window(locator)
      handles = browser.window_handles
      return locator if handles.include? locator

      original_handle = browser.window_handle
      handles.each do |handle|
        switch_to_window(handle)
        if (locator == browser.execute_script("return window.name") ||
            browser.title.include?(locator) ||
            browser.current_url.include?(locator))
          switch_to_window(original_handle)
          return handle
        end
      end
      raise Capybara::ElementNotFound, "Could not find a window identified by #{locator}"
    end

find_xpath(selector) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 68
    def find_xpath(selector)
      browser.find_elements(:xpath, selector).map { |node| Capybara::Selenium::Node.new(self, node) }
    end

go_back() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 48
    def go_back
      browser.navigate.back
    end

go_forward() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 52
    def go_forward
      browser.navigate.forward
    end

html() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 56
    def html
      browser.page_source
    end

invalid_element_errors() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 232
    def invalid_element_errors
      [Selenium::WebDriver::Error::StaleElementReferenceError, Selenium::WebDriver::Error::UnhandledError, Selenium::WebDriver::Error::ElementNotVisibleError]
    end

maximize_window(handle) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 159
    def maximize_window(handle)
      within_given_window(handle) do
        browser.manage.window.maximize
      end
      sleep 0.1 # work around for https://code.google.com/p/selenium/issues/detail?id=7405
    end

needs_server?() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 77
    def needs_server?; true; end

no_such_window_error() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 236
    def no_such_window_error
      Selenium::WebDriver::Error::NoSuchWindowError
    end

open_new_window() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 176
    def open_new_window
      browser.execute_script('window.open();')
    end

quit() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 224
    def quit
      @browser.quit if @browser
    rescue Errno::ECONNREFUSED
      # Browser must have already gone
    ensure
      @browser = nil
    end

reset!() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 91
    def reset!
      # Use instance variable directly so we avoid starting the browser just to reset the session
      if @browser
        begin
          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")
        rescue Selenium::WebDriver::Error::UnhandledAlertError
          # This error is thrown if an unhandled alert is on the page
          # Firefox appears to automatically dismiss this alert, chrome does not
          # We'll try to accept it
          begin
            @browser.switch_to.alert.accept
          rescue Selenium::WebDriver::Error::NoAlertPresentError
            # The alert is now gone - nothing to do
          end
          # try cleaning up the browser again
          retry
        end
      end
    end

resize_window_to(handle, width, height) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 153
    def resize_window_to(handle, width, height)
      within_given_window(handle) do
        browser.manage.window.resize_to(width, height)
      end
    end

save_screenshot(path, options={}) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 87
    def save_screenshot(path, options={})
      browser.save_screenshot(path)
    end

switch_to_window(handle) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 180
    def switch_to_window(handle)
      browser.switch_to.window handle
    end

title() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 60
    def title
      browser.title
    end

visit(path) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 44
    def visit(path)
      browser.navigate.to(path)
    end

wait?() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 76
    def wait?; true; end

window_handles() click to toggle source

    # File lib/capybara/selenium/driver.rb, line 172
    def window_handles
      browser.window_handles
    end

window_size(handle) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 146
    def window_size(handle)
      within_given_window(handle) do
        size = browser.manage.window.size
        [size.width, size.height]
      end
    end

within_frame(frame_handle) click to toggle source

Webdriver supports frame name, id, index(zero-based) or {Capybara::Element} to find iframe

@overload within_frame(index)

    @param [Integer] index                 index of a frame

@overload within_frame(name_or_id)

    @param [String] name_or_id             name or id of a frame

@overload within_frame(element)

    @param [Capybara::Node::Base] a_node   frame element

    # File lib/capybara/selenium/driver.rb, line 128
    def within_frame(frame_handle)
      @frame_handles[browser.window_handle] ||= []
      frame_handle = frame_handle.native if frame_handle.is_a?(Capybara::Node::Base)
      @frame_handles[browser.window_handle] << frame_handle
      a=browser.switch_to.frame(frame_handle)
      yield
    ensure
      # There doesnt appear to be any way in Webdriver to move back to a parent frame
      # other than going back to the root and then reiterating down
      @frame_handles[browser.window_handle].pop
      browser.switch_to.default_content
      @frame_handles[browser.window_handle].each { |fh| browser.switch_to.frame(fh) }
    end

within_window(locator) click to toggle source

    # File lib/capybara/selenium/driver.rb, line 202
    def within_window(locator)
      handle = find_window(locator)
      browser.switch_to.window(handle) { yield }
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.