Class: Appium::Core::Base::Driver

Inherits:
Selenium::WebDriver::Driver
  • Object
show all
Includes:
SearchContext, TakeScreenshot, Selenium::WebDriver::DriverExtensions::HasRemoteStatus, Selenium::WebDriver::DriverExtensions::HasSessionId, Selenium::WebDriver::DriverExtensions::HasWebStorage, Selenium::WebDriver::DriverExtensions::Rotatable, Selenium::WebDriver::DriverExtensions::UploadsFiles
Defined in:
lib/appium_lib_core/common/base/driver.rb

Constant Summary

Constants included from SearchContext

SearchContext::FINDERS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TakeScreenshot

#element_screenshot_as, #save_element_screenshot, #save_screenshot, #save_viewport_screenshot, #screenshot_as

Methods included from SearchContext

#find_element, #find_elements

Constructor Details

#initialize(opts = {}) ⇒ Driver

Returns a new instance of Driver.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/appium_lib_core/common/base/driver.rb', line 36

def initialize(opts = {})
  listener = opts.delete(:listener)
  @bridge = ::Appium::Core::Base::Bridge.handshake(**opts)
  if @bridge.dialect == :oss # MJSONWP
    extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
    extend ::Selenium::WebDriver::DriverExtensions::HasLocation
    extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
  elsif @bridge.dialect == :w3c
    # TODO: Only for Appium. Ideally, we'd like to remove the below like selenium-webdriver
    extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
    extend ::Selenium::WebDriver::DriverExtensions::HasLocation
    extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
  end
  super(@bridge, listener: listener)
end

Instance Attribute Details

#bridgeObject (readonly)

Private API. Do not use this for general use. Used by flutter driver to get bridge for creating a new element



34
35
36
# File 'lib/appium_lib_core/common/base/driver.rb', line 34

def bridge
  @bridge
end

Instance Method Details

#activate_app(app_id) ⇒ Hash

Activate(Launch) the specified app.

Examples:


@driver.activate_app("io.appium.bundle") #=> {}

Returns:

  • (Hash)


671
672
673
# File 'lib/appium_lib_core/common/base/driver.rb', line 671

def activate_app(app_id)
  @bridge.activate_app(app_id)
end

#app_installed?(app_id) ⇒ Boolean

Check whether the specified app is installed on the device

Examples:


@driver.app_installed?("io.appium.bundle")

Returns:

  • (Boolean)


660
661
662
# File 'lib/appium_lib_core/common/base/driver.rb', line 660

def app_installed?(app_id)
  @bridge.app_installed?(app_id)
end

#app_state(app_id) ⇒ AppState::STATUS Also known as: query_app_state

Get the status of an existing application on the device. State:

:not_installed : The current application state cannot be determined/is unknown
:not_running : The application is not running
:running_in_background_suspended : The application is running in the background and is suspended
:running_in_background : The application is running in the background and is not suspended
:running_in_foreground : The application is running in the foreground

For more details: developer.apple.com/documentation/xctest/xcuiapplicationstate

Examples:


@driver.app_state("io.appium.bundle") #=> :not_running
# Compatibility for other clients
@driver.query_app_state("io.appium.bundle") #=> :not_running

Parameters:

  • app_id (String)

    A target app’s bundle id

Returns:

  • (AppState::STATUS)

    A number of the state



710
711
712
# File 'lib/appium_lib_core/common/base/driver.rb', line 710

def app_state(app_id)
  @bridge.app_state(app_id)
end

#app_strings(language = nil) ⇒ Hash

Return the hash of all localization strings.

Examples:


@driver.app_strings #=> "TransitionsTitle"=>"Transitions", "WebTitle"=>"Web"

Returns:

  • (Hash)


586
587
588
# File 'lib/appium_lib_core/common/base/driver.rb', line 586

def app_strings(language = nil)
  @bridge.app_strings(language)
end

#available_contextsArray<String>

Returns All usable contexts, as an array of strings.

Examples:


@driver.available_contexts

Returns:

  • (Array<String>)

    All usable contexts, as an array of strings.



352
353
354
# File 'lib/appium_lib_core/common/base/driver.rb', line 352

def available_contexts
  @bridge.available_contexts
end

#backString

Get the device window’s size.

Examples:

@driver.back # back to the previous view

Returns:

  • (String)


851
852
853
# File 'lib/appium_lib_core/common/base/driver.rb', line 851

def back
  navigate.back
end

#background_app(duration = 0) ⇒ String

Backgrounds the app for a set number of seconds. This is a blocking application

Examples:


@driver.background_app
@driver.background_app(5)
@driver.background_app(-1) #=> the app never come back. https://github.com/appium/appium/issues/7741

Parameters:

  • duration (Integer) (defaults to: 0)

    How many seconds to background the app for.

Returns:

  • (String)


601
602
603
# File 'lib/appium_lib_core/common/base/driver.rb', line 601

def background_app(duration = 0)
  @bridge.background_app(duration)
end

#close_appObject

Close an app on device

