appium_lib_core 5.0.0.beta4 → 5.0.0.rc4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6bc30b79d80c1606288087e36a6ed024c3be91ffbc6c5b8b04c9c9c1537d1d9e
4
- data.tar.gz: 06b4f5cdbadb770ce7ce4eecd3fcdaf78c002c13982b6a0573e30a0c3aee9d02
3
+ metadata.gz: a9d42fc1cfc7efb703d6e7167fc465618d4991491d19f1e8c2d9f3c929206efc
4
+ data.tar.gz: eeec123ea6356e9a3446ac1c17dd18e234b8ea2a8c5bb0a7d40b31685e7e28b9
5
5
  SHA512:
6
- metadata.gz: c68d806651e436131ebd91c9f9b520a8de1a95ad82ee67988c7f475b6ce2c016b50fa15e1ee4f0813f55d59e5237bea34c209096436807ba7f8eb2ac9afbb123
7
- data.tar.gz: 3982388d81e2d3d59b51cde803e5e83521772700fc8a82d0733ba650c25b2f46578bb9490113a8792a5b5e24d22488110ff3a6e727cb8d22a210c6bf4fb8632e
6
+ metadata.gz: 2c9f68c96d74c47ee00c86bfd858ffdc7460b33534405a4033c33bb8166ecaa3f380093b436bf0a49de2b7f2b3cf1ef1d18ef393898f294e7cea694cdc6b3580
7
+ data.tar.gz: ba381f9b52b595e6e25569300803dbb55de0ce076132ca0db5903321554dd8ca2c6bb4ad9caf8a89e7b1e936aa3e34b7174f80f0315ddfa1f4732a84932c0502
data/CHANGELOG.md CHANGED
@@ -5,17 +5,28 @@ Read `release_notes.md` for commit level details.
5
5
  ## [Unreleased]
6
6
 
7
7
  ### Enhancements
8
+ - Allow to override an existing method by `Appium::Core::Base::Driver#add_command` since Appium drivers/plugins allow to override them
8
9
 
9
10
  ### Bug fixes
10
11
 
11
12
  ### Deprecations
12
13
 
13
- ## [5.0.0.beta]
14
+ ## [5.0.0]
14
15
 
15
- - Update base selenium webdriver version to `4.0.0.beta2`
16
+ - Update base selenium webdriver version to `4.0.0`
16
17
  - Support only W3C spec
17
18
  - Support Ruby 2.5+
18
19
  - Raises `::Appium::Core::Error::ArgumentError` instead of `ArgumentError` for this library specific argument errors
20
+ - Removed `desired_capabilities` from capabilities. Please use `capabilities` key name instead.
21
+ - `element.id` returns the element id instead of `element.ref`
22
+ - Removed `driver#screenshot`. Please use `driver#save_screenshot` instead.
23
+ - Remove `driver#send_keys` to send keys to an active element. Please use `driver.action.send_keys('happy testing').perform` instead.
24
+ - No longer set default `timeouts` as `0`. ruby_lib_core calls `/timeouts` endpoint only when `appium_lib: { wait: 5 }` is provided explicitly.
25
+
26
+ ## [4.7.0] - 2021-07-17
27
+
28
+ ### Enhancements
29
+ - Add `satellites` option in `Appium::Core::Base::Driver#set_location`
19
30
 
20
31
  ## [4.6.0] - 2021-06-03
21
32
 
@@ -25,7 +36,7 @@ Read `release_notes.md` for commit level details.
25
36
  ## [4.5.0] - 2021-03-14
26
37
 
27
38
  ### Enhancements
28
- - Add `speed` argument for `Appium::Core::Base::Driver#set_location` since Appium 1.21.0
39
+ - Add `speed` argument for `Appium::Core::Base::Driver#set_location` since Appium 1.21.0
29
40
  - Add `multiple` and `match_neighbour_threshold` arguments for `Appium::Core::Base::Driver#find_image_occurrence`
30
41
 
31
42
  ## [4.4.1(4.4.0)] - 2021-02-15(2021-02-13)
data/Rakefile CHANGED
@@ -38,6 +38,7 @@ namespace :test do
38
38
  namespace :unit do
39
39
  desc('Run all iOS related unit tests in test directory')
40
40
  Rake::TestTask.new(:ios) do |t|
41
+ ENV['UNIT_TEST'] = '1'
41
42
  t.libs << 'test'
42
43
  t.libs << 'lib'
43
44
  t.test_files = FileList['test/unit/ios/**/*_test.rb']
