appium_lib_core 4.1.0 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +357 -270
  3. data/README.md +68 -16
  4. data/Rakefile +8 -20
  5. data/Steepfile +11 -0
  6. data/appium_lib_core.gemspec +13 -15
  7. data/bin/console +0 -4
  8. data/lib/appium_lib_core/android/device/auth_finger_print.rb +4 -1
  9. data/lib/appium_lib_core/android/device/clipboard.rb +4 -2
  10. data/lib/appium_lib_core/android/device/emulator.rb +11 -5
  11. data/lib/appium_lib_core/android/device/network.rb +10 -0
  12. data/lib/appium_lib_core/android/device/performance.rb +3 -0
  13. data/lib/appium_lib_core/android/device/screen.rb +5 -1
  14. data/lib/appium_lib_core/android/device.rb +83 -20
  15. data/lib/appium_lib_core/common/base/bridge.rb +238 -95
  16. data/lib/appium_lib_core/common/base/capabilities.rb +21 -8
  17. data/lib/appium_lib_core/common/{command/mjsonwp.rb → base/device_ime.rb} +33 -12
  18. data/lib/appium_lib_core/common/base/driver.rb +260 -334
  19. data/lib/appium_lib_core/common/base/driver_settings.rb +51 -0
  20. data/lib/appium_lib_core/common/base/has_location.rb +80 -0
  21. data/lib/appium_lib_core/common/base/has_network_connection.rb +56 -0
  22. data/lib/appium_lib_core/common/base/http_default.rb +22 -38
  23. data/lib/appium_lib_core/{ios/uiautomation/bridge.rb → common/base/remote_status.rb} +9 -8
  24. data/lib/appium_lib_core/common/base/rotable.rb +62 -0
  25. data/lib/appium_lib_core/common/base/screenshot.rb +10 -10
  26. data/lib/appium_lib_core/common/base/search_context.rb +98 -172
  27. data/lib/appium_lib_core/common/base.rb +1 -5
  28. data/lib/appium_lib_core/common/command.rb +244 -4
  29. data/lib/appium_lib_core/common/device/app_management.rb +2 -26
  30. data/lib/appium_lib_core/common/device/context.rb +1 -5
  31. data/lib/appium_lib_core/common/device/image_comparison.rb +27 -10
  32. data/lib/appium_lib_core/common/device/keyevent.rb +4 -4
  33. data/lib/appium_lib_core/common/device/{touch_actions.rb → orientation.rb} +6 -10
  34. data/lib/appium_lib_core/common/device/screen_record.rb +8 -2
  35. data/lib/appium_lib_core/common/error.rb +5 -5
  36. data/lib/appium_lib_core/common/log.rb +5 -4
  37. data/lib/appium_lib_core/common/wait.rb +38 -6
  38. data/lib/appium_lib_core/device.rb +3 -9
  39. data/lib/appium_lib_core/driver.rb +193 -182
  40. data/lib/appium_lib_core/{patch.rb → element.rb} +64 -26
  41. data/lib/appium_lib_core/ios/device/clipboard.rb +4 -2
  42. data/lib/appium_lib_core/ios/xcuitest/device.rb +2 -0
  43. data/lib/appium_lib_core/{common/base/command.rb → mac2/bridge.rb} +9 -8
  44. data/lib/appium_lib_core/mac2/device/screen.rb +48 -0
  45. data/lib/appium_lib_core/mac2/device.rb +92 -0
  46. data/lib/appium_lib_core/{ios.rb → mac2.rb} +2 -5
  47. data/lib/appium_lib_core/support/event_firing_bridge.rb +57 -0
  48. data/lib/appium_lib_core/version.rb +2 -2
  49. data/lib/appium_lib_core.rb +23 -10
  50. data/rbs_collection.lock.yaml +252 -0
  51. data/rbs_collection.yaml +15 -0
  52. data/sig/gems/selenium/abstract_event_listener.rbs +8 -0
  53. data/sig/gems/selenium/capabilities.rbs +8 -0
  54. data/sig/gems/selenium/common.rbs +10 -0
  55. data/sig/gems/selenium/default.rbs +10 -0
  56. data/sig/gems/selenium/driver.rbs +7 -0
  57. data/sig/gems/selenium/has_session_id.rbs +8 -0
  58. data/sig/gems/selenium/has_web_storage.rbs +8 -0
  59. data/sig/gems/selenium/uploads_files.rbs +8 -0
  60. data/sig/lib/appium_lib_core/common/base/capabilities.rbs +9 -0
  61. data/sig/lib/appium_lib_core/common/base/driver.rbs +167 -0
  62. data/sig/lib/appium_lib_core/common/base/driver_settings.rbs +15 -0
  63. data/sig/lib/appium_lib_core/common/base/has_location.rbs +13 -0
  64. data/sig/lib/appium_lib_core/common/base/has_network_connection.rbs +19 -0
  65. data/sig/lib/appium_lib_core/common/base/http_default.rbs +38 -0
  66. data/sig/lib/appium_lib_core/common/base/platform.rbs +7 -0
  67. data/sig/lib/appium_lib_core/common/base/remote_status.rbs +9 -0
  68. data/sig/lib/appium_lib_core/common/base/rotable.rbs +17 -0
  69. data/sig/lib/appium_lib_core/common/base/screenshot.rbs +19 -0
  70. data/sig/lib/appium_lib_core/common/device/battery_status.rbs +13 -0
  71. data/sig/lib/appium_lib_core/common/wait.rbs +31 -0
  72. data/sig/lib/appium_lib_core/device.rbs +21 -0
  73. data/sig/lib/appium_lib_core/driver.rbs +196 -0
  74. data/sig/lib/appium_lib_core/ios/xcuitest/device/battery.rbs +15 -0
  75. data/sig/lib/appium_lib_core/version.rbs +7 -0
  76. data/sig/lib/appium_lib_core.rbs +8 -0
  77. metadata +88 -111
  78. data/.github/ISSUE_TEMPLATE/issue-report.md +0 -29
  79. data/.github/contributing.md +0 -26
  80. data/.github/issue_template.md +0 -20
  81. data/.github/workflows/unittest.yml +0 -68
  82. data/.gitignore +0 -18
  83. data/.rubocop.yml +0 -58
  84. data/azure-pipelines.yml +0 -15
  85. data/ci-jobs/functional/android_setup.yml +0 -3
  86. data/ci-jobs/functional/ios_setup.yml +0 -7
  87. data/ci-jobs/functional/publish_test_result.yml +0 -18
  88. data/ci-jobs/functional/run_appium.yml +0 -25
  89. data/ci-jobs/functional/start-emulator.sh +0 -26
  90. data/ci-jobs/functional_test.yml +0 -298
  91. data/docs/mobile_command.md +0 -34
  92. data/lib/appium_lib_core/common/base/bridge/mjsonwp.rb +0 -81
  93. data/lib/appium_lib_core/common/base/bridge/w3c.rb +0 -252
  94. data/lib/appium_lib_core/common/command/common.rb +0 -110
  95. data/lib/appium_lib_core/common/command/w3c.rb +0 -56
  96. data/lib/appium_lib_core/common/device/value.rb +0 -52
  97. data/lib/appium_lib_core/common/touch_action/multi_touch.rb +0 -56
  98. data/lib/appium_lib_core/common/touch_action/touch_actions.rb +0 -203
  99. data/lib/appium_lib_core/ios/uiautomation/device.rb +0 -44
  100. data/lib/appium_lib_core/ios/uiautomation/patch.rb +0 -34
  101. data/release_notes.md +0 -816
  102. data/script/commands.rb +0 -200