Examples:


@driver.close_app


565
566
567
# File 'lib/appium_lib_core/common/base/driver.rb', line 565

def close_app
  @bridge.close_app
end

#compare_images(mode: :matchFeatures, first_image:, second_image:, options: nil) ⇒ Object



1006
1007
1008
# File 'lib/appium_lib_core/common/base/driver.rb', line 1006

def compare_images(mode: :matchFeatures, first_image:, second_image:, options: nil)
  @bridge.compare_images(mode: mode, first_image: first_image, second_image: second_image, options: options)
end

#context=(context = null) ⇒ Object Also known as: set_context

Change the context to the given context.

Examples:


@driver.set_context "NATIVE_APP"
@driver.context = "NATIVE_APP"

Parameters:

  • context (String) (defaults to: null)

    The context to change to



364
365
366
# File 'lib/appium_lib_core/common/base/driver.rb', line 364

def context=(context = null)
  @bridge.set_context(context)
end

#convert_to_element(id) ⇒ ::Selenium::WebDriver::Element

Convert vanilla element response to ::Selenium::WebDriver::Element

Examples:

response = {"element-6066-11e4-a52e-4f735466cecf"=>"xxxx", "ELEMENT"=>"xxxx"}
ele = @driver.convert_to_element(response) #=> ::Selenium::WebDriver::Element
ele.rect #=> Can get the rect of the element

Parameters:

  • id (Hash)

    The id which can get as a response from server

Returns:



1099
1100
1101
# File 'lib/appium_lib_core/common/base/driver.rb', line 1099

def convert_to_element(id)
  @bridge.convert_to_element id
end

#current_contextString

Returns The context currently being used.

Examples:


@driver.current_context

Returns:

  • (String)

    The context currently being used.



342
343
344
# File 'lib/appium_lib_core/common/base/driver.rb', line 342

def current_context
  @bridge.current_context
end

#device_time(format = nil) ⇒ String

Get the time on the device

Examples:


@driver.device_time #=> "2018-06-12T11:13:31+02:00"
@driver.device_time "YYYY-MM-DD" #=> "2018-06-12"

Parameters:

  • format (String) (defaults to: nil)

    The set of format specifiers. Read momentjs.com/docs/ to get the full list of supported datetime format specifiers. The default format is YYYY-MM-DDTHH:mm:ssZ, which complies to ISO-8601

Returns:

  • (String)

    Formatted datetime string or the raw command output if formatting fails



772
773
774
# File 'lib/appium_lib_core/common/base/driver.rb', line 772

def device_time(format = nil)
  @bridge.device_time(format)
end

#dialect:oss|:w3c

Get the dialect value

Returns:

  • (:oss|:w3c)


54
55
56
# File 'lib/appium_lib_core/common/base/driver.rb', line 54

def dialect
  @bridge.dialect
end

#execute_driver(script: '', type: 'webdriverio', timeout_ms: nil) ⇒ Appium::Core::Base::Device::ExecuteDriver::Result

Run a set of script against the current session, allowing execution of many commands in one Appium request. Supports WebdriverIO API so far. Please read command API for more details about acceptable scripts and the output.

Examples:

script = <<~SCRIPT
  const status = await driver.status();
  console.warn('warning message');
  return [status];
SCRIPT
r = @@driver.execute_driver(script: script, type: 'webdriverio', timeout: 10_000)
r        #=> An instance of Appium::Core::Base::Device::ExecuteDriver::Result
r.result #=> The 'result' key part as the result of the script
r.logs   #=> The 'logs' key part as '{'log' => [], 'warn' => [], 'error' => []}'

Parameters:

  • script (String) (defaults to: '')

    The string consisting of the script itself

  • type (String) (defaults to: 'webdriverio')

    The name of the script type. Defaults to ‘webdriverio’. Depends on server implementation which type is supported.

  • timeout_ms (Integer) (defaults to: nil)

    The number of ms Appium should wait for the script to finish before killing it due to timeout.

Returns:

Raises:

  • (::Selenium::WebDriver::Error::UnknownError)

    If something error happens in the script. It has the original message.

Since:

  • Appium 1.14.0



1085
1086
1087
# File 'lib/appium_lib_core/common/base/driver.rb', line 1085

def execute_driver(script: '', type: 'webdriverio', timeout_ms: nil)
  @bridge.execute_driver(script: script, type: type, timeout_ms: timeout_ms)
end

#find_element_by_image(img_path) ⇒ ::Selenium::WebDriver::Element

Return an element if current view has a partial image. The logic depends on template matching by OpenCV. image-comparison

You can handle settings for the comparision following below. device-settings

Examples:


@@driver.update_settings({ fixImageFindScreenshotDims: false, fixImageTemplateSize: true,
                           autoUpdateImageElementPosition: true })
e = @@driver.find_element_by_image './test/functional/data/test_element_image.png'

Parameters:

  • img_path (String)

    A path to a partial image you’d like to find

Returns:

Since:

  • Appium 1.8.2