@@ -45,6 +46,7 @@ namespace :test do
45
46
 
46
47
  desc('Run all Android related unit tests in test directory')
47
48
  Rake::TestTask.new(:android) do |t|
49
+ ENV['UNIT_TEST'] = '1'
48
50
  t.libs << 'test'
49
51
  t.libs << 'lib'
50
52
  t.test_files = FileList['test/unit/android/**/*_test.rb']
@@ -52,6 +54,7 @@ namespace :test do
52
54
 
53
55
  desc('Run all common related unit tests in test directory')
54
56
  Rake::TestTask.new(:common) do |t|
57
+ ENV['UNIT_TEST'] = '1'
55
58
  t.libs << 'test'
56
59
  t.libs << 'lib'
57
60
  t.test_files = FileList['test/unit/common/**/*_test.rb']
@@ -59,6 +62,7 @@ namespace :test do
59
62
 
60
63
  desc('Run all Windows related unit tests in test directory')
61
64
  Rake::TestTask.new(:windows) do |t|
65
+ ENV['UNIT_TEST'] = '1'
62
66
  t.libs << 'test'
63
67
  t.libs << 'lib'
64
68
  t.test_files = FileList['test/unit/windows/**/*_test.rb']
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.add_runtime_dependency 'selenium-webdriver', '4.0.0.beta4'
25
+ spec.add_runtime_dependency 'selenium-webdriver', '~> 4.0.0'
26
26
  spec.add_runtime_dependency 'faye-websocket', '~> 0.11.0'
27
27
 
28
28
  spec.add_development_dependency 'bundler', '>= 1.14'
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'yard', '~> 0.9.11'
31
31
  spec.add_development_dependency 'minitest', '~> 5.0'
32
32
  spec.add_development_dependency 'minitest-reporters', '~> 1.1'
33
- spec.add_development_dependency 'webmock', '~> 3.13.0'
34
- spec.add_development_dependency 'rubocop', '1.12.0'
33
+ spec.add_development_dependency 'webmock', '~> 3.14.0'
34
+ spec.add_development_dependency 'rubocop', '1.12.1'
35
35
  spec.add_development_dependency 'appium_thor', '~> 1.0'
36
36
  spec.add_development_dependency 'pry'
37
37
  spec.add_development_dependency 'pry-byebug'
@@ -103,7 +103,7 @@ jobs:
103
103
  - template: ./functional/ios_setup.yml
104
104
  parameters:
105
105
  xcodeVersion: ${{ parameters.xcodeForIOS }}
106
- - script: brew install ffmpeg && brew tap wix/brew && brew install wix/brew/applesimutils
106
+ - script: brew install ffmpeg && brew tap wix/brew && brew install applesimutils
107
107
  displayName: Install ffmpeg and applesimutils
108
108
  - template: ./functional/run_appium.yml
109
109
  - script: bundle exec rake test:func:ios TESTS=test/functional/ios/ios/mjpeg_server_test.rb,test/functional/ios/ios/mobile_commands_test.rb
@@ -9,7 +9,7 @@ We can invoke them via `execute_script` command with `mobile:` arguments.
9
9
  - https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android
10
10
  - iOS:
11
11
  - https://github.com/appium/appium/tree/master/docs/en/writing-running-appium/ios
12
-
12
+
13
13
 
14
14
  ```ruby
15
15
  # Android shell : https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/android-shell.md
@@ -28,7 +28,7 @@ To handle it, we would recommend you to handle the error based on the error mess
28
28
 
29
29
  ```ruby
30
30
  error = assert_raises ::Selenium::WebDriver::Error::UnknownError do
31
- @driver.execute_script 'mobile: scrollToPage', { element: el.ref, scrollToPage: -100 }
31
+ @driver.execute_script 'mobile: scrollToPage', { element: el.id, scrollToPage: -100 }
32
32
  end
33
33
  assert error.message.include? 'be a non-negative integer'