@@ -13,8 +13,15 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require 'base64'
16
+ require_relative 'device_ime'
17
+ require_relative 'driver_settings'
16
18
  require_relative 'search_context'
17
19
  require_relative 'screenshot'
20
+ require_relative 'rotable'
21
+ require_relative 'remote_status'
22
+ require_relative 'has_location'
23
+ require_relative 'has_network_connection'
24
+ require_relative '../wait'
18
25
 
19
26
  module Appium
20
27
  module Core
@@ -22,42 +29,77 @@ module Appium
22
29
  class Driver < ::Selenium::WebDriver::Driver
23
30
  include ::Selenium::WebDriver::DriverExtensions::UploadsFiles
24
31
  include ::Selenium::WebDriver::DriverExtensions::HasSessionId
25
- include ::Selenium::WebDriver::DriverExtensions::Rotatable
26
- include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
27
32
  include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
28
33
 
29
- include ::Appium::Core::Base::SearchContext
30
- include ::Appium::Core::Base::TakeScreenshot
34
+ include ::Appium::Core::Base::Rotatable
35
+ include ::Appium::Core::Base::TakesScreenshot
36
+ include ::Appium::Core::Base::HasRemoteStatus
37
+ include ::Appium::Core::Base::HasLocation
38
+ include ::Appium::Core::Base::HasNetworkConnection
39
+
40
+ include ::Appium::Core::Waitable
41
+
42
+ ::Selenium::WebDriver::SearchContext.extra_finders = APPIUM_EXTRA_FINDERS
31
43
 
32
44
  # Private API.
33
45
  # Do not use this for general use. Used by flutter driver to get bridge for creating a new element
34
46
  attr_reader :bridge
35
47
 
36
- def initialize(opts = {})
37
- listener = opts.delete(:listener)
38
- @bridge = ::Appium::Core::Base::Bridge.handshake(**opts)
39
- if @bridge.dialect == :oss # MJSONWP
40
- extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
41
- extend ::Selenium::WebDriver::DriverExtensions::HasLocation
42
- extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
43
- elsif @bridge.dialect == :w3c
44
- # TODO: Only for Appium. Ideally, we'd like to remove the below like selenium-webdriver
45
- extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
46
- extend ::Selenium::WebDriver::DriverExtensions::HasLocation
47
- extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
48
- end
49
- super(@bridge, listener: listener)
48
+ # override
49
+ def initialize(bridge: nil, listener: nil, **opts) # rubocop:disable Lint/MissingSuper
50
+ original_opts = opts.dup
51
+
52
+ # For ::Appium::Core::Waitable
53
+ @wait_timeout = opts.delete(:wait_timeout)
54
+ @wait_interval = opts.delete(:wait_interval)
55
+
56
+ # Selenium WebDriver attributes
57
+ @devtools = nil
58
+ @bidi = nil
59
+
60
+ # in the selenium webdriver as well
61
+ ::Selenium::WebDriver::Remote::Bridge.element_class = ::Appium::Core::Element
62
+ bridge ||= create_bridge(**opts)
63
+ add_extensions(bridge.browser)
64
+ @bridge = listener ? ::Appium::Support::EventFiringBridge.new(bridge, listener, **original_opts) : bridge
50
65
  end
51
66
 
52
- # Get the dialect value
53
- # @return [:oss|:w3c]
54
- def dialect
55
- @bridge.dialect
67
+ private
68
+
69
+ # Create a proper bridge instance.
70
+ #
71
+ # @return [::Appium::Core::Base::Bridge]
72
+ #
73
+ def create_bridge(**opts)
74
+ # for a new session request
75
+ capabilities = opts.delete(:capabilities)
76
+ bridge_opts = { http_client: opts.delete(:http_client), url: opts.delete(:url) }
77
+
78
+ # for attaching to an existing session
79
+ session_id = opts.delete(:existing_session_id)
80
+ automation_name = opts.delete(:automation_name)
81
+ platform_name = opts.delete(:platform_name)
82
+
83
+ raise ::Appium::Core::Error::ArgumentError, "Unable to create a driver with parameters: #{opts}" unless opts.empty?
84
+
85
+ bridge = ::Appium::Core::Base::Bridge.new(**bridge_opts)
86
+
87
+ if session_id.nil?
88
+ bridge.create_session(capabilities)
89
+ else
90
+ # attach to the existing session id
91
+ bridge.attach_to(session_id, platform_name, automation_name)
92
+ end
93
+
94
+ bridge
56
95
  end
57
96
 
97
+ public
98
+
58
99
  # Update +server_url+ and HTTP clients following this arguments, protocol, host, port and path.
59
100
  # After this method, +@bridge.http+ will be a new instance following them instead of +server_url+ which is
60
101
  # set before creating session.
102
+ # If +@bridge.http+ did not have +update_sending_request_to+ method, this method returns immediately.
61
103
  #
62
104
  # @example
63
105
  #
@@ -66,14 +108,122 @@ module Appium
66
108
  # driver.manage.timeouts.implicit_wait = 10 # @bridge.http is for 'https://example2.com:9000/wd/hub/'
67
109
  #
68
110
  def update_sending_request_to(protocol:, host:, port:, path:)
