Class: Appium::Core::Driver

Inherits:
Object
  • Object
show all
Includes:
Waitable
Defined in:
lib/appium_lib_core/driver.rb

Constant Summary collapse

DEFAULT_IMPLICIT_WAIT =
0
DEFAULT_APPIUM_PORT =
4723

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Waitable

#wait, #wait_true

Constructor Details

#initialize(opts = {}) ⇒ Driver


275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# File 'lib/appium_lib_core/driver.rb', line 275

def initialize(opts = {})
  @delegate_target = self # for testing purpose
  @automation_name = nil # initialise before `set_automation_name`

  opts = Appium.symbolize_keys opts
  validate_keys(opts)

  @custom_url = opts.delete :url
  @caps = get_caps(opts)

  set_appium_lib_specific_values(get_appium_lib_opts(opts))
  set_app_path
  set_appium_device
  set_automation_name

  extend_for(device: @device, automation_name: @automation_name)

  self # rubocop:disable Lint/Void
end

Instance Attribute Details

#automation_nameHash (readonly)

Automation name sent to appium server or received by server.
If automation_name is nil, it is not set both client side and server side.


111
112
113
# File 'lib/appium_lib_core/driver.rb', line 111

def automation_name
  @automation_name
end

#capsCore::Base::Capabilities (readonly)

Selenium webdriver capabilities


98
99
100
# File 'lib/appium_lib_core/driver.rb', line 98

def caps
  @caps
end

#custom_urlString (readonly)

Custom URL for the selenium server. If set this attribute, ruby_lib_core try to handshake to the custom url.
Defaults to false. Then try to connect to <code>#port/wd/hub127.0.0.1:#{port}/wd/hub>.


116
117
118
# File 'lib/appium_lib_core/driver.rb', line 116

def custom_url
  @custom_url
end

#default_waitInteger (readonly)

Default wait time for elements to appear in Appium server side. Defaults to DEFAULT_IMPLICIT_WAIT.
Provide { appium_lib: { wait: 30 } } to Appium::Core.for


128
129
130
# File 'lib/appium_lib_core/driver.rb', line 128

def default_wait
  @default_wait
end

#deviceSymbol (readonly)

Device type to request from the appium server


106
107
108
# File 'lib/appium_lib_core/driver.rb', line 106

def device
  @device
end

#direct_connectBool (readonly)

[Experimental feature]
Enable an experimental feature updating Http client endpoint following below keys by Appium/Selenium server.
This works with Base::Http::Default.

If your Selenium/Appium server decorates the new session capabilities response with the following keys:

  • directConnectProtocol

  • directConnectHost

  • directConnectPort

  • directConnectPath

Ignore them if this parameter is false. Defaults to false.


170
171
172
# File 'lib/appium_lib_core/driver.rb', line 170

def direct_connect
  @direct_connect
end

#driverAppium::Core::Base::Driver (readonly)


155
156
157
# File 'lib/appium_lib_core/driver.rb', line 155

def driver
  @driver
end

#export_sessionBoolean (readonly)

Export session id to textfile in /tmp for 3rd party tools. False bu default.


120
121
122
# File 'lib/appium_lib_core/driver.rb', line 120

def export_session
  @export_session
end

#export_session_pathString (readonly)


122
123
124
# File 'lib/appium_lib_core/driver.rb', line 122

def export_session_path
  @export_session_path
end

#http_clientAppium::Core::Base::Http::Default (readonly)

Return http client called in start_driver()


102
103
104
# File 'lib/appium_lib_core/driver.rb', line 102

def http_client
  @http_client
end

#listenerObject (readonly)

instance of AbstractEventListener for logging support Nil by default


152
153
154
# File 'lib/appium_lib_core/driver.rb', line 152

def listener
  @listener
end

#portInteger (readonly)

Appium's server port. 4723 is by default. Defaults to DEFAULT_APPIUM_PORT.
Provide { appium_lib: { port: 8080 } } to Appium::Core.for. :custom_url is prior than :port if :custom_url is set.


135
136
137
# File 'lib/appium_lib_core/driver.rb', line 135

def port
  @port
end

#wait_intervalInteger (readonly)

Return a time to wait interval. 0.5 seconds is by default Wait::DEFAULT_INTERVAL.
Wait interval time for Base::Wait, wait and wait_true.
Provide { appium_lib: { wait_interval: 0.1 } } to Appium::Core.for.