34
34
  ```
@@ -53,7 +53,7 @@ module Appium
53
53
  # Override
54
54
  # Creates session handling both OSS and W3C dialects.
55
55
  #
56
- # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] desired_capabilities A capability
56
+ # @param [::Selenium::WebDriver::Remote::Capabilities, Hash] capabilities A capability
57
57
  # @return [::Selenium::WebDriver::Remote::Capabilities]
58
58
  #
59
59
  # @example
@@ -78,7 +78,7 @@ module Appium
78
78
  @available_commands = ::Appium::Core::Commands::COMMANDS.dup
79
79
 
80
80
  caps = add_appium_prefix(capabilities)
81
- response = execute(:new_session, {}, { capabilities: { firstMatch: [caps] } })
81
+ response = execute(:new_session, {}, { capabilities: { alwaysMatch: caps, firstMatch: [] } })
82
82
 
83
83
  @session_id = response['sessionId']
84
84
  raise ::Selenium::WebDriver::Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
@@ -133,7 +133,7 @@ module Appium
133
133
 
134
134
  # command for Appium 2.0.
135
135
  def add_command(method:, url:, name:, &block)
136
- raise ::Appium::Core::Error::ArgumentError, "#{name} is already defined" if @available_commands.key? name
136
+ ::Appium::Logger.info "Overriding the method '#{name}' for '#{url}'" if @available_commands.key? name
137
137
 
138
138
  @available_commands[name] = [method, url]
139
139
 
@@ -207,7 +207,7 @@ module Appium
207
207
  # For W3C
208
208
  # https://github.com/SeleniumHQ/selenium/commit/b618499adcc3a9f667590652c5757c0caa703289
209
209
  # execute_atom :isDisplayed, element
210
- execute :is_element_displayed, id: element.ref
210
+ execute :is_element_displayed, id: element.id
211
211
  end
212
212
 
213
213
  # For Appium
@@ -215,7 +215,7 @@ module Appium
215
215
  def element_attribute(element, name)
216
216
  # For W3C in Selenium Client
217
217
  # execute_atom :getAttribute, element, name
218
- execute :get_element_attribute, id: element.ref, name: name
218
+ execute :get_element_attribute, id: element.id, name: name
219
219
  end
220
220
 
221
221
  # For Appium
@@ -227,26 +227,39 @@ module Appium
227
227
 
228
228
  # For Appium
229
229
  # override
230
- def find_element_by(how, what, parent = nil)
230
+ def find_element_by(how, what, parent_ref = [])
231
231
  how, what = convert_locator(how, what)
232
232
 
233
- id = if parent
234
- execute :find_child_element, { id: parent }, { using: how, value: what }
233
+ return execute_atom(:findElements, Support::RelativeLocator.new(what).as_json).first if how == 'relative'
234
+
235
+ parent_type, parent_id = parent_ref
236
+ id = case parent_type
237
+ when :element
238
+ execute :find_child_element, { id: parent_id }, { using: how, value: what.to_s }
239
+ when :shadow_root
240
+ execute :find_shadow_child_element, { id: parent_id }, { using: how, value: what.to_s }
235
241
  else
236
- execute :find_element, {}, { using: how, value: what }
242
+ execute :find_element, {}, { using: how, value: what.to_s }
237
243
  end
244
+
238
245
  ::Appium::Core::Element.new self, element_id_from(id)
239
246
  end
240
247
 
241
248
  # For Appium
242
249
  # override
243
- def find_elements_by(how, what, parent = nil)
250
+ def find_elements_by(how, what, parent_ref = [])
244
251
  how, what = convert_locator(how, what)
245
252
 
246
- ids = if parent
247
- execute :find_child_elements, { id: parent }, { using: how, value: what }
253
+ return execute_atom :findElements, Support::RelativeLocator.new(what).as_json if how == 'relative'
254
+
255
+ parent_type, parent_id = parent_ref
256
+ ids = case parent_type
257
+ when :element
258
+ execute :find_child_elements, { id: parent_id }, { using: how, value: what.to_s }
259
+ when :shadow_root
260
+ execute :find_shadow_child_elements, { id: parent_id }, { using: how, value: what.to_s }
248
261
  else
249
- execute :find_elements, {}, { using: how, value: what }
262
+ execute :find_elements, {}, { using: how, value: what.to_s }
250
263
  end
251
264
 
252
265
  ids.map { |id| ::Appium::Core::Element.new self, element_id_from(id) }
@@ -283,9 +296,10 @@ module Appium
283
296
 
284
297
  # For Appium
285
298
  # No implementation for W3C webdriver module
286
- def set_location(lat, lon, alt = 0.0, speed: nil)
299
+ def set_location(lat, lon, alt = 0.0, speed: nil, satellites: nil)
287
300
  loc = { latitude: lat, longitude: lon, altitude: alt }
288
301
  loc[:speed] = speed unless speed.nil?
302
+ loc[:satellites] = satellites unless satellites.nil?
289
303
  execute :set_location, {}, { location: loc }
290
304
  end
291
305
 
@@ -326,12 +340,12 @@ module Appium
326
340
  execute :get_log_events, {}, args
327
341
  end
328
342
 
329
- def take_viewport_screenshot
343
+ def viewport_screenshot
330
344
  execute_script('mobile: viewportScreenshot')
331
345
  end
332
346
 
333
- def take_element_screenshot(element)
334
- execute :take_element_screenshot, id: element.ref
347
+ def element_screenshot(element_id)
348
+ execute :take_element_screenshot, id: element_id
335
349
  end
336
350
 
337
351
  private
@@ -22,6 +22,13 @@ module Appium
22
22
  # @return [::Selenium::WebDriver::Remote::Capabilities] Return instance of Appium::Core::Base::Capabilities
23
23
  # inherited ::Selenium::WebDriver::Remote::Capabilities
24
24
  def self.create_capabilities(opts_caps = {})
25
+ # TODO: Move to 'Options' way instead of 'Capabilities'.
26
+ # Selenium 5 will have Options instead of 'Capabilities'.
27
+ # https://github.com/SeleniumHQ/selenium/blob/trunk/rb/lib/selenium/webdriver/common/options.rb
28
+ # Then, Ruby client also shoud move to the Options way.
29
+ # Appium's capabilities could change by depending on Appium versions. So it does not have
30
+ # standard options like chrome and firefox etc. So, the implementation should differ from
31
+ # other browsers. But here should inherit `Options` to follow Selenium.
25
32
  ::Selenium::WebDriver::Remote::Capabilities.new(opts_caps)
26
33
  end
27
34
  end
@@ -57,25 +57,7 @@ module Appium
57
57
  # @return [::Appium::Core::Base::Bridge]
58
58
  #
59
59
  def create_bridge(**opts)
60
- # TODO: probably Appium does not need this.
61
- opts[:url] ||= service_url(opts)
62
- caps = opts.delete(:capabilities)
63
- # NOTE: This is deprecated
64
- cap_array = caps.is_a?(Hash) ? [caps] : Array(caps)
65
-
66
- desired_capabilities = opts.delete(:desired_capabilities)
67
- if desired_capabilities
68
- if desired_capabilities.is_a?(Hash)
69
- desired_capabilities = ::Selenium::WebDriver::Remote::Capabilities(desired_capabilities)
70
- end
71
- cap_array << desired_capabilities
72
- end
73
-
74
- options = opts.delete(:options)
75
- cap_array << options if options
76
-
77
- capabilities = generate_capabilities(cap_array)
78
-
60
+ capabilities = opts.delete(:capabilities)
79
61
  bridge_opts = { http_client: opts.delete(:http_client), url: opts.delete(:url) }
80
62
  raise ::Appium::Core::Error::ArgumentError, "Unable to create a driver with parameters: #{opts}" unless opts.empty?
81
63
 
@@ -125,8 +107,17 @@ module Appium
125
107
  # Other place holders can be specified with +:+ prefix like +:id+.
126
108
  # Then, the +:id+ will be replaced with a given value as the seconds argument of +execute+
127
109
  # @param [Symbol] name The name of method that is called as the driver instance method.
128
- # @param [Proc] block The block to involve as the method
129
- # @raise [ArgumentError] If the given +name+ is already defined or +method+ are invalid value.
110
+ # @param [Proc] block The block to involve as the method.
111
+ # Please define a method that has the same +name+ with arguments you want.
112
+ # The method must has +execute+ method. tHe +execute+ is calls the +url+
113
+ # with the given parameters.
114
+ # The first argument should be +name+ as symbol.
115
+ # The second argument should be hash. If keys in the hash matches +:+ prefix
116
+ # string in the given url, the matched string in the given url will be
117
+ # values in the hash.
118
+ # The third argument should be hash. The hash will be the request body.
119
+ # Please read examples below for more details.
120
+ # @raise [ArgumentError] If the given +method+ is invalid value.
130
121
  #
131
122
  # @example
132
123
  #
@@ -153,6 +144,7 @@ module Appium
153
144
  # # ':session_id' in the given 'url' is replaced with current 'session id'.
154
145
  # @driver.test_command(1)
155
146
  #
147
+ #
156
148
  # @driver.add_command(
157
149
  # method: :post,
158
150
  # url: 'session/:session_id/element/:id/custom/action',
@@ -167,7 +159,7 @@ module Appium
167
159
  # # ':session_id' in the given url is replaced with current 'session id'.
168
160
  # # ':id' in the given url is replaced with the given 'element_id'.
169
161
  # e = @driver.find_element :accessibility_id, 'an element'
170
- # @driver.test_action_command(e.ref, 'action')
162
+ # @driver.test_action_command(e.id, 'action')
171
163
  #
172
164
  def add_command(method:, url:, name:, &block)
173
165
  unless AVAILABLE_METHODS.include? method
@@ -246,22 +238,6 @@ module Appium
246
238
  end
247
239
  alias is_keyboard_shown keyboard_shown?
248
240
 
249
- # [DEPRECATION]
250
- # Send keys for a current active element
251
- # @param [String] key Input text
252
- #
253
- # @example
254
- #
255
- # @driver.send_keys 'happy testing!'
256
- #
257
- def send_keys(*key)
258
- ::Appium::Logger.warn(
259
- '[DEPRECATION] Driver#send_keys is deprecated in W3C spec. Use driver.action.<command>.perform instead'
260
- )
261
- @bridge.send_keys_to_active_element(key)
262
- end
263
- alias type send_keys
264
-
265
241
  # Returns an instance of DriverSettings to call get/update.
266
242
  #
267
243
  # @example
@@ -434,30 +410,6 @@ module Appium
434
410
  end
435
411
  alias set_context context=
436
412
 
437
- # Set the value to element directly
438
- #
439
- # @example
440
- #
441
- # @driver.set_immediate_value element, 'hello'
442
- #
443
- def set_immediate_value(element, *value)
444
- ::Appium::Logger.warn '[DEPRECATION] driver#set_immediate_value(element, *value) is deprecated. ' \
445
- 'Use Element#immediate_value(*value) instead'
446
- @bridge.set_immediate_value(element, *value)
447
- end
448
-
449
- # Replace the value to element directly
450
- #
451
- # @example
452
- #
453
- # @driver.replace_value element, 'hello'
454
- #
455
- def replace_value(element, *value)
456
- ::Appium::Logger.warn '[DEPRECATION] driver#replace_value(element, *value) is deprecated. ' \
457
- 'Use Element#replace_value(*value) instead'
458
- @bridge.replace_value(element, *value)
459
- end
460
-
461
413
  # Place a file in a specific location on the device.
462
414
  # On iOS, the server should have ifuse libraries installed and configured properly for this feature to work on
463
415
  # real devices.
@@ -52,19 +52,26 @@ module Appium
52
52
  # @param [String, Number] latitude Set the latitude.
53
53
  # @param [String, Number] longitude Set the longitude.
54
54
  # @param [String, Number] altitude Set the altitude.
55
- # @param [String, Number] speed Set the speed to apply the location on Android real devices @since Appium 1.21.0.
55
+ # @param [String, Number] speed Set the speed to apply the location on Android real devices
56
+ # in meters/second @since Appium 1.21.0 and in knots for emulators @since Appium 1.22.0.
57
+ # @param [String, Number] satellites Sets the count of geo satellites being tracked in range 1..12 @since Appium 1.22.0.
58
+ # This number is respected on Emulators.
56
59
  # @param [::Selenium::WebDriver::Location]
57
60
  #
58
61
  # @example
59
62
  #
60
63
  # driver.location = ::Selenium::WebDriver::Location.new(10, 10, 10)
61
64
  #
62
- def set_location(latitude, longitude, altitude, speed: nil)
63
- if speed.nil?
65
+ def set_location(latitude, longitude, altitude, speed: nil, satellites: nil)
66
+ if speed.nil? && satellites.nil?
64
67
  self.location = ::Selenium::WebDriver::Location.new(Float(latitude), Float(longitude), Float(altitude))
65
68
  else
66
69
  loc = ::Selenium::WebDriver::Location.new(Float(latitude), Float(longitude), Float(altitude))
67
- @bridge.set_location loc.latitude, loc.longitude, loc.altitude, speed: Float(speed)
70
+
71
+ speed = Float(speed) unless speed.nil?
72
+ satellites = Integer(satellites) unless satellites.nil?
73
+
74
+ @bridge.set_location loc.latitude, loc.longitude, loc.altitude, speed: speed, satellites: satellites
68
75
  end
69
76
  end
70
77
  end
@@ -84,9 +84,9 @@ module Appium
84
84
  def element_screenshot_as(element, format)
85
85
  case format
86
86
  when :base64
87
- bridge.take_element_screenshot(element)
87
+ bridge.element_screenshot element.id
88
88
  when :png
89
- bridge.take_element_screenshot(element).unpack('m')[0]
89
+ bridge.element_screenshot(element.id).unpack('m')[0]
90
90
  else
91
91
  raise Core::Error::UnsupportedOperationError, "unsupported format: #{format.inspect}"
92
92
  end
@@ -106,7 +106,7 @@ module Appium
106
106
  ::Appium::Logger.warn 'name used for saved screenshot does not match file type. '\
107
107
  'It should end with .png extension'
108
108
  end
109
- viewport_screenshot_encode64 = bridge.take_viewport_screenshot
109
+ viewport_screenshot_encode64 = bridge.viewport_screenshot
110
110
  File.open(png_path, 'wb') { |f| f << viewport_screenshot_encode64.unpack('m')[0] }
111
111
  end
112
112
  end
@@ -17,12 +17,12 @@ module Appium
17
17
  class Base
18
18
  module Device
19
19
  module Value
20
- def set_immediate_value(element, *value)
21
- execute :set_immediate_value, { id: element.ref }, generate_value_and_text(value)
20
+ def set_immediate_value(element_id, *value)
21
+ execute :set_immediate_value, { id: element_id }, generate_value_and_text(value)
22
22
  end
23
23
 
24
- def replace_value(element, *value)
25
- execute :replace_value, { id: element.ref }, generate_value_and_text(value)
24
+ def replace_value(element_id, *value)
25
+ execute :replace_value, { id: element_id }, generate_value_and_text(value)
26
26
  end
27
27
 
28
28
  private
@@ -195,7 +195,7 @@ module Appium
195
195
  end
196
196
 
197
197
  def args_with_ele_ref(args)
198
- args[:element] = args[:element].ref if args.key? :element
198
+ args[:element] = args[:element].id if args.key? :element
199
199
  args
200
200
  end
201
201
  end # class TouchAction
@@ -40,7 +40,7 @@ module Appium
40
40
 
41
41
  def initialize(appium_lib_opts)
42
42
  @custom_url = appium_lib_opts.fetch :server_url, nil
43
- @default_wait = appium_lib_opts.fetch :wait, Driver::DEFAULT_IMPLICIT_WAIT
43
+ @default_wait = appium_lib_opts.fetch :wait, nil
44
44
  @enable_idempotency_header = appium_lib_opts.fetch :enable_idempotency_header, true
45
45
 
46
46
  # bump current session id into a particular file
@@ -135,11 +135,9 @@ module Appium
135
135
  attr_reader :export_session_path
136
136
 
137
137
  # Default wait time for elements to appear in Appium server side.
138
- # Defaults to {::Appium::Core::Driver::DEFAULT_IMPLICIT_WAIT}.<br>
139
138
  # Provide <code>{ appium_lib: { wait: 30 } }</code> to {::Appium::Core.for}
140
139
  # @return [Integer]
141
140
  attr_reader :default_wait
142
- DEFAULT_IMPLICIT_WAIT = 0
143
141
 
144
142
  # Appium's server port. 4723 is by default. Defaults to {::Appium::Core::Driver::DEFAULT_APPIUM_PORT}.<br>
145
143
  # Provide <code>{ appium_lib: { port: 8080 } }</code> to {::Appium::Core.for}.
@@ -187,8 +185,6 @@ module Appium
187
185
  # @option opts [Hash] :caps Appium capabilities.
188
186
  # @option opts [Hash] :capabilities The same as :caps.
189
187
  # This param is for compatibility with Selenium WebDriver format
190
- # @option opts [Hash] :desired_capabilities The same as :caps.
191
- # This param is for compatibility with Selenium WebDriver format
192
188
  # @option opts [Appium::Core::Options] :appium_lib Capabilities affect only ruby client
193
189
  # @option opts [String] :url The same as :custom_url in :appium_lib.
194
190
  # This param is for compatibility with Selenium WebDriver format
@@ -199,10 +195,8 @@ module Appium
199
195
  #
200
196
  # # format 1
201
197
  # @core = Appium::Core.for caps: {...}, appium_lib: {...}
202
- # # format 2. 'capabilities:' or 'desired_capabilities:' is also available instead of 'caps:'.
198
+ # # format 2. 'capabilities:' is also available instead of 'caps:'.
203
199
  # @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", capabilities: {...}, appium_lib: {...}
204
- # # format 3. 'appium_lib: {...}' can be blank
205
- # @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", desired_capabilities: {...}
206
200
  #
207
201
  #
208
202
  # require 'rubygems'
@@ -230,7 +224,7 @@ module Appium
230
224
  # @core.start_driver # Connect to 'http://127.0.0.1:8080/wd/hub' because of 'port: 8080'
231
225
  #
232
226
  # # Start iOS driver with .zip file over HTTP
233
- # # 'desired_capabilities:' or 'capabilities:' is also available instead of 'caps:'. Either is fine.
227
+ # # 'capabilities:' is also available instead of 'caps:'. Either is fine.
234
228
  # opts = {
235
229
  # capabilities: {
236
230
  # platformName: :ios,
@@ -254,7 +248,7 @@ module Appium
254
248
  # # Start iOS driver as another format. 'url' is available like below
255
249
  # opts = {
256
250
  # url: "http://custom-host:8080/wd/hub.com",
257
- # desired_capabilities: {
251
+ # capabilities: {
258
252
  # platformName: :ios,
259
253
  # platformVersion: '11.0',
260
254
  # deviceName: 'iPhone Simulator',
@@ -368,8 +362,8 @@ module Appium
368
362
 
369
363
  begin
370
364
  @driver = ::Appium::Core::Base::Driver.new(listener: @listener,
371
- http_client: @http_client,
372
- desired_capabilities: @caps,
365
+ http_client: @http_client,
366
+ capabilities: @caps, # ::Selenium::WebDriver::Remote::Capabilities
373
367
  url: @custom_url)
374
368
 
375
369
  if @direct_connect
@@ -411,6 +405,8 @@ module Appium
411
405
 
412
406
  # Ignore setting default wait if the target driver has no implementation
413
407
  def set_implicit_wait_by_default(wait)
408
+ return if @default_wait.nil?
409
+
414
410
  @driver.manage.timeouts.implicit_wait = wait
415
411
  rescue ::Selenium::WebDriver::Error::UnknownError => e
416
412
  unless e.message.include?('The operation requested is not yet implemented')
@@ -480,21 +476,6 @@ module Appium
480
476
  p_version.split('.').map(&:to_i)
481
477
  end
482
478
 
483
- # Takes a png screenshot and saves to the target path.
484
- #
485
- # @param png_save_path [String] the full path to save the png
486
- # @return [File]
487
- #
488
- # @example
489
- #
490
- # @core.screenshot '/tmp/hi.png' #=> nil
491
- # # same as '@driver.save_screenshot png_save_path'
492
- #
493
- def screenshot(png_save_path)
494
- ::Appium::Logger.warn '[DEPRECATION] screenshot will be removed. Please use driver.save_screenshot instead.'
495
- @driver.save_screenshot png_save_path
496
- end
497
-
498
479
  private
499
480
 
500
481
  # @private
@@ -567,10 +548,7 @@ module Appium
567
548
  def validate_keys(opts)
568
549
  flatten_ops = flatten_hash_keys(opts)
569
550
 
570
- # FIXME: Remove 'desired_capabilities' in the next major Selenium update
571
- unless opts.member?(:caps) || opts.member?(:capabilities) || opts.member?(:desired_capabilities)
572
- raise Error::NoCapabilityError
573
- end
551
+ raise Error::NoCapabilityError unless opts.member?(:caps) || opts.member?(:capabilities)
574
552
 
575
553
  if !opts.member?(:appium_lib) && flatten_ops.member?(:appium_lib)
576
554
  raise Error::CapabilityStructureError, 'Please check the value of appium_lib in the capability'
@@ -591,8 +569,7 @@ module Appium
591
569
 
592
570
  # @private
593
571
  def get_caps(opts)
594
- # FIXME: Remove 'desired_capabilities' in the next major Selenium update
595
- Core::Base::Capabilities.create_capabilities(opts[:caps] || opts[:capabilities] || opts[:desired_capabilities] || {})
572
+ Core::Base::Capabilities.create_capabilities(opts[:caps] || opts[:capabilities] || {})
596
573
  end
597
574
 
598
575
  # @private
@@ -20,6 +20,15 @@ module Appium
20
20
  include ::Appium::Core::Base::SearchContext
21
21
  include ::Appium::Core::Base::TakesScreenshot
22
22
 
23
+ # Retuns the element id.
24
+ #
25
+ # @return [String]
26
+ # @example
27
+ # e = @driver.find_element :accessibility_id, 'something'
28
+ # e.id
29
+ #
30
+ attr_reader :id
31
+
23
32
  # Returns the value of attributes like below. Read each platform to know more details.
24
33
  #
25
34
  # uiautomator2: https://github.com/appium/appium-uiautomator2-server/blob/203cc7e57ce477f3cff5d95b135d1b3450a6033a/app/src/main/java/io/appium/uiautomator2/utils/Attribute.java#L19
@@ -59,20 +68,20 @@ module Appium
59
68
  #
60
69
  # @example
61
70
  #
62
- # @driver.immediate_value 'hello'
71
+ # element.immediate_value 'hello'
63
72
  #
64
73
  def immediate_value(*value)
65
- @bridge.set_immediate_value(self, *value)
74
+ @bridge.set_immediate_value @id, *value
66
75
  end
67
76
 
68
77
  # Replace the value to element directly
69
78
  #
70
79
  # @example
71
80
  #
72
- # @driver.replace_value 'hello'
81
+ # element.replace_value 'hello'
73
82
  #
74
83
  def replace_value(*value)
75
- @bridge.replace_value(self, *value)
84
+ @bridge.replace_value @id, *value
76
85
  end
77
86
 
78
87
  # For use with location_rel.
@@ -108,7 +117,7 @@ module Appium
108
117
  # element.screenshot #=> "iVBORw0KGgoAAAANSUhEUgAABDgAAAB+CAIAAABOPDa6AAAAAX"
109
118
  #
110
119
  def screenshot
111
- bridge.take_element_screenshot(self)
120
+ bridge.element_screenshot @id
112
121
  end
113
122
 
114
123
  # Return an element screenshot in the given format
@@ -123,9 +132,9 @@ module Appium
123
132
  def screenshot_as(format)
124
133
  case format
125
134
  when :base64
126
- bridge.take_element_screenshot(self)
135
+ bridge.element_screenshot @id
127
136
  when :png
128
- bridge.take_element_screenshot(self).unpack('m')[0]
137
+ bridge.element_screenshot(@id).unpack('m')[0]
129
138
  else
130
139
  raise Core::Error::UnsupportedOperationError, "unsupported format: #{format.inspect}"
131
140
  end
@@ -14,7 +14,7 @@
14
14
 
15
15
  module Appium
16
16
  module Core
17
- VERSION = '5.0.0.beta4' unless defined? ::Appium::Core::VERSION
18
- DATE = '2021-06-11' unless defined? ::Appium::Core::DATE
17
+ VERSION = '5.0.0.rc4' unless defined? ::Appium::Core::VERSION
18
+ DATE = '2021-10-14' unless defined? ::Appium::Core::DATE
19
19
  end
20
20
  end
data/release_notes.md CHANGED
@@ -1,3 +1,12 @@
1
+ #### v4.7.0 2021-07-17
2
+
3
+ - [0059974](https://github.com/appium/ruby_lib_core/commit/0059974b0b1d79a822db84d8b0169e8393e00ef9) Release 4.7.0
4
+ - [0f93a52](https://github.com/appium/ruby_lib_core/commit/0f93a52bbdc44bf916c9b974fe9fd09d48e5ff39) test: add more example and test (#328)
5
+ - [9e37b3b](https://github.com/appium/ruby_lib_core/commit/9e37b3bc15f72f7c0117a49945a3fe482598f374) feat: add satellites for Android emulators (#327)
6
+ - [3063a73](https://github.com/appium/ruby_lib_core/commit/3063a73fa291dc378daa53b7df2e4b0b8a6f03d2) ci: calls quit_driver to ensure close the previous session
7
+ - [43fb9e7](https://github.com/appium/ruby_lib_core/commit/43fb9e77f5492a92f4f8c5a5bda71be9c3a9e2c8) chore: tweak naming in an internal variable
8
+
9
+
1
10
  #### v4.6.0 2021-06-03
2
11
 
3
12
  - [0dacfab](https://github.com/appium/ruby_lib_core/commit/0dacfab1256e1447e1f7a5974dfcf48ee0a72b9d) Release 4.6.0
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appium_lib_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.beta4
4
+ version: 5.0.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuaki MATSUO
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-12 00:00:00.000000000 Z
11
+ date: 2021-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: selenium-webdriver
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0.beta4
19
+ version: 4.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.0.beta4
26
+ version: 4.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: faye-websocket
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -114,28 +114,28 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 3.13.0
117
+ version: 3.14.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 3.13.0
124
+ version: 3.14.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rubocop
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 1.12.0
131
+ version: 1.12.1
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 1.12.0
138
+ version: 1.12.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: appium_thor
141
141
  requirement: !ruby/object:Gem::Requirement