69
- @bridge.http.update_sending_request_to(scheme: protocol,
70
- host: host,
71
- port: port,
72
- path: path)
111
+ unless @bridge.http&.class&.method_defined? :update_sending_request_to
112
+ ::Appium::Logger.warn "#{@bridge.http&.class} has no 'update_sending_request_to'. " \
113
+ 'It keeps current connection target.'
114
+ return
115
+ end
116
+
117
+ @bridge.http&.update_sending_request_to(scheme: protocol,
118
+ host: host,
119
+ port: port,
120
+ path: path)
121
+ end
122
+
123
+ AVAILABLE_METHODS = [
124
+ :get, :head, :post, :put, :delete,
125
+ :connect, :options, :trace, :patch
126
+ ].freeze
127
+ # Define a new custom method to the driver so that you can define your own method for
128
+ # drivers/plugins in Appium 2.0. Appium 2.0 and its custom drivers/plugins allow you
129
+ # to define custom commands that are not part of W3C spec.
130
+ #
131
+ # @param [Symbol] method HTTP request method as https://www.w3.org/TR/webdriver/#endpoints
132
+ # @param [string] url The url to URL template as https://www.w3.org/TR/webdriver/#endpoints.
133
+ # +:session_id+ is the placeholder of 'session id'.
134
+ # Other place holders can be specified with +:+ prefix like +:id+.
135
+ # Then, the +:id+ will be replaced with a given value as the seconds argument of +execute+
136
+ # @param [Symbol] name The name of method that is called as the driver instance method.
137
+ # @param [Proc] block The block to involve as the method.
138
+ # Please define a method that has the same +name+ with arguments you want.
139
+ # The method must has +execute+ method. tHe +execute+ is calls the +url+
140
+ # with the given parameters.
141
+ # The first argument should be +name+ as symbol.
142
+ # The second argument should be hash. If keys in the hash matches +:+ prefix
143
+ # string in the given url, the matched string in the given url will be
144
+ # values in the hash.
145
+ # The third argument should be hash. The hash will be the request body.
146
+ # Please read examples below for more details.
147
+ # @raise [ArgumentError] If the given +method+ is invalid value.
148
+ #
149
+ # @example
150
+ #
151
+ # @driver.add_command(
152
+ # method: :get,
153
+ # url: 'session/:session_id/path/to/custom/url',
154
+ # name: :test_command
155
+ # )
156
+ # # Send a GET request to 'session/<session id>/path/to/custom/url'
157
+ # @driver.test_command
158
+ #
159
+ #
160
+ # @driver.add_command(
161
+ # method: :post,
162
+ # url: 'session/:session_id/path/to/custom/url',
163
+ # name: :test_command
164
+ # ) do
165
+ # def test_command(argument)
166
+ # execute(:test_command, {}, { dummy: argument })
167
+ # end
168
+ # end
169
+ # # Send a POST request to 'session/<session id>/path/to/custom/url'
170
+ # # with body "{ dummy: 1 }" as JSON object. "1" is the argument.
171
+ # # ':session_id' in the given 'url' is replaced with current 'session id'.
172
+ # @driver.test_command(1)
173
+ #
174
+ #
175
+ # @driver.add_command(
176
+ # method: :post,
177
+ # url: 'session/:session_id/element/:id/custom/action',
178
+ # name: :test_action_command
179
+ # ) do
180
+ # def test_action_command(element_id, action)
181
+ # execute(:test_action_command, {id: element_id}, { dummy_action: action })
182
+ # end
183
+ # end
184
+ # # Send a POST request to 'session/<session id>/element/<element id>/custom/action'
185
+ # # with body "{ dummy_action: #{action} }" as JSON object. "action" is the seconds argument.
186
+ # # ':session_id' in the given url is replaced with current 'session id'.
187
+ # # ':id' in the given url is replaced with the given 'element_id'.
188
+ # e = @driver.find_element :accessibility_id, 'an element'
189
+ # @driver.test_action_command(e.id, 'action')
190
+ #
191
+ def add_command(method:, url:, name:, &block)
192
+ unless AVAILABLE_METHODS.include? method
193
+ raise ::Appium::Core::Error::ArgumentError, "Available method is either #{AVAILABLE_METHODS}"
194
+ end
195
+
196
+ @bridge.add_command method: method, url: url, name: name, &block
73
197
  end
74
198
 
75
199
  ### Methods for Appium
76
200
 
201
+ # Perform 'key' actions for W3C module.
202
+ # Generate +key+ pointer action here and users can use this via +driver.key_action+
203
+ # - https://www.selenium.dev/selenium/docs/api/rb/Selenium/WebDriver/ActionBuilder.html
204
+ # - https://www.selenium.dev/selenium/docs/api/rb/Selenium/WebDriver/KeyActions.html
205
+ #
206
+ # The pointer type is 'key' by default in the Appium Ruby client.
207
+ # +driver.action+ in Appium Ruby client has 'pointer' action by default.
208
+ # This method is a shortcut to set 'key' type.
209
+ # Hense this method is equal to +driver.action(devices: [::Selenium::WebDriver::Interactions.key('keyboard')])+
210
+ # as below example.
211
+ #
212
+ # @example
213
+ #
214
+ # element = @driver.find_element(:id, "some id")
215
+ # @driver.key_action.send_key('hiあ').perform # The 'send_key' is a part of 'KeyActions'
216
+ # # is equal to:
217
+ # # @driver.action(devices: [::Selenium::WebDriver::Interactions.key('keyboard')]).send_keys('hiあ').perform
218
+ #
219
+ def key_action(async: false)
220
+ @bridge.action(
221
+ async: async,
222
+ devices: [::Selenium::WebDriver::Interactions.key('keyboard')]
223
+ )
224
+ end
225
+
226
+ # @deprecated Use 'mobile: lock' extension instead.
77
227
  # Lock the device
78
228
  # @return [String]
79
229
  #
@@ -84,9 +234,11 @@ module Appium
84
234
  # # Block other commands during locking the device.
85
235
  #
86
236
  def lock(duration = nil)
237
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: lock' extension instead"
87
238
  @bridge.lock(duration)
88
239
  end
89
240
 
241
+ # @deprecated Use 'mobile: isLocked' extension instead.
90
242
  # Check current device status is weather locked or not
91
243
  #
92
244
  # @example
@@ -95,10 +247,12 @@ module Appium
95
247
  # @driver.locked?
96
248
  #
97
249
  def locked?
250
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: isLocked' extension instead"
98
251
  @bridge.device_locked?
99
252
  end
100
253
  alias device_locked? locked?
101
254
 
