class Selenium::WebDriver::Remote::Bridge
Low level bridge to the remote server, through which the rest of the API works.
@api private
@api private
Constants
- QUIT_ERRORS
Attributes
Public Class Methods
Defines a wrapper method for a command, which ultimately calls execute.
@param name [Symbol]
name of the resulting method
@param url [String]
a URL template, which can include some arguments, much like the definitions on the server. the :session_id parameter is implicitly handled, but the remainder will become required method arguments.
@param verb [Symbol]
the appropriate http verb, such as :get, :post, or :delete
# File lib/selenium/webdriver/remote/bridge.rb, line 28 def self.command(name, verb, url) COMMANDS[name] = [verb, url.freeze] end
Initializes the bridge with the given server URL.
@param url [String] url for the remote server @param http_client [Object] an HTTP client instance that implements the same protocol as Http::Default @param desired_capabilities [Capabilities] an instance of Remote::Capabilities describing the capabilities you want
# File lib/selenium/webdriver/remote/bridge.rb, line 43 def initialize(opts = {}) opts = opts.dup http_client = opts.delete(:http_client) { Http::Default.new } desired_capabilities = opts.delete(:desired_capabilities) { Capabilities.firefox } url = opts.delete(:url) { "http://#{Platform.localhost}:4444/wd/hub" } unless opts.empty? raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}" end if desired_capabilities.kind_of?(Symbol) unless Capabilities.respond_to?(desired_capabilities) raise Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}" end desired_capabilities = Capabilities.send(desired_capabilities) end uri = url.kind_of?(URI) ? url : URI.parse(url) uri.path += "/" unless uri.path =~ /\/$/ http_client.server_url = uri @http = http_client @capabilities = create_session(desired_capabilities) @file_detector = nil end
Public Instance Methods
# File lib/selenium/webdriver/remote/bridge.rb, line 139 def acceptAlert execute :acceptAlert end
cookies
# File lib/selenium/webdriver/remote/bridge.rb, line 354 def addCookie(cookie) execute :addCookie, {}, :cookie => cookie end
# File lib/selenium/webdriver/remote/bridge.rb, line 73 def browser @browser ||= ( name = @capabilities.browser_name name ? name.gsub(" ", "_").to_sym : 'unknown' ) end
# File lib/selenium/webdriver/remote/bridge.rb, line 428 def clearElement(element) execute :clearElement, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 282 def clearLocalStorage execute :clearLocalStorage end
# File lib/selenium/webdriver/remote/bridge.rb, line 306 def clearSessionStorage execute :clearSessionStorage end
# File lib/selenium/webdriver/remote/bridge.rb, line 378 def click execute :click, {}, :button => 0 end
actions
# File lib/selenium/webdriver/remote/bridge.rb, line 374 def clickElement(element) execute :clickElement, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 211 def close execute :close end
# File lib/selenium/webdriver/remote/bridge.rb, line 386 def contextClick execute :click, {}, :button => 2 end
# File lib/selenium/webdriver/remote/bridge.rb, line 100 def create_session(desired_capabilities) resp = raw_execute :newSession, {}, :desiredCapabilities => desired_capabilities @session_id = resp['sessionId'] or raise Error::WebDriverError, 'no sessionId in returned payload' Capabilities.json_create resp['value'] end
# File lib/selenium/webdriver/remote/bridge.rb, line 366 def deleteAllCookies execute :deleteAllCookies end
# File lib/selenium/webdriver/remote/bridge.rb, line 358 def deleteCookie(name) execute :deleteCookie, :name => name end
# File lib/selenium/webdriver/remote/bridge.rb, line 143 def dismissAlert execute :dismissAlert end
# File lib/selenium/webdriver/remote/bridge.rb, line 382 def doubleClick execute :doubleClick end
# File lib/selenium/webdriver/remote/bridge.rb, line 437 def dragElement(element, right_by, down_by) execute :dragElement, {:id => element}, :x => right_by, :y => down_by end
# File lib/selenium/webdriver/remote/bridge.rb, line 80 def driver_extensions [ DriverExtensions::HasInputDevices, DriverExtensions::UploadsFiles, DriverExtensions::TakesScreenshot, DriverExtensions::HasSessionId, DriverExtensions::Rotatable, DriverExtensions::HasTouchScreen, DriverExtensions::HasRemoteStatus ] end
# File lib/selenium/webdriver/remote/bridge.rb, line 565 def elementEquals(element, other) if element.ref == other.ref true else execute :elementEquals, :id => element.ref, :other => other.ref end end
# File lib/selenium/webdriver/remote/bridge.rb, line 343 def executeAsyncScript(script, *args) assert_javascript_enabled result = execute :executeAsyncScript, {}, :script => script, :args => args unwrap_script_result result end
javascript execution
# File lib/selenium/webdriver/remote/bridge.rb, line 336 def executeScript(script, *args) assert_javascript_enabled result = execute :executeScript, {}, :script => script, :args => args unwrap_script_result result end
# File lib/selenium/webdriver/remote/bridge.rb, line 582 def find_element_by(how, what, parent = nil) if parent id = execute :findChildElement, {:id => parent}, {:using => how, :value => what} else id = execute :findElement, {}, {:using => how, :value => what} end Element.new self, element_id_from(id) end
# File lib/selenium/webdriver/remote/bridge.rb, line 592 def find_elements_by(how, what, parent = nil) if parent ids = execute :findChildElements, {:id => parent}, {:using => how, :value => what} else ids = execute :findElements, {}, {:using => how, :value => what} end ids.map { |id| Element.new self, element_id_from(id) } end
# File lib/selenium/webdriver/remote/bridge.rb, line 111 def get(url) execute :get, {}, :url => url end
finding elements
# File lib/selenium/webdriver/remote/bridge.rb, line 577 def getActiveElement Element.new self, element_id_from(execute(:getActiveElement)) end
alerts
# File lib/selenium/webdriver/remote/bridge.rb, line 135 def getAlert execute :getAlert end
# File lib/selenium/webdriver/remote/bridge.rb, line 151 def getAlertText execute :getAlertText end
# File lib/selenium/webdriver/remote/bridge.rb, line 362 def getAllCookies execute :getCookies end
logs
# File lib/selenium/webdriver/remote/bridge.rb, line 499 def getAvailableLogTypes types = execute :getAvailableLogTypes Array(types).map { |e| e.to_sym } end
# File lib/selenium/webdriver/remote/bridge.rb, line 115 def getCapabilities Capabilities.json_create execute(:getCapabilities) end
# File lib/selenium/webdriver/remote/bridge.rb, line 167 def getCurrentUrl execute :getCurrentUrl end
# File lib/selenium/webdriver/remote/bridge.rb, line 227 def getCurrentWindowHandle execute :getCurrentWindowHandle end
# File lib/selenium/webdriver/remote/bridge.rb, line 520 def getElementAttribute(element, name) execute :getElementAttribute, :id => element, :name => name end
# File lib/selenium/webdriver/remote/bridge.rb, line 532 def getElementLocation(element) data = execute :getElementLocation, :id => element Point.new data['x'], data['y'] end
# File lib/selenium/webdriver/remote/bridge.rb, line 538 def getElementLocationOnceScrolledIntoView(element) data = execute :getElementLocationOnceScrolledIntoView, :id => element Point.new data['x'], data['y'] end
# File lib/selenium/webdriver/remote/bridge.rb, line 544 def getElementSize(element) data = execute :getElementSize, :id => element Dimension.new data['width'], data['height'] end
element properties
# File lib/selenium/webdriver/remote/bridge.rb, line 516 def getElementTagName(element) execute :getElementTagName, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 528 def getElementText(element) execute :getElementText, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 524 def getElementValue(element) execute :getElementValue, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 561 def getElementValueOfCssProperty(element, prop) execute :getElementValueOfCssProperty, :id => element, :property_name => prop end
HTML 5
# File lib/selenium/webdriver/remote/bridge.rb, line 266 def getLocalStorageItem(key) execute :getLocalStorageItem, :key => key end
# File lib/selenium/webdriver/remote/bridge.rb, line 274 def getLocalStorageKeys execute :getLocalStorageKeys end
# File lib/selenium/webdriver/remote/bridge.rb, line 286 def getLocalStorageSize execute :getLocalStorageSize end
# File lib/selenium/webdriver/remote/bridge.rb, line 314 def getLocation obj = execute(:getLocation) || {} # android returns null Location.new obj['latitude'], obj['longitude'], obj['altitude'] end
# File lib/selenium/webdriver/remote/bridge.rb, line 504 def getLog(type) data = execute :getLog, {}, :type => type.to_s Array(data).map do |l| LogEntry.new l.fetch('level'), l.fetch('timestamp'), l.fetch('message') end end
# File lib/selenium/webdriver/remote/bridge.rb, line 175 def getPageSource execute :getPageSource end
# File lib/selenium/webdriver/remote/bridge.rb, line 491 def getScreenOrientation execute :getScreenOrientation end
# File lib/selenium/webdriver/remote/bridge.rb, line 258 def getScreenshot execute :screenshot end
# File lib/selenium/webdriver/remote/bridge.rb, line 290 def getSessionStorageItem(key) execute :getSessionStorageItem, :key => key end
# File lib/selenium/webdriver/remote/bridge.rb, line 298 def getSessionStorageKeys execute :getSessionStorageKeys end
# File lib/selenium/webdriver/remote/bridge.rb, line 310 def getSessionStorageSize execute :getSessionStorageSize end
# File lib/selenium/webdriver/remote/bridge.rb, line 171 def getTitle execute :getTitle end
# File lib/selenium/webdriver/remote/bridge.rb, line 179 def getVisible execute :getVisible end
window handling
# File lib/selenium/webdriver/remote/bridge.rb, line 223 def getWindowHandles execute :getWindowHandles end
# File lib/selenium/webdriver/remote/bridge.rb, line 252 def getWindowPosition(handle = :current) data = execute :getWindowPosition, :window_handle => handle Point.new data['x'], data['y'] end
# File lib/selenium/webdriver/remote/bridge.rb, line 241 def getWindowSize(handle = :current) data = execute :getWindowSize, :window_handle => handle Dimension.new data['width'], data['height'] end
navigation
# File lib/selenium/webdriver/remote/bridge.rb, line 159 def goBack execute :goBack end
# File lib/selenium/webdriver/remote/bridge.rb, line 163 def goForward execute :goForward end
# File lib/selenium/webdriver/remote/bridge.rb, line 324 def isBrowserOnline execute :isBrowserOnline end
# File lib/selenium/webdriver/remote/bridge.rb, line 558 def isElementDisplayed(element) execute :isElementDisplayed, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 550 def isElementEnabled(element) execute :isElementEnabled, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 554 def isElementSelected(element) execute :isElementSelected, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 237 def maximizeWindow(handle = :current) execute :maximizeWindow, :window_handle => handle end
# File lib/selenium/webdriver/remote/bridge.rb, line 390 def mouseDown execute :mouseDown end
# File lib/selenium/webdriver/remote/bridge.rb, line 398 def mouseMoveTo(element, x = nil, y = nil) params = { :element => element } if x && y params.merge! :xoffset => x, :yoffset => y end execute :mouseMoveTo, {}, params end
# File lib/selenium/webdriver/remote/bridge.rb, line 394 def mouseUp execute :mouseUp end
# File lib/selenium/webdriver/remote/bridge.rb, line 205 def quit execute :quit http.close rescue *QUIT_ERRORS end
# File lib/selenium/webdriver/remote/bridge.rb, line 215 def refresh execute :refresh end
# File lib/selenium/webdriver/remote/bridge.rb, line 270 def removeLocalStorageItem(key) execute :removeLocalStorageItem, :key => key end
# File lib/selenium/webdriver/remote/bridge.rb, line 294 def removeSessionStorageItem(key) execute :removeSessionStorageItem, :key => key end
# File lib/selenium/webdriver/remote/bridge.rb, line 408 def sendKeysToActiveElement(key) execute :sendKeysToActiveElement, {}, :value => key end
# File lib/selenium/webdriver/remote/bridge.rb, line 412 def sendKeysToElement(element, keys) if @file_detector && local_file = @file_detector.call(keys) keys = upload(local_file) end execute :sendKeysToElement, {:id => element}, {:value => Array(keys)} end
Returns the current session ID.
# File lib/selenium/webdriver/remote/bridge.rb, line 96 def session_id @session_id || raise(Error::WebDriverError, "no current session exists") end
# File lib/selenium/webdriver/remote/bridge.rb, line 147 def setAlertValue(keys) execute :setAlertValue, {}, :text => keys.to_s end
# File lib/selenium/webdriver/remote/bridge.rb, line 328 def setBrowserOnline(bool) execute :setBrowserOnline, {}, :state => bool end
# File lib/selenium/webdriver/remote/bridge.rb, line 119 def setImplicitWaitTimeout(milliseconds) execute :implicitlyWait, {}, :ms => milliseconds end
# File lib/selenium/webdriver/remote/bridge.rb, line 278 def setLocalStorageItem(key, value) execute :setLocalStorageItem, {}, :key => key, :value => value end
# File lib/selenium/webdriver/remote/bridge.rb, line 319 def setLocation(lat, lon, alt) loc = {:latitude => lat, :longitude => lon, :altitude => alt} execute :setLocation, {}, :location => loc end
# File lib/selenium/webdriver/remote/bridge.rb, line 487 def setScreenOrientation(orientation) execute :setScreenOrientation, {}, :orientation => orientation end
# File lib/selenium/webdriver/remote/bridge.rb, line 123 def setScriptTimeout(milliseconds) execute :setScriptTimeout, {}, :ms => milliseconds end
# File lib/selenium/webdriver/remote/bridge.rb, line 302 def setSessionStorageItem(key, value) execute :setSessionStorageItem, {}, :key => key, :value => value end
# File lib/selenium/webdriver/remote/bridge.rb, line 127 def setTimeout(type, milliseconds) execute :setTimeout, {}, :type => type, :ms => milliseconds end
# File lib/selenium/webdriver/remote/bridge.rb, line 183 def setVisible(bool) execute :setVisible, {}, bool end
# File lib/selenium/webdriver/remote/bridge.rb, line 247 def setWindowPosition(x, y, handle = :current) execute :setWindowPosition, {:window_handle => handle}, :x => x, :y => y end
# File lib/selenium/webdriver/remote/bridge.rb, line 231 def setWindowSize(width, height, handle = :current) execute :setWindowSize, {:window_handle => handle}, :width => width, :height => height end
# File lib/selenium/webdriver/remote/bridge.rb, line 107 def status execute :status end
# File lib/selenium/webdriver/remote/bridge.rb, line 433 def submitElement(element) execute :submitElement, :id => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 199 def switchToDefaultContent execute :switchToFrame, {}, :id => nil end
# File lib/selenium/webdriver/remote/bridge.rb, line 191 def switchToFrame(id) execute :switchToFrame, {}, :id => id end
# File lib/selenium/webdriver/remote/bridge.rb, line 195 def switchToParentFrame execute :switchToParentFrame end
# File lib/selenium/webdriver/remote/bridge.rb, line 187 def switchToWindow(name) execute :switchToWindow, {}, :name => name end
# File lib/selenium/webdriver/remote/bridge.rb, line 445 def touchDoubleTap(element) execute :touchDoubleTap, {}, :element => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 453 def touchDown(x, y) execute :touchDown, {}, :x => x, :y => y end
# File lib/selenium/webdriver/remote/bridge.rb, line 479 def touchElementFlick(element, right_by, down_by, speed) execute :touchFlick, {}, :element => element, :xoffset => right_by, :yoffset => down_by, :speed => speed end
# File lib/selenium/webdriver/remote/bridge.rb, line 475 def touchFlick(xspeed, yspeed) execute :touchFlick, {}, :xspeed => xspeed, :yspeed => yspeed end
# File lib/selenium/webdriver/remote/bridge.rb, line 449 def touchLongPress(element) execute :touchLongPress, {}, :element => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 461 def touchMove(x, y) execute :touchMove, {}, :x => x, :y => y end
# File lib/selenium/webdriver/remote/bridge.rb, line 465 def touchScroll(element, x, y) if element execute :touchScroll, {}, :element => element, :xoffset => x, :yoffset => y else execute :touchScroll, {}, :xoffset => x, :yoffset => y end end
# File lib/selenium/webdriver/remote/bridge.rb, line 441 def touchSingleTap(element) execute :touchSingleTap, {}, :element => element end
# File lib/selenium/webdriver/remote/bridge.rb, line 457 def touchUp(x, y) execute :touchUp, {}, :x => x, :y => y end
# File lib/selenium/webdriver/remote/bridge.rb, line 420 def upload(local_file) unless File.file?(local_file) raise Error::WebDriverError, "you may only upload files: #{local_file.inspect}" end execute :uploadFile, {}, :file => Zipper.zip_file(local_file) end
Private Instance Methods
# File lib/selenium/webdriver/remote/bridge.rb, line 604 def assert_javascript_enabled unless capabilities.javascript_enabled? raise Error::UnsupportedOperationError, "underlying webdriver instance does not support javascript" end end
# File lib/selenium/webdriver/remote/bridge.rb, line 643 def escaper @escaper ||= defined?(URI::Parser) ? URI::Parser.new : URI end
executes a command on the remote server.
Returns the 'value' of the returned payload
# File lib/selenium/webdriver/remote/bridge.rb, line 617 def execute(*args) raw_execute(*args)['value'] end
executes a command on the remote server.
@return [WebDriver::Remote::Response]
# File lib/selenium/webdriver/remote/bridge.rb, line 627 def raw_execute(command, opts = {}, command_hash = nil) verb, path = COMMANDS[command] || raise(ArgumentError, "unknown command: #{command.inspect}") path = path.dup path[':session_id'] = @session_id if path.include?(":session_id") begin opts.each { |key, value| path[key.inspect] = escaper.escape(value.to_s) } rescue IndexError raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}" end puts "-> #{verb.to_s.upcase} #{path}" if $DEBUG http.call verb, path, command_hash end