1027
1028
1029
1030
# File 'lib/appium_lib_core/common/base/driver.rb', line 1027

def find_element_by_image(img_path)
  template = Base64.strict_encode64 File.read img_path
  find_element :image, template
end

#find_elements_by_image(img_path) ⇒ ::Selenium::WebDriver::Element

Return elements if current view has a partial image. The logic depends on template matching by OpenCV. image-comparison

You can handle settings for the comparision following below. device-settings

Examples:


@@driver.update_settings({ fixImageFindScreenshotDims: false, fixImageTemplateSize: true,
                           autoUpdateImageElementPosition: true })
e = @@driver.find_elements_by_image ['./test/functional/data/test_element_image.png']
e == [] # if the 'e' is empty

Parameters:

  • img_path (String)

    A path to a partial image you’d like to find

Returns:

Since:

  • Appium 1.8.2



1050
1051
1052
1053
# File 'lib/appium_lib_core/common/base/driver.rb', line 1050

def find_elements_by_image(img_path)
  template = Base64.strict_encode64 File.read img_path
  find_elements :image, template
end

#find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil) ⇒ Object



995
996
997
998
999
1000
# File 'lib/appium_lib_core/common/base/driver.rb', line 995

def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
  @bridge.find_image_occurrence(full_image: full_image,
                                partial_image: partial_image,
                                visualize: visualize,
                                threshold: threshold)
end

#get_images_similarity(first_image:, second_image:, visualize: false) ⇒ Object



1002
1003
1004
# File 'lib/appium_lib_core/common/base/driver.rb', line 1002

def get_images_similarity(first_image:, second_image:, visualize: false)
  @bridge.get_images_similarity(first_image: first_image, second_image: second_image, visualize: visualize)
end

#get_settingsObject

Get appium Settings for current test session. Alias of @driver.settings.get

Examples:


@driver.get_settings
@driver.settings.get


192
193
194
# File 'lib/appium_lib_core/common/base/driver.rb', line 192

def get_settings
  settings.get
end

#get_timeoutsHash

For W3C. Get the timeout related settings on the server side.

Examples:

@driver.get_timeouts

Returns:

  • (Hash)


875
876
877
# File 'lib/appium_lib_core/common/base/driver.rb', line 875

def get_timeouts
  @bridge.get_timeouts
end

#hide_keyboard(close_key = nil, strategy = nil) ⇒ Object

Hide the onscreen keyboard

Examples:


@driver.hide_keyboard # Close a keyboard with the 'Done' button
@driver.hide_keyboard('Finished') # Close a keyboard with the 'Finished' button
@driver.hide_keyboard(nil, :tapOutside) # Close a keyboard with tapping out side of keyboard

Parameters:

  • close_key (String) (defaults to: nil)

    The name of the key which closes the keyboard. Defaults to ‘Done’ for iOS(except for XCUITest).

  • strategy (Symbol) (defaults to: nil)

    The symbol of the strategy which closes the keyboard. XCUITest ignore this argument. Default for iOS is :pressKey. Default for Android is :tapOutside.



125
126
127
# File 'lib/appium_lib_core/common/base/driver.rb', line 125

def hide_keyboard(close_key = nil, strategy = nil)
  @bridge.hide_keyboard close_key, strategy
end

#imeObject

Returns an instance of DeviceIME

Examples:


@driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'
@driver.ime.available_engines #=> Get the list of IME installed in the target device
@driver.ime.active_engine #=> Get the current active IME such as 'com.android.inputmethod.latin/.LatinIME'
@driver.ime.activated #=> True if IME is activated
@driver.ime.deactivate #=> Deactivate current IME engine


250
251
252
# File 'lib/appium_lib_core/common/base/driver.rb', line 250

def ime
  @device_ime ||= DeviceIME.new(@bridge) # rubocop:disable Naming/MemoizedInstanceVariableName
end

#ime_activate(ime_name) ⇒ Object

Android only. Make an engine that is available active.

Examples:


@driver.ime_activate engine: 'com.android.inputmethod.latin/.LatinIME'
@driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'

Parameters:

  • ime_name (String)

    The IME owning the activity [required]



263
264
265
# File 'lib/appium_lib_core/common/base/driver.rb', line 263

def ime_activate(ime_name)
  ime.activate(ime_name)
end

#ime_activatedObject

Examples:


@driver.ime_activated #=> True if IME is activated
@driver.ime.activated #=> True if IME is activated


297
298
299
# File 'lib/appium_lib_core/common/base/driver.rb', line 297

def ime_activated
  ime.activated?
end

#ime_active_engineObject

Android only. Get the name of the active IME engine.

Examples:


@driver.ime_active_engine #=> Get the current active IME such as 'com.android.inputmethod.latin/.LatinIME'
@driver.ime.active_engine #=> Get the current active IME such as 'com.android.inputmethod.latin/.LatinIME'


285
286
287
# File 'lib/appium_lib_core/common/base/driver.rb', line 285

def ime_active_engine
  ime.active_engine
end