255
+ # @deprecated Use 'mobile: unlock' extension instead.
102
256
  # Unlock the device
103
257
  #
104
258
  # @example
@@ -106,9 +260,11 @@ module Appium
106
260
  # @driver.unlock
107
261
  #
108
262
  def unlock
263
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: unlock' extension instead"
109
264
  @bridge.unlock
110
265
  end
111
266
 
267
+ # @deprecated Use 'mobile: hideKeyboard' extension instead.
112
268
  # Hide the onscreen keyboard
113
269
  # @param [String] close_key The name of the key which closes the keyboard.
114
270
  # Defaults to 'Done' for iOS(except for XCUITest).
@@ -123,9 +279,11 @@ module Appium
123
279
  # @driver.hide_keyboard(nil, :tapOutside) # Close a keyboard with tapping out side of keyboard
124
280
  #
125
281
  def hide_keyboard(close_key = nil, strategy = nil)
282
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: hideKeyboard' extension instead"
126
283
  @bridge.hide_keyboard close_key, strategy
127
284
  end
128
285
 
286
+ # @deprecated Use 'mobile: isKeyboardShown' extension instead.
129
287
  # Get whether keyboard is displayed or not.
130
288
  # @return [Boolean] Return true if keyboard is shown. Return false if keyboard is hidden.
131
289
  #
@@ -134,42 +292,11 @@ module Appium
134
292
  # @driver.keyboard_shown? # true
135
293
  #
136
294
  def keyboard_shown?
295
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: isKeyboardShown' extension instead"
137
296
  @bridge.is_keyboard_shown
138
297
  end
139
298
  alias is_keyboard_shown keyboard_shown?
140
299
 
141
- # [DEPRECATION]
142
- # Send keys for a current active element
143
- # @param [String] key Input text
144
- #
145
- # @example
146
- #
147
- # @driver.send_keys 'happy testing!'
148
- #
149
- def send_keys(*key)
150
- ::Appium::Logger.warn(
151
- '[DEPRECATION] Driver#send_keys is deprecated in W3C spec. Use driver.action.<command>.perform instead'
152
- )
153
- @bridge.send_keys_to_active_element(key)
154
- end
155
- alias type send_keys
156
-
157
- class DriverSettings
158
- # @private this class is private
159
- def initialize(bridge)
160
- @bridge = bridge
161
- end
162
-
163
- def get
164
- @bridge.get_settings
165
- end
166
-
167
- def update(settings)
168
- @bridge.update_settings(settings)
169
- end
170
- end
171
- private_constant :DriverSettings
172
-
173
300
  # Returns an instance of DriverSettings to call get/update.
174
301
  #
175
302
  # @example
@@ -178,7 +305,7 @@ module Appium
178
305
  # @driver.settings.update('allowInvisibleElements': true)
179
306
  #
180
307
  def settings
181
- @driver_settings ||= DriverSettings.new(@bridge) # rubocop:disable Naming/MemoizedInstanceVariableName
308
+ @settings ||= DriverSettings.new(@bridge)
182
309
  end
183
310
 
184
311
  # Get appium Settings for current test session.
@@ -200,8 +327,8 @@ module Appium
200
327
  #
201
328
  # @example
202
329
  #
203
- # @driver.update_settings('allowInvisibleElements': true)
204
- # @driver.settings.update('allowInvisibleElements': true)
330
+ # @driver.update_settings({ 'allowInvisibleElements': true })
331
+ # @driver.settings.update({ 'allowInvisibleElements': true })
205
332
  # @driver.settings = { 'allowInvisibleElements': true }
206
333
  #
207
334
  def settings=(value)
@@ -209,36 +336,11 @@ module Appium
209
336
  end
210
337
  alias update_settings settings=
211
338
 
212
- class DeviceIME
213
- # @private this class is private
214
- def initialize(bridge)
215
- @bridge = bridge
216
- end
217
-
218
- def activate(ime_name)
219
- @bridge.ime_activate(ime_name)
220
- end
221
-
222
- def available_engines
223
- @bridge.ime_available_engines
224
- end
225
-
226
- def active_engine
227
- @bridge.ime_active_engine
228
- end
229
-
230
- def activated?
231
- @bridge.ime_activated
232
- end
233
-
234
- def deactivate
235
- @bridge.ime_deactivate
236
- end
237
- end
238
- private_constant :DeviceIME
239
-
339
+ # @deprecated Use 'mobile: shell' extension instead.
240
340
  # Returns an instance of DeviceIME
241
341
  #
342
+ # @return [Appium::Core::Base::Driver::DeviceIME]
343
+ #
242
344
  # @example
243
345
  #
244
346
  # @driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'
@@ -248,9 +350,11 @@ module Appium
248
350
  # @driver.ime.deactivate #=> Deactivate current IME engine
249
351
  #
250
352
  def ime
251
- @device_ime ||= DeviceIME.new(@bridge) # rubocop:disable Naming/MemoizedInstanceVariableName
353
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: shell' extension instead"
354
+ @ime ||= DeviceIME.new(@bridge)
252
355
  end
253
356
 
357
+ # @deprecated Use 'mobile: shell' extension instead.
254
358
  # Android only. Make an engine that is available active.
255
359
  #
256
360
  # @param [String] ime_name The IME owning the activity [required]
@@ -264,6 +368,7 @@ module Appium
264
368
  ime.activate(ime_name)
265
369
  end
266
370
 
371
+ # @deprecated Use 'mobile: shell' extension instead.
267
372
  # Android only. List all available input engines on the machine.
268
373
  #
269
374
  # @example
@@ -275,6 +380,7 @@ module Appium
275
380
  ime.available_engines
276
381
  end
277
382
 
383
+ # @deprecated Use 'mobile: shell' extension instead.
278
384
  # Android only. Get the name of the active IME engine.
279
385
  #
280
386
  # @example
@@ -286,9 +392,12 @@ module Appium
286
392
  ime.active_engine
287
393
  end
288
394
 
395
+ # @deprecated Use 'mobile: shell' extension instead.
289
396
  # @!method ime_activated
290
397
  # Android only. Indicates whether IME input is active at the moment (not if it is available).
291
398
  #
399
+ # @return [Boolean]
400
+ #
292
401
  # @example
293
402
  #
294
403
  # @driver.ime_activated #=> True if IME is activated
@@ -298,6 +407,7 @@ module Appium
298
407
  ime.activated?
299
408
  end
300
409
 
410
+ # @deprecated Use 'mobile: shell' extension instead.
301
411
  # Android only. De-activates the currently-active IME engine.