148
149
150
# File 'lib/appium_lib_core/driver.rb', line 148

def wait_interval
  @wait_interval
end

#wait_timeoutInteger (readonly)

Return a time wait timeout. 30 seconds is by default Wait::DEFAULT_TIMEOUT.
Wait time for Base::Wait, wait and wait_true.
Provide { appium_lib: { wait_timeout: 20 } } to Appium::Core.for.


142
143
144
# File 'lib/appium_lib_core/driver.rb', line 142

def wait_timeout
  @wait_timeout
end

Class Method Details

.for(opts = {}) ⇒ Driver

Creates a new driver and extend particular methods

Examples:


# format 1
@core = Appium::Core.for caps: {...}, appium_lib: {...}
# format 2. `desired_capabilities:` is also available instead of `caps:`. Either is fine.
@core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", desired_capabilities: {...}, appium_lib: {...}
# format 3. `appium_lib: {...}` can be blank
@core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", desired_capabilities: {...}

require 'rubygems'
require 'appium_lib_core'

# Start iOS driver
opts = {
         caps: {
           platformName: :ios,
           platformVersion: '11.0',
           deviceName: 'iPhone Simulator',
           automationName: 'XCUITest',
           app: '/path/to/MyiOS.app'
         },
         appium_lib: {
           export_session: false,
           port: 8080,
           wait: 0,
           wait_timeout: 20,
           wait_interval: 0.3,
           listener: nil,
         }
       }
@core = Appium::Core.for(opts) # create a core driver with `opts` and extend methods into `self`
@core.start_driver # Connect to `http://127.0.0.1:8080/wd/hub` because of `port: 8080`

# Start iOS driver with .zip file over HTTP
#  `desired_capabilities:` is also available instead of `caps:`. Either is fine.
opts = {
         desired_capabilities: {
           platformName: :ios,
           platformVersion: '11.0',
           deviceName: 'iPhone Simulator',
           automationName: 'XCUITest',
           app: 'http://example.com/path/to/MyiOS.app.zip'
         },
         appium_lib: {
           server_url: 'http://custom-host:8080/wd/hub.com',
           export_session: false,
           wait: 0,
           wait_timeout: 20,
           wait_interval: 0.3,
           listener: nil,
         }
       }
@core = Appium::Core.for(opts)
@core.start_driver # Connect to `http://custom-host:8080/wd/hub.com`

# Start iOS driver as another format. `url` is available like below
opts = {
         url: "http://custom-host:8080/wd/hub.com",
         desired_capabilities: {
           platformName: :ios,
           platformVersion: '11.0',
           deviceName: 'iPhone Simulator',
           automationName: 'XCUITest',
           app: '/path/to/MyiOS.app'
         },
         appium_lib: {
           export_session: false,
           wait: 0,
           wait_timeout: 20,
           wait_interval: 0.3,
           listener: nil,
         }
       }
@core = Appium::Core.for(opts) # create a core driver with `opts` and extend methods into `self`
@core.start_driver # start driver with `url`. Connect to `http://custom-host:8080/wd/hub.com`

Options Hash (opts):

  • :caps (Hash)

    Appium capabilities. Prior than :desired_capabilities

  • :desired_capabilities (Hash)

    The same as :caps. This param is for compatibility with Selenium WebDriver format

  • :appium_lib (Appium::Core::Options)

    Capabilities affect only ruby client

  • :url (String)

    The same as :custom_url in :appium_lib. This param is for compatibility with Selenium WebDriver format


260
261
262
# File 'lib/appium_lib_core/driver.rb', line 260

def self.for(opts = {})
  new(opts)
end

Instance Method Details

#appium_server_versionHash

Returns the server's version info Returns blank hash for Selenium Grid since `remote_status` gets 500 error

Examples:


@core.appium_server_version
  {
      "build" => {
          "version" => "1.9.2",
          "git-sha" => "fd7c7fd19d3896719616cd970229d73e63b5271a",
          "built" => "2018-11-08 12:24:02 +0900"
      }
  }

@core.appium_server_version #=> {}

430
431
432
433
434
435
436
437
# File 'lib/appium_lib_core/driver.rb', line 430

def appium_server_version
  @driver.remote_status