#ime_available_enginesObject

Android only. List all available input engines on the machine.

Examples:


@driver.ime_available_engines #=> Get the list of IME installed in the target device
@driver.ime.available_engines #=> Get the list of IME installed in the target device


274
275
276
# File 'lib/appium_lib_core/common/base/driver.rb', line 274

def ime_available_engines
  ime.available_engines
end

#ime_deactivateObject

Android only. De-activates the currently-active IME engine.

Examples:


@driver.ime_deactivate #=> Deactivate current IME engine
@driver.ime.deactivate #=> Deactivate current IME engine


308
309
310
# File 'lib/appium_lib_core/common/base/driver.rb', line 308

def ime_deactivate
  ime.deactivate
end

#install_app(path, replace: nil, timeout: nil, allow_test_packages: nil, use_sdcard: nil, grant_permissions: nil) ⇒ Object

Install the given app onto the device

Examples:


@driver.install_app("/path/to/test.apk")
@driver.install_app("/path/to/test.apk", replace: true, timeout: 20000, allow_test_packages: true,
                    use_sdcard: false, grant_permissions: false)

Parameters:

  • path (String)

    The absolute local path or remote http URL to an .ipa or .apk file, or a .zip containing one of these.

  • replace (Boolean) (defaults to: nil)

    Only for Android. Whether to reinstall/upgrade the package if it is already present on the device under test. true by default

  • timeout (Integer) (defaults to: nil)

    Only for Android. How much time to wait for the installation to complete. 60000ms by default.

  • allow_test_packages (Boolean) (defaults to: nil)

    Only for Android. Whether to allow installation of packages marked as test in the manifest. false by default

  • use_sdcard (Boolean) (defaults to: nil)

    Only for Android. Whether to use the SD card to install the app. false by default

  • grant_permissions (Boolean) (defaults to: nil)

    Only for Android. whether to automatically grant application permissions on Android 6+ after the installation completes. false by default



625
626
627
628
629
630
631
632
633
634
635
636
637
# File 'lib/appium_lib_core/common/base/driver.rb', line 625

def install_app(path,
                replace: nil,
                timeout: nil,
                allow_test_packages: nil,
                use_sdcard: nil,
                grant_permissions: nil)
  @bridge.install_app(path,
                      replace: replace,
                      timeout: timeout,
                      allow_test_packages: allow_test_packages,
                      use_sdcard: use_sdcard,
                      grant_permissions: grant_permissions)
end

#keyboard_shown?Boolean Also known as: is_keyboard_shown

Get whether keyboard is displayed or not.

Examples:

@driver.is_keyboard_shown # false
@driver.keyboard_shown?   # true

Returns:

  • (Boolean)

    Return true if keyboard is shown. Return false if keyboard is hidden.



136
137
138
# File 'lib/appium_lib_core/common/base/driver.rb', line 136

def keyboard_shown?
  @bridge.is_keyboard_shown
end

#keyevent(key, metastate = nil) ⇒ Object

Send keyevent on the device.(Only for Selendroid) developer.android.com/reference/android/view/KeyEvent.html

Examples:


@driver.keyevent 82

Parameters:

  • key (integer)

    The key to press.

  • metastate (String) (defaults to: nil)

    The state the metakeys should be in when pressing the key.



501
502
503
# File 'lib/appium_lib_core/common/base/driver.rb', line 501

def keyevent(key, metastate = nil)
  @bridge.keyevent(key, metastate)
end

#launch_appObject

Start the simulator and application configured with desired capabilities

Examples:


@driver.launch_app


555
556
557
# File 'lib/appium_lib_core/common/base/driver.rb', line 555

def launch_app
  @bridge.launch_app
end

#lock(duration = nil) ⇒ String

Lock the device

Examples:


@driver.lock    #=> Lock the device
@driver.lock(5) #=> Lock the device in 5 sec and unlock the device after 5 sec.
                #   Block other commands during locking the device.

Returns:

  • (String)


86
87
88
# File 'lib/appium_lib_core/common/base/driver.rb', line 86

def lock(duration = nil)
  @bridge.lock(duration)
end

#locked?Boolean Also known as: device_locked?

Check current device status is weather locked or not

Examples:


@driver.device_locked?
@driver.locked?

Returns:

  • (Boolean)


97
98
99
# File 'lib/appium_lib_core/common/base/driver.rb', line 97

def locked?
  @bridge.device_locked?
end

#logsString

Get the device window’s logs.

Examples:


@driver.logs.available_types # [:syslog, :crashlog, :performance]
@driver.logs.get :syslog # []

Returns:

  • (String)


863
864
865
# File 'lib/appium_lib_core/common/base/driver.rb', line 863

def logs
  @logs ||= Logs.new(@bridge)
end

#long_press_keycode(key, metastate: [], flags: []) ⇒ Object

Examples:


@driver.long_press_keycode 66
@driver.long_press_keycode 66, flags: [0x20, 0x2000]
@driver.long_press_keycode 66, metastate: [1], flags: [32, 8192]