302
412
  #
303
413
  # @example
@@ -323,16 +433,6 @@ module Appium
323
433
  block_given? ? @bridge.within_context(context, &block) : @bridge.within_context(context)
324
434
  end
325
435
 
326
- # Change to the default context. This is equivalent to +set_context nil+.
327
- #
328
- # @example
329
- #
330
- # @driver.switch_to_default_context
331
- #
332
- def switch_to_default_context
333
- @bridge.switch_to_default_context
334
- end
335
-
336
436
  # @return [String] The context currently being used.
337
437
  #
338
438
  # @example
@@ -361,47 +461,15 @@ module Appium
361
461
  # @driver.set_context "NATIVE_APP"
362
462
  # @driver.context = "NATIVE_APP"
363
463
  #
364
- def context=(context = null)
464
+ def context=(context = nil)
365
465
  @bridge.set_context(context)
366
466
  end
367
467
  alias set_context context=
368
468
 
369
- # Set the value to element directly
370
- #
371
- # @example
372
- #
373
- # @driver.set_immediate_value element, 'hello'
374
- #
375
- def set_immediate_value(element, *value)
376
- ::Appium::Logger.warn '[DEPRECATION] driver#set_immediate_value(element, *value) is deprecated. ' \
377
- 'Use Element#immediate_value(*value) instead'
378
- @bridge.set_immediate_value(element, *value)
379
- end
380
-
381
- # Replace the value to element directly
382
- #
383
- # @example
384
- #
385
- # @driver.replace_value element, 'hello'
386
- #
387
- def replace_value(element, *value)
388
- ::Appium::Logger.warn '[DEPRECATION] driver#replace_value(element, *value) is deprecated. ' \
389
- 'Use Element#replace_value(*value) instead'
390
- @bridge.replace_value(element, *value)
391
- end
392
-
393
469
  # Place a file in a specific location on the device.
394
- # On iOS, the server should have ifuse libraries installed and configured properly for this feature to work on
395
- # real devices.
396
470
  # On Android, the application under test should be built with debuggable flag enabled in order to get access to
397
471
  # its container on the internal file system.
398
472
  #
399
- # {https://github.com/libimobiledevice/ifuse iFuse GitHub page6}
400
- #
401
- # {https://github.com/osxfuse/osxfuse/wiki/FAQ osxFuse FAQ}
402
- #
403
- # {https://developer.android.com/studio/debug 'Debug Your App' developer article}
404
- #
405
473
  # @param [String] path Either an absolute path OR, for iOS devices, a path relative to the app, as described.
406
474
  # If the path starts with application id prefix, then the file will be pushed to the root of
407
475
  # the corresponding application container.
@@ -415,21 +483,14 @@ module Appium
415
483
  # @driver.push_file "/sdcard/Pictures", file # Push a file binary to /sdcard/Pictures path in Android
416
484
  #
417
485
  def push_file(path, filedata)
486
+ # TODO: use 'mobile: pushFile' internally
418
487
  @bridge.push_file(path, filedata)
419
488
  end
420
489
 
421
- # Pull a file from the simulator/device.
422
- # On iOS the server should have ifuse
423
- # libraries installed and configured properly for this feature to work on real devices.
490
+ # Pull a file from the remote device.
424
491
  # On Android the application under test should be built with debuggable flag enabled in order to get access
425
492
  # to its container on the internal file system.
426
493
  #
427
- # {https://github.com/libimobiledevice/ifuse iFuse GitHub page6}
428
- #
429
- # {https://github.com/osxfuse/osxfuse/wiki/FAQ osxFuse FAQ}
430
- #
431
- # {https://developer.android.com/studio/debug 'Debug Your App' developer article}
432
- #
433
494
  # @param [String] path Either an absolute path OR, for iOS devices, a path relative to the app, as described.
434
495
  # If the path starts with application id prefix, then the file will be pulled from the root
435
496
  # of the corresponding application container.
@@ -438,7 +499,6 @@ module Appium
438
499
  # Only pulling files from application containers is supported for iOS Simulator.
439
500
  # Provide the remote path in format
440
501
  # <code>@bundle.identifier:container_type/relative_path_in_container</code>
441
- # (Make sure this in ifuse doc)
442
502
  #
443
503
  # @return [Base64-decoded] Base64 decoded data
444
504
  #
@@ -452,21 +512,14 @@ module Appium
452
512
  # File.open('proper_filename', 'wb') { |f| f<< decoded_file }
453
513
  #
454
514
  def pull_file(path)
515
+ # TODO: use 'mobile: pullFile' internally
455
516
  @bridge.pull_file(path)
456
517
  end
457
518
 
458
- # Pull a folder content from the simulator/device.
459
- # On iOS the server should have ifuse libraries installed and configured properly for this feature to work
460
- # on real devices.
519
+ # Pull a folder content from the remote device.
461
520
  # On Android the application under test should be built with debuggable flag enabled in order to get access to
462
521
  # its container on the internal file system.
463
522
  #
464
- # {https://github.com/libimobiledevice/ifuse iFuse GitHub page6}
465
- #
466
- # {https://github.com/osxfuse/osxfuse/wiki/FAQ osxFuse FAQ}
467
- #
468
- # {https://developer.android.com/studio/debug 'Debug Your App' developer article}
469
- #
470
523
  # @param [String] path Absolute path to the folder.
471
524
  # If the path starts with <em>@applicationId/</em> prefix, then the folder will be pulled
472
525
  # from the root of the corresponding application container.
@@ -475,7 +528,6 @@ module Appium
475
528
  # Only pulling files from application containers is supported for iOS Simulator.
476
529
  # Provide the remote path in format
477
530
  # <code>@bundle.identifier:container_type/relative_path_in_container</code>
478
- # (Make sure this in ifuse doc)
479
531
  #
480
532
  # @return [Base64-decoded] Base64 decoded data which is zip archived
481
533
  #
@@ -486,22 +538,11 @@ module Appium
486
538
  # File.open('proper_filename', 'wb') { |f| f<< decoded_file }
487
539
  #
488
540
  def pull_folder(path)
541
+ # TODO: use 'mobile: pullFolder' internally
489
542
  @bridge.pull_folder(path)
490
543
  end
491
544
 