rescue Selenium::WebDriver::Error::ServerError => e
  raise ::Appium::Core::Error::ServerError unless e.message.include?('status code 500')

  # driver.remote_status returns 500 error for using selenium grid
  {}
end

#platform_versionArray<Integer>

Return the platform version as an array of integers

Examples:


@core.platform_version #=> [10,1,1]

446
447
448
449
# File 'lib/appium_lib_core/driver.rb', line 446

def platform_version
  p_version = @driver.capabilities['platformVersion'] || @driver.session_capabilities['platformVersion']
  p_version.split('.').map(&:to_i)
end

#quit_drivervoid

This method returns an undefined value.

Quits the driver

Examples:


@core.quit_driver

404
405
406
407
408
# File 'lib/appium_lib_core/driver.rb', line 404

def quit_driver
  @driver.quit
rescue # rubocop:disable Style/RescueStandardError
  nil
end

#screenshot(png_save_path) ⇒ File

Takes a png screenshot and saves to the target path.

Examples:


@core.screenshot '/tmp/hi.png' #=> nil
# same as `@driver.save_screenshot png_save_path`

461
462
463
464
# File 'lib/appium_lib_core/driver.rb', line 461

def screenshot(png_save_path)
  ::Appium::Logger.warn '[DEPRECATION] screenshot will be removed. Please use driver.save_screenshot instead.'
  @driver.save_screenshot png_save_path
end

#start_driver(server_url: nil, http_client_ops: { http_client: nil, open_timeout: 999_999, read_timeout: 999_999 }) ⇒ Selenium::WebDriver

Creates a new global driver and quits the old one if it exists. You can customise http_client as the following

Examples:


require 'rubygems'
require 'appium_lib_core'

# platformName takes a string or a symbol.

# Start iOS driver
opts = {
         caps: {
           platformName: :ios,
           platformVersion: '11.0',
           deviceName: 'iPhone Simulator',
           automationName: 'XCUITest',
           app: '/path/to/MyiOS.app'
         },
         appium_lib: {
           wait: 20,
           wait_timeout: 20,
           wait_interval: 0.3,
         }
       }

@core = Appium::Core.for(opts) # create a core driver with `opts` and extend methods into `self`
@driver = @core.start_driver server_url: "http://127.0.0.1:8000/wd/hub"

# Attach custom HTTP client
@driver = @core.start_driver server_url: "http://127.0.0.1:8000/wd/hub",
                             http_client_ops: { http_client: Your:Http:Client.new,
                                                open_timeout: 1_000,
                                                read_timeout: 1_000 }

Options Hash (http_client_ops:):

  • :http_client (Hash)

    Custom HTTP Client

  • :open_timeout (Hash)

    Custom open timeout for http client.

  • :read_timeout (Hash)

    Custom read timeout for http client.


338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
# File 'lib/appium_lib_core/driver.rb', line 338

def start_driver(server_url: nil,
                 http_client_ops: { http_client: nil, open_timeout: 999_999, read_timeout: 999_999 })
  @custom_url ||= server_url || "http://127.0.0.1:#{@port}/wd/hub"

  create_http_client http_client: http_client_ops.delete(:http_client),
                     open_timeout: http_client_ops.delete(:open_timeout),
                     read_timeout: http_client_ops.delete(:read_timeout)

  begin
    # included https://github.com/SeleniumHQ/selenium/blob/43f8b3f66e7e01124eff6a5805269ee441f65707/rb/lib/selenium/webdriver/remote/driver.rb#L29
    @driver = ::Appium::Core::Base::Driver.new(http_client: @http_client,
                                               desired_capabilities: @caps,
                                               url: @custom_url,
                                               listener: @listener)

    if @direct_connect
      d_c = DirectConnections.new(@driver.capabilities)
      @driver.update_sending_request_to(protocol: d_c.protocol, host: d_c.host, port: d_c.port, path: d_c.path)
    end

    # export session
    write_session_id(@driver.session_id, @export_session_path) if @export_session
  rescue Errno::ECONNREFUSED
    raise "ERROR: Unable to connect to Appium. Is the server running on #{@custom_url}?"
  end

  # If "automationName" is set only server side, this method set "automationName" attribute into @automation_name.
  # Since @automation_name is set only client side before start_driver is called.
  set_automation_name_if_nil

  set_implicit_wait_by_default(@default_wait)

  @driver
end