Parameters:



545
546
547
# File 'lib/appium_lib_core/common/base/driver.rb', line 545

def long_press_keycode(key, metastate: [], flags: [])
  @bridge.long_press_keycode(key, metastate: metastate, flags: flags)
end

#match_images_features(first_image:, second_image:, detector_name: 'ORB', match_func: 'BruteForce', good_matches_factor: nil, visualize: false) ⇒ Object

Image Comparison



981
982
983
984
985
986
987
988
989
990
991
992
993
# File 'lib/appium_lib_core/common/base/driver.rb', line 981

def match_images_features(first_image:,
                          second_image:,
                          detector_name: 'ORB',
                          match_func: 'BruteForce',
                          good_matches_factor: nil,
                          visualize: false)
  @bridge.match_images_features(first_image: first_image,
                                second_image: second_image,
                                detector_name: detector_name,
                                match_func: match_func,
                                good_matches_factor: good_matches_factor,
                                visualize: visualize)
end

#multi_touch(actions) ⇒ Object



781
782
783
# File 'lib/appium_lib_core/common/base/driver.rb', line 781

def multi_touch(actions)
  @bridge.multi_touch(actions)
end

#perform_actions(data) ⇒ Object

Send multiple W3C action chains to server. Use @driver.action for single action chain.

@example: Zoom