492
- # Send keyevent on the device.(Only for Selendroid)
493
- # http://developer.android.com/reference/android/view/KeyEvent.html
494
- # @param [integer] key The key to press.
495
- # @param [String] metastate The state the metakeys should be in when pressing the key.
496
- #
497
- # @example
498
- #
499
- # @driver.keyevent 82
500
- #
501
- def keyevent(key, metastate = nil)
502
- @bridge.keyevent(key, metastate)
503
- end
504
-
545
+ # @deprecated Use 'mobile: pressKey' extension instead.
505
546
  # Press keycode on the device.
506
547
  # http://developer.android.com/reference/android/view/KeyEvent.html
507
548
  # @param [Integer] key The key to press. The values which have +KEYCODE_+ prefix in http://developer.android.com/reference/android/view/KeyEvent.html
@@ -521,9 +562,11 @@ module Appium
521
562
  # @driver.press_keycode 66, metastate: [1], flags: [32]
522
563
  #
523
564
  def press_keycode(key, metastate: [], flags: [])
565
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: pressKey' extension instead"
524
566
  @bridge.press_keycode(key, metastate: metastate, flags: flags)
525
567
  end
526
568
 
569
+ # @deprecated Use 'mobile: pressKey' extension instead.
527
570
  # Long press keycode on the device.
528
571
  # http://developer.android.com/reference/android/view/KeyEvent.html
529
572
  # @param [Integer] key The key to long press. The values which have +KEYCODE_+ prefix in http://developer.android.com/reference/android/view/KeyEvent.html
@@ -543,39 +586,11 @@ module Appium
543
586
  # @driver.long_press_keycode 66, metastate: [1], flags: [32, 8192]
544
587
  #
545
588
  def long_press_keycode(key, metastate: [], flags: [])
589
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: pressKey' extension instead"
546
590
  @bridge.long_press_keycode(key, metastate: metastate, flags: flags)
547
591
  end
548
592
 
549
- # Start the simulator and application configured with desired capabilities
550
- #
551
- # @example
552
- #
553
- # @driver.launch_app
554
- #
555
- def launch_app
556
- @bridge.launch_app
557
- end
558
-
559
- # Close an app on device
560
- #
561
- # @example
562
- #
563
- # @driver.close_app
564
- #
565
- def close_app
566
- @bridge.close_app
567
- end
568
-
569
- # Reset the device, relaunching the application.
570
- #
571
- # @example
572
- #
573
- # @driver.reset
574
- #
575
- def reset
576
- @bridge.reset
577
- end
578
-
593
+ # @deprecated Use 'mobile: getAppStrings' extension instead.
579
594
  # Return the hash of all localization strings.
580
595
  # @return [Hash]
581
596
  #
@@ -584,9 +599,11 @@ module Appium
584
599
  # @driver.app_strings #=> "TransitionsTitle"=>"Transitions", "WebTitle"=>"Web"
585
600
  #
586
601
  def app_strings(language = nil)
602
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: getAppStrings' extension instead"
587
603
  @bridge.app_strings(language)
588
604
  end
589
605
 
606
+ # @deprecated Use 'mobile: backgroundApp' extension instead.
590
607
  # Backgrounds the app for a set number of seconds.
591
608
  # This is a blocking application
592
609
  # @param [Integer] duration How many seconds to background the app for.
@@ -602,7 +619,9 @@ module Appium
602
619
  @bridge.background_app(duration)
603
620
  end
604
621
 
605
- # Install the given app onto the device
622
+ # Install the given app onto the device.
623
+ # Each options can be snake-case or camel-case. Snake-cases will be converted to camel-case
624
+ # as options value.
606
625
  #
607
626
  # @param [String] path The absolute local path or remote http URL to an .ipa or .apk file,
608
627
  # or a .zip containing one of these.
@@ -616,26 +635,27 @@ module Appium
616
635
  # @param [Boolean] grant_permissions Only for Android. whether to automatically grant application permissions
617
636
  # on Android 6+ after the installation completes. +false+ by default
618
637
  #
638
+ # Other parameters such as https://github.com/appium/appium-xcuitest-driver#mobile-installapp also can be set.
639
+ # Then, arguments in snake case will be camel case as its request parameters.
640
+ #
619
641
  # @example
620
642
  #
621
643
  # @driver.install_app("/path/to/test.apk")
622
644
  # @driver.install_app("/path/to/test.apk", replace: true, timeout: 20000, allow_test_packages: true,
623
645
  # use_sdcard: false, grant_permissions: false)
646
+ # @driver.install_app("/path/to/test.ipa", timeoutMs: 20000)
624
647
  #
625
- def install_app(path,
626
- replace: nil,
627
- timeout: nil,
628
- allow_test_packages: nil,
629
- use_sdcard: nil,
630
- grant_permissions: nil)
631
- @bridge.install_app(path,
632
- replace: replace,
633
- timeout: timeout,
634
- allow_test_packages: allow_test_packages,
635
- use_sdcard: use_sdcard,
636
- grant_permissions: grant_permissions)
648
+ def install_app(path, **options)
649
+ # TODO: use mobile command in the background?
650
+ options = options.transform_keys { |key| key.to_s.gsub(/_./) { |v| v[1].upcase } } unless options.nil?
651
+ @bridge.install_app(path, options)
637
652
  end
638
653
 
654
+ # def capitalize(s)
655
+ # chars =
656
+ # chars[1:].map(&:capitalize).join
657
+ # end
658
+
639
659
  # @param [Strong] app_id BundleId for iOS or package name for Android
640
660
  # @param [Boolean] keep_data Only for Android. Whether to keep application data and caches after it is uninstalled.
641
661
  # +false+ by default
@@ -647,6 +667,7 @@ module Appium
647
667
  # @driver.remove_app("io.appium.bundle", keep_data: false, timeout, 10000)
648
668
  #
649
669
  def remove_app(app_id, keep_data: nil, timeout: nil)
670
+ # TODO: use mobile command in the background?
650
671
  @bridge.remove_app(app_id, keep_data: keep_data, timeout: timeout)
651
672
  end
652
673
 
@@ -658,6 +679,7 @@ module Appium
658
679
  # @driver.app_installed?("io.appium.bundle")
659
680
  #
660
681
  def app_installed?(app_id)
682
+ # TODO: use mobile command in the background?
661
683
  @bridge.app_installed?(app_id)
662
684
  end
663
685
 
@@ -669,6 +691,7 @@ module Appium
669
691
  # @driver.activate_app("io.appium.bundle") #=> {}
670
692
  #
671
693
  def activate_app(app_id)
694
+ # TODO: use mobile command in the background?
672
695
  @bridge.activate_app(app_id)
673
696
  end
674
697
 
