class Selenium::WebDriver::Driver
The main class through which you control the browser.
@see SearchContext
@see Navigation
@see TargetLocator
@see Options
Attributes
Public Class Methods
@api private
@return [Driver]
# File lib/selenium/webdriver/common/driver.rb, line 44 def for(browser, opts = {}) case browser when :chrome Chrome::Driver.new(**opts) when :internet_explorer, :ie IE::Driver.new(**opts) when :safari Safari::Driver.new(**opts) when :firefox, :ff Firefox::Driver.new(**opts) when :edge Edge::Driver.new(**opts) when :remote Remote::Driver.new(**opts) else raise ArgumentError, "unknown driver: #{browser.inspect}" end end
A new Driver
instance with the given bridge. End users should use Selenium::WebDriver.for
instead of using this directly.
@api private
# File lib/selenium/webdriver/common/driver.rb, line 71 def initialize(bridge: nil, listener: nil, **opts) @service = nil @devtools = nil bridge ||= create_bridge(**opts) add_extensions(bridge.browser) @bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge end
Public Instance Methods
Get the first element matching the given selector. If given a String or Symbol, it will be used as the id of the element.
@param [String,Hash] sel id or selector @return [WebDriver::Element]
Examples:
driver['someElementId'] #=> #<WebDriver::Element:0x1011c3b88> driver[:tag_name => 'div'] #=> #<WebDriver::Element:0x1011c3b88>
# File lib/selenium/webdriver/common/driver.rb, line 283 def [](sel) sel = {id: sel} if sel.is_a?(String) || sel.is_a?(Symbol) find_element sel end
@return [ActionBuilder] @see ActionBuilder
# File lib/selenium/webdriver/common/driver.rb, line 126 def action bridge.action end
# File lib/selenium/webdriver/common/driver.rb, line 289 def browser bridge&.browser end
# File lib/selenium/webdriver/common/driver.rb, line 293 def capabilities bridge.capabilities end
Close the current window, or the browser if no windows are left.
# File lib/selenium/webdriver/common/driver.rb, line 191 def close bridge.close end
Get the URL of the current page
@return [String]
# File lib/selenium/webdriver/common/driver.rb, line 152 def current_url bridge.url end
Execute an asynchronous piece of JavaScript in the context of the currently selected frame or window. Unlike executing execute_script
(synchronous JavaScript), scripts executed with this method must explicitly signal they are finished by invoking the provided callback. This callback is always injected into the executed function as the last argument.
@param [String] script
JavaScript source to execute
@param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] args
Arguments to the script. May be empty.
@return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
# File lib/selenium/webdriver/common/driver.rb, line 247 def execute_async_script(script, *args) bridge.execute_async_script(script, *args) end
Execute the given JavaScript
@param [String] script
JavaScript source to execute
@param [WebDriver::Element, Integer, Float, Boolean, NilClass, String, Array] args
Arguments will be available in the given script in the 'arguments' pseudo-array.
@return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
The value returned from the script.
# File lib/selenium/webdriver/common/driver.rb, line 228 def execute_script(script, *args) bridge.execute_script(script, *args) end
Opens the specified URL in the browser.
# File lib/selenium/webdriver/common/driver.rb, line 142 def get(url) navigate.to(url) end
# File lib/selenium/webdriver/common/driver.rb, line 79 def inspect format '#<%<class>s:0x%<hash>x browser=%<browser>s>', class: self.class, hash: hash * 2, browser: bridge.browser.inspect end
# File lib/selenium/webdriver/common/driver.rb, line 134 def keyboard bridge.keyboard end
@return [Manager] @see Manager
# File lib/selenium/webdriver/common/driver.rb, line 117 def manage bridge.manage end
# File lib/selenium/webdriver/common/driver.rb, line 130 def mouse bridge.mouse end
Get the source of the current page
@return [String]
# File lib/selenium/webdriver/common/driver.rb, line 172 def page_source bridge.page_source end
Quit the browser
# File lib/selenium/webdriver/common/driver.rb, line 180 def quit bridge.quit ensure @service&.stop @devtools&.close end
@api private @see SearchContext
# File lib/selenium/webdriver/common/driver.rb, line 302 def ref [:driver, nil] end
information about whether a remote end is in a state in which it can create new sessions, and may include additional meta information.
@return [Hash]
# File lib/selenium/webdriver/common/driver.rb, line 90 def status @bridge.status end
@return [TargetLocator] @see TargetLocator
# File lib/selenium/webdriver/common/driver.rb, line 108 def switch_to @switch_to ||= WebDriver::TargetLocator.new(bridge) end
Get the title of the current page
@return [String]
# File lib/selenium/webdriver/common/driver.rb, line 162 def title bridge.title end
Get the current window handle
@return [String]
# File lib/selenium/webdriver/common/driver.rb, line 212 def window_handle bridge.window_handle end
Get the window handles of open browser windows.
@return [Array] @see TargetLocator#window
# File lib/selenium/webdriver/common/driver.rb, line 202 def window_handles bridge.window_handles end
Private Instance Methods
# File lib/selenium/webdriver/common/driver.rb, line 382 def add_extensions(browser) extensions = case browser when :chrome, :msedge Chrome::Driver::EXTENSIONS when :firefox Firefox::Driver::EXTENSIONS when :safari, :safari_technology_preview Safari::Driver::EXTENSIONS else [] end extensions.each { |extension| extend extension } end
# File lib/selenium/webdriver/common/driver.rb, line 310 def create_bridge(**opts) opts[:url] ||= service_url(opts) caps = opts.delete(:capabilities) # NOTE: This is deprecated cap_array = caps.is_a?(Hash) ? [caps] : Array(caps) desired_capabilities = opts.delete(:desired_capabilities) if desired_capabilities WebDriver.logger.deprecate(':desired_capabilities as a parameter for driver initialization', ':capabilities with an Array value of capabilities/options if necessary', id: :desired_capabilities) desired_capabilities = Remote::Capabilities.new(desired_capabilities) if desired_capabilities.is_a?(Hash) cap_array << desired_capabilities end options = opts.delete(:options) if options WebDriver.logger.deprecate(':options as a parameter for driver initialization', ':capabilities with an Array of value capabilities/options if necessary', id: :browser_options) cap_array << options end capabilities = generate_capabilities(cap_array) bridge_opts = {http_client: opts.delete(:http_client), url: opts.delete(:url)} raise ArgumentError, "Unable to create a driver with parameters: #{opts}" unless opts.empty? bridge = Remote::Bridge.new(**bridge_opts) bridge.create_session(capabilities) bridge end
# File lib/selenium/webdriver/common/driver.rb, line 344 def generate_capabilities(cap_array) cap_array.map { |cap| if cap.is_a? Symbol cap = Remote::Capabilities.send(cap) elsif cap.is_a? Hash new_message = 'Capabilities instance initialized with the Hash, or build values with Options class' WebDriver.logger.deprecate("passing a Hash value to :capabilities", new_message, id: :capabilities_hash) cap = Remote::Capabilities.new(cap) elsif !cap.respond_to? :as_json msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not" raise ArgumentError, msg end cap&.as_json }.inject(:merge) || Remote::Capabilities.send(browser || :new) end
# File lib/selenium/webdriver/common/driver.rb, line 378 def screenshot bridge.screenshot end
# File lib/selenium/webdriver/common/driver.rb, line 362 def service_url(opts) service_config = opts.delete(:service) %i[driver_opts driver_path port].each do |key| next unless opts.key? key WebDriver.logger.deprecate(":#{key}", ':service with an instance of Selenium::WebDriver::Service', id: "service_#{key}".to_sym) end service_config ||= Service.send(browser, args: opts.delete(:driver_opts), path: opts.delete(:driver_path), port: opts.delete(:port)) @service = service_config.launch @service.uri end