f1 = @driver.action.add_pointer_input(:touch, 'finger1')
f1.create_pointer_move(duration: 1, x: 200, y: 500,
                       origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
f1.create_pointer_down(:left)
f1.create_pointer_move(duration: 1, x: 200, y: 200,
                       origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
f1.create_pointer_up(:left)

f2 = @driver.action.add_pointer_input(:touch, 'finger2')
f2.create_pointer_move(duration: 1, x: 200, y: 500,
                       origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
f2.create_pointer_down(:left)
f2.create_pointer_move(duration: 1, x: 200, y: 800,
                       origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
f2.create_pointer_up(:left)

@driver.perform_actions [f1, f2] #=> 'nil' if the action succeed

Parameters:

  • data (Array)

    Array of actions

Returns:

  • nil|error

Raises:

  • (ArgumentError)


811
812
813
814
815
816
817
# File 'lib/appium_lib_core/common/base/driver.rb', line 811

def perform_actions(data)
  raise ArgumentError, "'#{data}' must be Array" unless data.is_a? Array

  @bridge.send_actions data.map(&:encode).compact
  data.each(&:clear_actions)
  nil
end

#press_keycode(key, metastate: [], flags: []) ⇒ Object

Examples:


@driver.press_keycode 66
@driver.press_keycode 66, flags: [0x02]
@driver.press_keycode 66, metastate: [1], flags: [32]

Parameters:



523
524
525
# File 'lib/appium_lib_core/common/base/driver.rb', line 523

def press_keycode(key, metastate: [], flags: [])
  @bridge.press_keycode(key, metastate: metastate, flags: flags)
end

#pull_file(path) ⇒ Base64-decoded

Pull a file from the simulator/device. On iOS the server should have ifuse libraries installed and configured properly for this feature to work on real devices. On Android the application under test should be built with debuggable flag enabled in order to get access to its container on the internal file system.

iFuse GitHub page6

osxFuse FAQ

‘Debug Your App’ developer article

Examples:


decoded_file = @driver.pull_file '/local/data/some/path'     #=> Get the file at that path
decoded_file = @driver.pull_file 'Shenanigans.app/some/file'
               #=> Get 'some/file' from the install location of Shenanigans.app
decoded_file = @driver.pull_file '@com.appium.example/Documents/file.txt'
               #=> Get 'file.txt' in @com.appium.example/Documents
File.open('proper_filename', 'wb') { |f| f<< decoded_file }

Parameters:

  • path (String)

    Either an absolute path OR, for iOS devices, a path relative to the app, as described. If the path starts with application id prefix, then the file will be pulled from the root of the corresponding application container. Otherwise the root folder is considered as / on Android and on iOS it is a media folder root (real devices only). Only pulling files from application containers is supported for iOS Simulator. Provide the remote path in format @bundle.identifier:container_type/relative_path_in_container (Make sure this in ifuse doc)

Returns:

  • (Base64-decoded)

    Base64 decoded data



454
455
456
# File 'lib/appium_lib_core/common/base/driver.rb', line 454

def pull_file(path)
  @bridge.pull_file(path)
end

#pull_folder(path) ⇒ Base64-decoded

Pull a folder content from the simulator/device. On iOS the server should have ifuse libraries installed and configured properly for this feature to work on real devices. On Android the application under test should be built with debuggable flag enabled in order to get access to its container on the internal file system.

iFuse GitHub page6

osxFuse FAQ

‘Debug Your App’ developer article

Examples:


decoded_file = @driver.pull_folder '/data/local/tmp' #=> Get the folder at that path
decoded_file = @driver.pull_file '@com.appium.example/Documents' #=> Get 'Documents' in @com.appium.example
File.open('proper_filename', 'wb') { |f| f<< decoded_file }

Parameters:

  • path (String)

    Absolute path to the folder. If the path starts with @applicationId/ prefix, then the folder will be pulled from the root of the corresponding application container. Otherwise the root folder is considered as / on Android and on iOS it is a media folder root (real devices only). Only pulling files from application containers is supported for iOS Simulator. Provide the remote path in format @bundle.identifier:container_type/relative_path_in_container (Make sure this in ifuse doc)

Returns:

  • (Base64-decoded)

    Base64 decoded data which is zip archived



488
489
490
# File 'lib/appium_lib_core/common/base/driver.rb', line 488

def pull_folder(path)
  @bridge.pull_folder(path)
end

#push_file(path, filedata) ⇒ Object

Place a file in a specific location on the device. On iOS, the server should have ifuse libraries installed and configured properly for this feature to work on real devices. On Android, the application under test should be built with debuggable flag enabled in order to get access to its container on the internal file system.

iFuse GitHub page6

osxFuse FAQ

‘Debug Your App’ developer article

Examples:


@driver.push_file "/file/to/path", "data"

file = File.read "your/path/to/test_image.png"
@driver.push_file "/sdcard/Pictures", file # Push a file binary to /sdcard/Pictures path in Android

Parameters:

  • path (String)

    Either an absolute path OR, for iOS devices, a path relative to the app, as described. If the path starts with application id prefix, then the file will be pushed to the root of the corresponding application container.

  • filedata (String)

    Raw file data to be sent to the device. Converted to base64 in the method.



417
418
419
# File 'lib/appium_lib_core/common/base/driver.rb', line 417

def push_file(path, filedata)
  @bridge.push_file(path, filedata)
end

#remove_app(app_id, keep_data: nil, timeout: nil) ⇒ Object

Examples:


@driver.remove_app("io.appium.bundle")
@driver.remove_app("io.appium.bundle", keep_data: false, timeout, 10000)

Parameters:

  • app_id (Strong)

    BundleId for iOS or package name for Android

  • keep_data (Boolean) (defaults to: nil)

    Only for Android. Whether to keep application data and caches after it is uninstalled. false by default

  • timeout (Integer) (defaults to: nil)

    Only for Android. How much time to wait for the uninstall to complete. 20000ms by default.



649
650
651
# File 'lib/appium_lib_core/common/base/driver.rb', line 649

def remove_app(app_id, keep_data: nil, timeout: nil)
  @bridge.remove_app(app_id, keep_data: keep_data, timeout: timeout)
end

#replace_value(element, *value) ⇒ Object

Replace the value to element directly

Examples:


@driver.replace_value element, 'hello'


387
388
389
390
391
# File 'lib/appium_lib_core/common/base/driver.rb', line 387

def replace_value(element, *value)
  ::Appium::Logger.warn '[DEPRECATION] driver#replace_value(element, *value) is deprecated. ' \
    'Use Element#replace_value(*value) instead'
  @bridge.replace_value(element, *value)
end

#resetObject

Reset the device, relaunching the application.

Examples:


@driver.reset


575
576
577
# File 'lib/appium_lib_core/common/base/driver.rb', line 575

def reset
  @bridge.reset
end

#send_keys(*key) ⇒ Object Also known as: type

DEPRECATION

Send keys for a current active element

Examples:


@driver.send_keys 'happy testing!'

Parameters:

  • key (String)

    Input text



149
150
151
152
153
154
# File 'lib/appium_lib_core/common/base/driver.rb', line 149

def send_keys(*key)
  ::Appium::Logger.warn(
    '[DEPRECATION] Driver#send_keys is deprecated in W3C spec. Use driver.action.<command>.perform instead'
  )
  @bridge.send_keys_to_active_element(key)
end

#session_capabilitiesSelenium::WebDriver::Remote::Capabilities

Retrieve the capabilities of the specified session. It’s almost same as @driver.capabilities but you can get more details.

Examples:

@driver.session_capabilities

#=> uiautomator2
# <Selenium::WebDriver::Remote::W3C::Capabilities:0x007fa38dae1360
# @capabilities=
#     {:proxy=>nil,
#      :browser_name=>nil,
#      :browser_version=>nil,
#      :platform_name=>"android",
#      :page_load_strategy=>nil,
#      :remote_session_id=>nil,
#      :accessibility_checks=>nil,
#      :profile=>nil,
#      :rotatable=>nil,
#      :device=>nil,
#      "platform"=>"LINUX",
#      "webStorageEnabled"=>false,
#      "takesScreenshot"=>true,
#      "javascriptEnabled"=>true,
#      "databaseEnabled"=>false,
#      "networkConnectionEnabled"=>true,
#      "locationContextEnabled"=>false,
#      "warnings"=>{},
#      "desired"=>
#          {"platformName"=>"android",
#           "automationName"=>"uiautomator2",
#           "app"=>"/path/to/app/api.apk.zip",
#           "platformVersion"=>"8.1.0",
#           "deviceName"=>"Android Emulator",
#           "appPackage"=>"io.appium.android.apis",
#           "appActivity"=>"io.appium.android.apis.ApiDemos",
#           "someCapability"=>"some_capability",
#           "unicodeKeyboard"=>true,
#           "resetKeyboard"=>true},
#      "automationName"=>"uiautomator2",
#      "app"=>"/path/to/app/api.apk.zip",
#      "platformVersion"=>"8.1.0",
#      "deviceName"=>"emulator-5554",
#      "appPackage"=>"io.appium.android.apis",
#      "appActivity"=>"io.appium.android.apis.ApiDemos",
#      "someCapability"=>"some_capability",
#      "unicodeKeyboard"=>true,
#      "resetKeyboard"=>true,
#      "deviceUDID"=>"emulator-5554",
#      "deviceScreenSize"=>"1080x1920",
#      "deviceScreenDensity"=>420,
#      "deviceModel"=>"Android SDK built for x86",
#      "deviceManufacturer"=>"Google",
#      "pixelRatio"=>2.625,
#      "statBarHeight"=>63,
#      "viewportRect"=>{"left"=>0, "top"=>63, "width"=>1080, "height"=>1731}}>
#
#=> XCUITest
# <Selenium::WebDriver::Remote::W3C::Capabilities:0x007fb15dc01370
# @capabilities=
#     {:proxy=>nil,
#      :browser_name=>"UICatalog",
#      :browser_version=>nil,
#      :platform_name=>"ios",
#      :page_load_strategy=>nil,
#      :remote_session_id=>nil,
#      :accessibility_checks=>nil,
#      :profile=>nil,
#      :rotatable=>nil,
#      :device=>"iphone",
#      "udid"=>"DED4DBAD-8E5E-4AD6-BDC4-E75CF9AD84D8",
#      "automationName"=>"XCUITest",
#      "app"=>"/path/to/app/UICatalog.app",
#      "platformVersion"=>"11.4",
#      "deviceName"=>"iPhone Simulator",
#      "useNewWDA"=>true,
#      "useJSONSource"=>true,
#      "someCapability"=>"some_capability",
#      "sdkVersion"=>"11.4",
#      "CFBundleIdentifier"=>"com.example.apple-samplecode.UICatalog",
#      "pixelRatio"=>2,
#      "statBarHeight"=>23.4375,
#      "viewportRect"=>{"left"=>0, "top"=>47, "width"=>750, "height"=>1287}}>

Returns:

  • (Selenium::WebDriver::Remote::Capabilities)


964
965
966
# File 'lib/appium_lib_core/common/base/driver.rb', line 964

def session_capabilities
  @bridge.session_capabilities
end

#sessions[Hash]

Returns available sessions on the Appium server

Examples:


@driver.sessions #=> [{'id' => 'c363add8-a7ca-4455-b9e3-9ac4d69e95b3', 'capabilities' => { capabilities as Hash }}]

Returns:

  • ([Hash])


976
977
978
# File 'lib/appium_lib_core/common/base/driver.rb', line 976

def sessions
  @bridge.sessions
end

#set_immediate_value(element, *value) ⇒ Object

Set the value to element directly

Examples:


@driver.set_immediate_value element, 'hello'


375
376
377
378
379
# File 'lib/appium_lib_core/common/base/driver.rb', line 375

def set_immediate_value(element, *value)
  ::Appium::Logger.warn '[DEPRECATION] driver#set_immediate_value(element, *value) is deprecated. ' \
    'Use Element#immediate_value(*value) instead'
  @bridge.set_immediate_value(element, *value)
end

#settingsObject

Returns an instance of DriverSettings to call get/update.

Examples:


@driver.settings.get
@driver.settings.update('allowInvisibleElements': true)


180
181
182
# File 'lib/appium_lib_core/common/base/driver.rb', line 180

def settings
  @driver_settings ||= DriverSettings.new(@bridge) # rubocop:disable Naming/MemoizedInstanceVariableName
end

#settings=(value) ⇒ Object Also known as: update_settings

Update Appium Settings for current test session Alias of @driver.settings#update

Examples:


@driver.update_settings('allowInvisibleElements': true)
@driver.settings.update('allowInvisibleElements': true)
@driver.settings = { 'allowInvisibleElements': true }

Parameters:

  • value (Hash)

    Settings to update, keys are settings, values to value to set each setting to



207
208
209
# File 'lib/appium_lib_core/common/base/driver.rb', line 207

def settings=(value)
  settings.update(value)
end

#shakeObject

Cause the device to shake

Examples:


@driver.shake


756
757
758
# File 'lib/appium_lib_core/common/base/driver.rb', line 756

def shake
  @bridge.shake
end

#stop_and_save_recording_screen(file_path) ⇒ Object

Examples:


# iOS
@driver.start_recording_screen video_type: 'libx264'
@driver.stop_and_save_recording_screen 'example.mp4' # Video type 'libx264' can be play as '.mp4' video

# Android
@driver.start_recording_screen
@driver.stop_and_save_recording_screen 'example.mp4'

Parameters:

  • file_path (String)

    The path to save video decoded from base64 from Appium server.



746
747
748
# File 'lib/appium_lib_core/common/base/driver.rb', line 746

def stop_and_save_recording_screen(file_path)
  @bridge.stop_and_save_recording_screen(file_path)
end

#stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT') ⇒ Object

Examples:


@driver.stop_recording_screen
@driver.stop_recording_screen remote_path: 'https://example.com', user: 'example', pass: 'pass', method: 'POST'

Parameters:

  • remote_path (String) (defaults to: nil)

    The path to the remote location, where the resulting video should be uploaded. The following protocols are supported: http/https, ftp. Null or empty string value (the default setting) means the content of resulting file should be encoded as Base64 and passed as the endpoint response value. An exception will be thrown if the generated media file is too big to fit into the available process memory.

  • user (String) (defaults to: nil)

    The name of the user for the remote authentication.

  • pass (String) (defaults to: nil)

    The password for the remote authentication.

  • method (String) (defaults to: 'PUT')

    The http multipart upload method name. The ‘PUT’ one is used by default.



730
731
732
# File 'lib/appium_lib_core/common/base/driver.rb', line 730

def stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT')
  @bridge.stop_recording_screen(remote_path: remote_path, user: user, pass: pass, method: method)
end

#switch_to_default_contextObject

Change to the default context. This is equivalent to set_context nil.

Examples:


@driver.switch_to_default_context


332
333
334
# File 'lib/appium_lib_core/common/base/driver.rb', line 332

def switch_to_default_context
  @bridge.switch_to_default_context
end

#terminate_app(app_id, timeout: nil) ⇒ Boolean

Terminate the specified app.

Examples:


@driver.terminate_app("io.appium.bundle") # true
@driver.terminate_app("io.appium.bundle", timeout: 500)

Parameters:

  • app_id (Strong)

    BundleId for iOS or package name for Android

  • timeout (Integer) (defaults to: nil)

    Only for Android. How much time to wait for the application termination to complete. 500ms by default.

Returns:

  • (Boolean)


687
688
689
# File 'lib/appium_lib_core/common/base/driver.rb', line 687

def terminate_app(app_id, timeout: nil)
  @bridge.terminate_app(app_id, timeout: timeout)
end

#touch_actions(actions) ⇒ Object

touch actions



777
778
779
# File 'lib/appium_lib_core/common/base/driver.rb', line 777

def touch_actions(actions)
  @bridge.touch_actions(actions)
end

#unlockObject

Unlock the device

Examples:


@driver.unlock


108
109
110
# File 'lib/appium_lib_core/common/base/driver.rb', line 108

def unlock
  @bridge.unlock
end

#update_sending_request_to(protocol:, host:, port:, path:) ⇒ Object

Update server_url and HTTP clients following this arguments, protocol, host, port and path. After this method, @bridge.http will be a new instance following them instead of server_url which is set before creating session.

Examples:


driver = core.start_driver server_url: 'http://example1.com:8000/wd/hub # @bridge.http is for 'http://example1.com:8000/wd/hub/'
driver.update_sending_request_to protocol: 'https', host: 'example2.com', port: 9000, path: '/wd/hub'
driver.manage.timeouts.implicit_wait = 10 # @bridge.http is for 'https://example2.com:9000/wd/hub/'


68
69
70
71
72
73
# File 'lib/appium_lib_core/common/base/driver.rb', line 68

def update_sending_request_to(protocol:, host:, port:, path:)
  @bridge.http.update_sending_request_to(scheme: protocol,
                                         host: host,
                                         port: port,
                                         path: path)
end

#window_rectSelenium::WebDriver::Rectangle

Get the device window’s rect.

Examples:

size = @driver.window_rect
size.width #=> Integer
size.height #=> Integer
size.x #=> 0
size.y #=> 0

Returns:

  • (Selenium::WebDriver::Rectangle)


841
842
843
# File 'lib/appium_lib_core/common/base/driver.rb', line 841

def window_rect
  manage.window.rect
end

#window_sizeSelenium::WebDriver::Dimension

Get the device window’s size.

Examples:

size = @driver.window_size
size.width #=> Integer
size.height #=> Integer

Returns:

  • (Selenium::WebDriver::Dimension)


827
828
829
# File 'lib/appium_lib_core/common/base/driver.rb', line 827

def window_size
  manage.window.size
end

#within_context(context, &block) ⇒ Object

Perform a block within the given context, then switch back to the starting context.

Examples:


result = @driver.within_context('NATIVE_APP') do
  @driver.find_element :tag, "button"
end # The result of 'find_element :tag, "button"'

Parameters:

  • context (String)

    The context to switch to for the duration of the block.

  • block (Proc)

    The block to involve within the context



322
323
324
# File 'lib/appium_lib_core/common/base/driver.rb', line 322

def within_context(context, &block)
  block_given? ? @bridge.within_context(context, &block) : @bridge.within_context(context)
end