@@ -685,6 +708,7 @@ module Appium
685
708
  # @driver.terminate_app("io.appium.bundle", timeout: 500)
686
709
  #
687
710
  def terminate_app(app_id, timeout: nil)
711
+ # TODO: use mobile command in the background?
688
712
  @bridge.terminate_app(app_id, timeout: timeout)
689
713
  end
690
714
 
@@ -708,6 +732,7 @@ module Appium
708
732
  # @driver.query_app_state("io.appium.bundle") #=> :not_running
709
733
  #
710
734
  def app_state(app_id)
735
+ # TODO: use mobile command in the background?
711
736
  @bridge.app_state(app_id)
712
737
  end
713
738
  alias query_app_state app_state
@@ -747,6 +772,7 @@ module Appium
747
772
  @bridge.stop_and_save_recording_screen(file_path)
748
773
  end
749
774
 
775
+ # @deprecated Use 'mobile: shake' extension instead.
750
776
  # Cause the device to shake
751
777
  #
752
778
  # @example
@@ -754,9 +780,11 @@ module Appium
754
780
  # @driver.shake
755
781
  #
756
782
  def shake
783
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: shake' extension instead"
757
784
  @bridge.shake
758
785
  end
759
786
 
787
+ # @deprecated Use 'mobile: getDeviceTime' extension instead.
760
788
  # Get the time on the device
761
789
  #
762
790
  # @param [String] format The set of format specifiers. Read https://momentjs.com/docs/ to get
@@ -770,18 +798,10 @@ module Appium
770
798
  # @driver.device_time "YYYY-MM-DD" #=> "2018-06-12"
771
799
  #
772
800
  def device_time(format = nil)
801
+ ::Appium::Logger.warn "[DEPRECATION] Please use 'mobile: getDeviceTime' extension instead"
773
802
  @bridge.device_time(format)
774
803
  end
775
804
 
776
- # touch actions
777
- def touch_actions(actions)
778
- @bridge.touch_actions(actions)
779
- end
780
-
781
- def multi_touch(actions)
782
- @bridge.multi_touch(actions)
783
- end
784
-
785
805
  #
786
806
  # Send multiple W3C action chains to server. Use +@driver.action+ for single action chain.
787
807
  #
@@ -790,7 +810,7 @@ module Appium
790
810
  #
791
811
  # @example: Zoom
792
812
  #
793
- # f1 = @driver.action.add_pointer_input(:touch, 'finger1')
813
+ # f1 = ::Selenium::WebDriver::Interactions.pointer(:touch, name: 'finger1')
794
814
  # f1.create_pointer_move(duration: 1, x: 200, y: 500,
795
815
  # origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
796
816
  # f1.create_pointer_down(:left)
@@ -798,7 +818,7 @@ module Appium
798
818
  # origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
799
819
  # f1.create_pointer_up(:left)
800
820
  #
801
- # f2 = @driver.action.add_pointer_input(:touch, 'finger2')
821
+ # f2 = ::Selenium::WebDriver::Interactions.pointer(:touch, name: 'finger2')
802
822
  # f2.create_pointer_move(duration: 1, x: 200, y: 500,
803
823
  # origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
804
824
  # f2.create_pointer_down(:left)
@@ -809,7 +829,11 @@ module Appium
809
829
  # @driver.perform_actions [f1, f2] #=> 'nil' if the action succeed
810
830
  #
811
831
  def perform_actions(data)
812
- raise ArgumentError, "'#{data}' must be Array" unless data.is_a? Array
832
+ raise ::Appium::Core::Error::ArgumentError, "'#{data}' must be Array" unless data.is_a? Array
833
+
834
+ # NOTE: 'add_input' in Selenium Ruby implementation has additional 'pause'.
835
+ # This implementation is to avoid the additional pause.
836
+ # https://github.com/SeleniumHQ/selenium/blob/64447d4b03f6986337d1ca8d8b6476653570bcc1/rb/lib/selenium/webdriver/common/action_builder.rb#L207
813
837
 
814
838
  @bridge.send_actions data.map(&:encode).compact
815
839
  data.each(&:clear_actions)
@@ -853,7 +877,7 @@ module Appium
853
877
  end
854
878
 
855
879
  # Get the device window's logs.
856
- # @return [String]
880
+ # @return [Appium::Core::Logs]
857
881
  #
858
882
  # @example
859
883
  #
@@ -876,107 +900,6 @@ module Appium
876
900
  @bridge.get_timeouts
877
901
  end
878
902
 
879
- # Retrieve the capabilities of the specified session.
880
- # It's almost same as +@driver.capabilities+ but you can get more details.
881
- #
882
- # @return [Selenium::WebDriver::Remote::Capabilities]
883
- #
884
- # @example
885
- # @driver.session_capabilities
886
- #
887
- # #=> uiautomator2
888
- # # <Selenium::WebDriver::Remote::W3C::Capabilities:0x007fa38dae1360
889
- # # @capabilities=
890
- # # {:proxy=>nil,
891
- # # :browser_name=>nil,
892
- # # :browser_version=>nil,
893
- # # :platform_name=>"android",
894
- # # :page_load_strategy=>nil,
895
- # # :remote_session_id=>nil,
896
- # # :accessibility_checks=>nil,
897
- # # :profile=>nil,
898
- # # :rotatable=>nil,
899
- # # :device=>nil,
900
- # # "platform"=>"LINUX",
901
- # # "webStorageEnabled"=>false,
902
- # # "takesScreenshot"=>true,
903
- # # "javascriptEnabled"=>true,
904
- # # "databaseEnabled"=>false,
905
- # # "networkConnectionEnabled"=>true,
906
- # # "locationContextEnabled"=>false,
907
- # # "warnings"=>{},
908
- # # "desired"=>
909
- # # {"platformName"=>"android",
910
- # # "automationName"=>"uiautomator2",
911
- # # "app"=>"/path/to/app/api.apk.zip",
912
- # # "platformVersion"=>"8.1.0",
913
- # # "deviceName"=>"Android Emulator",
914
- # # "appPackage"=>"io.appium.android.apis",
915
- # # "appActivity"=>"io.appium.android.apis.ApiDemos",
916
- # # "someCapability"=>"some_capability",
917
- # # "unicodeKeyboard"=>true,
918
- # # "resetKeyboard"=>true},
919
- # # "automationName"=>"uiautomator2",
920
- # # "app"=>"/path/to/app/api.apk.zip",
921
- # # "platformVersion"=>"8.1.0",
922
- # # "deviceName"=>"emulator-5554",
923
- # # "appPackage"=>"io.appium.android.apis",
924
- # # "appActivity"=>"io.appium.android.apis.ApiDemos",
925
- # # "someCapability"=>"some_capability",
926
- # # "unicodeKeyboard"=>true,
927
- # # "resetKeyboard"=>true,
928
- # # "deviceUDID"=>"emulator-5554",
929
- # # "deviceScreenSize"=>"1080x1920",
930
- # # "deviceScreenDensity"=>420,
931
- # # "deviceModel"=>"Android SDK built for x86",
932
- # # "deviceManufacturer"=>"Google",
933
- # # "pixelRatio"=>2.625,
934
- # # "statBarHeight"=>63,
935
- # # "viewportRect"=>{"left"=>0, "top"=>63, "width"=>1080, "height"=>1731}}>
936
- # #
937
- # #=> XCUITest
938
- # # <Selenium::WebDriver::Remote::W3C::Capabilities:0x007fb15dc01370
939
- # # @capabilities=
940
- # # {:proxy=>nil,
941
- # # :browser_name=>"UICatalog",
942
- # # :browser_version=>nil,
943
- # # :platform_name=>"ios",
944
- # # :page_load_strategy=>nil,
945
- # # :remote_session_id=>nil,
946
- # # :accessibility_checks=>nil,
947
- # # :profile=>nil,
948
- # # :rotatable=>nil,
949
- # # :device=>"iphone",
950
- # # "udid"=>"DED4DBAD-8E5E-4AD6-BDC4-E75CF9AD84D8",
951
- # # "automationName"=>"XCUITest",
952
- # # "app"=>"/path/to/app/UICatalog.app",
953
- # # "platformVersion"=>"11.4",
954
- # # "deviceName"=>"iPhone Simulator",
955
- # # "useNewWDA"=>true,
956
- # # "useJSONSource"=>true,
957
- # # "someCapability"=>"some_capability",
958
- # # "sdkVersion"=>"11.4",
959
- # # "CFBundleIdentifier"=>"com.example.apple-samplecode.UICatalog",
960
- # # "pixelRatio"=>2,
961
- # # "statBarHeight"=>23.4375,
962
- # # "viewportRect"=>{"left"=>0, "top"=>47, "width"=>750, "height"=>1287}}>
963
- #
964
- def session_capabilities
965
- @bridge.session_capabilities
966
- end
967
-
968
- # Returns available sessions on the Appium server
969
- #
970
- # @return [[Hash]]
971
- #
972
- # @example
973
- #
974
- # @driver.sessions #=> [{'id' => 'c363add8-a7ca-4455-b9e3-9ac4d69e95b3', 'capabilities' => { capabilities as Hash }}]
975
- #
976
- def sessions
977
- @bridge.sessions
978
- end
979
-
980
903
  # Image Comparison
981
904
  def match_images_features(first_image:,
982
905
  second_image:,
@@ -992,11 +915,14 @@ module Appium
992
915
  visualize: visualize)
993
916
  end
994
917
 
995
- def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
918
+ def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil,
919
+ multiple: nil, match_neighbour_threshold: nil)
996
920
  @bridge.find_image_occurrence(full_image: full_image,
997
921
  partial_image: partial_image,
998
922
  visualize: visualize,
999
- threshold: threshold)
923
+ threshold: threshold,
924
+ multiple: multiple,
925
+ match_neighbour_threshold: match_neighbour_threshold)
1000
926
  end
1001
927
 
1002
928
  def get_images_similarity(first_image:, second_image:, visualize: false)
@@ -1009,14 +935,14 @@ module Appium
1009
935
 
1010
936
  # @since Appium 1.8.2
1011
937
  # Return an element if current view has a partial image. The logic depends on template matching by OpenCV.
1012
- # {https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md image-comparison}
938
+ # {https://github.com/appium/appium/blob/1.x/docs/en/writing-running-appium/image-comparison.md image-comparison}
1013
939
  #
1014
940
  # You can handle settings for the comparision following below.
1015
941
  # {https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6 device-settings}
1016
942
  #
1017
943
  # @param [String] img_path A path to a partial image you'd like to find
1018
944
  #
1019
- # @return [::Selenium::WebDriver::Element]
945
+ # @return [::Appium::Core::Element]
1020
946
  #
1021
947
  # @example
1022
948
  #
@@ -1031,14 +957,14 @@ module Appium
1031
957
 
1032
958
  # @since Appium 1.8.2
1033
959
  # Return elements if current view has a partial image. The logic depends on template matching by OpenCV.
1034
- # {https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md image-comparison}
960
+ # {https://github.com/appium/appium/blob/1.x/docs/en/writing-running-appium/image-comparison.md image-comparison}
1035
961
  #
1036
962
  # You can handle settings for the comparision following below.
1037
963
  # {https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/device-settings.js#L6 device-settings}
1038
964
  #
1039
965
  # @param [String] img_path A path to a partial image you'd like to find
1040
966
  #
1041
- # @return [::Selenium::WebDriver::Element]
967
+ # @return [Array<::Appium::Core::Element>]
1042
968
  #
1043
969
  # @example
1044
970
  #
@@ -1086,18 +1012,18 @@ module Appium
1086
1012
  @bridge.execute_driver(script: script, type: type, timeout_ms: timeout_ms)
1087
1013
  end
1088
1014
 
1089
- # Convert vanilla element response to ::Selenium::WebDriver::Element
1015
+ # Convert vanilla element response to ::Appium::Core::Element
1090
1016
  #
1091
1017
  # @param [Hash] id The id which can get as a response from server
1092
- # @return [::Selenium::WebDriver::Element]
1018
+ # @return [::Appium::Core::Element]
1093
1019
  #
1094
1020
  # @example
1095
1021
  # response = {"element-6066-11e4-a52e-4f735466cecf"=>"xxxx", "ELEMENT"=>"xxxx"}
1096
- # ele = @driver.convert_to_element(response) #=> ::Selenium::WebDriver::Element
1022
+ # ele = @driver.convert_to_element(response) #=> ::Appium::Core::Element
1097
1023
  # ele.rect #=> Can get the rect of the element
1098
1024
  #
1099
- def convert_to_element(id)
1100
- @bridge.convert_to_element id
1025
+ def convert_to_element(response_id)
1026
+ @bridge.convert_to_element response_id
1101
1027
  end
1102
1028
  end # class Driver
1103
1029
  end # class Base