appium_lib_core 4.2.1 → 4.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3f77d23abb2c69ab5b4f5f733a9b901002f8d5fe24e8b99ad8ef03df1dcad99
4
- data.tar.gz: 7acc05e37be676c753e2c0d7519c9882d13eb55bdef32678dd3b44458120e487
3
+ metadata.gz: 27d5a8e4018e381172273c5b705a2166e8f47530101eed83ffd0ddf83e93653d
4
+ data.tar.gz: 78ceb26083c9ae018101180cf13c91cd28f363e819119b6500b2d48a28273474
5
5
  SHA512:
6
- metadata.gz: 3ea82009235de78bedd7a03e4de1021fed4fcb5a21a878697fe4b3dde281d1d36976a2cc6e63dc5d2735cabbe8328f49de3d06f1568ffc48eebbb80144c69d5a
7
- data.tar.gz: 4bee50ff9e195d09b634a3ff7420d04ca1ab896d26d9523a40f20ae2db7c6d2d4b81450dee4f2b0e225599e9e1a774c0e5cb19acc6d89bfeb01bd859caecfe6e
6
+ metadata.gz: 5d07ce477474a38c3df1fb1bd989d9e6b28188ab21d7851bec98443940b0ea5d8b358c628998aeb1f62ca93be783c617dab3b4cf4fdf26e47e97def6467dca97
7
+ data.tar.gz: 29634dc748e222cf65bc6af144656f291815e4c5eaea1fa177aa7e1543752ffbcbac0d4b206f4169ab306dd25e1d5a36c2a1b3d9b51cdef438456c27e52a7bea
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "11:00"
8
+ open-pull-requests-limit: 10
data/CHANGELOG.md CHANGED
@@ -10,6 +10,27 @@ Read `release_notes.md` for commit level details.
10
10
 
11
11
  ### Deprecations
12
12
 
13
+ ## [4.5.0] - 2021-03-14
14
+
15
+ ### Enhancements
16
+ - Add `speed` argument for `Appium::Core::Base::Driver#set_location` since Appium 1.21.0
17
+ - Add `multiple` and `match_neighbour_threshold` arguments for `Appium::Core::Base::Driver#find_image_occurrence`
18
+
19
+ ### Bug fixes
20
+
21
+ ### Deprecations
22
+
23
+
24
+ ## [4.4.1(4.4.0)] - 2021-02-15(2021-02-13)
25
+
26
+ ### Enhancements
27
+ - Returns `{}` any errors in `Core#appium_server_version` to prevent errors in some cases
28
+
29
+ ## [4.3.1(4.3.0)] - 2021-02-07(2021-02-05)
30
+
31
+ ### Enhancements
32
+ - Add `start_recording_screen` for Mac2 driver
33
+
13
34
  ## [4.2.1] - 2021-01-10
14
35
 
15
36
  ### Enhancements
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'minitest', '~> 5.0'
32
32
  spec.add_development_dependency 'minitest-reporters', '~> 1.1'
33
33
  spec.add_development_dependency 'webmock', '~> 3.11.0'
34
- spec.add_development_dependency 'rubocop', '1.8.0'
34
+ spec.add_development_dependency 'rubocop', '1.8.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'
@@ -1,8 +1,8 @@
1
1
  steps:
2
2
  - task: NodeTool@0
3
3
  inputs:
4
- versionSpec: 10.x
5
- displayName: Install Node 10.x
4
+ versionSpec: 12.x
5
+ displayName: Install Node 12.x
6
6
  - script: npm install -g appium@${APPIUM_VERSION}
7
7
  displayName: Install appium beta
8
8
  - script: npm install -g mjpeg-consumer
@@ -4,7 +4,7 @@ parameters:
4
4
  vmImageForIOS: 'macOS-10.15' # Not sure the reason, but macOS 10.14 instance raises no info.plist error
5
5
  xcodeForIOS: 12.2
6
6
  xcodeForTVOS: 12.2
7
- androidSDK: 30
7
+ androidSDK: 29 # API Level 30 emulators are more unstable than 29
8
8
  appiumVersion: 'beta'
9
9
  ignoreVersionSkip: true
10
10
  CI: true
@@ -42,6 +42,10 @@ module Appium
42
42
  execute :get_all_sessions
43
43
  end
44
44
 
45
+ def status
46
+ execute :status
47
+ end
48
+
45
49
  # For Appium
46
50
  def log_event(vendor, event)
47
51
  execute :post_log_event, {}, { vendor: vendor, event: event }
@@ -74,6 +78,12 @@ module Appium
74
78
  def convert_to_element(id)
75
79
  ::Selenium::WebDriver::Element.new self, element_id_from(id)
76
80
  end
81
+
82
+ def set_location(lat, lon, alt = 0.0, speed: nil)
83
+ loc = { latitude: lat, longitude: lon, altitude: alt }
84
+ loc[:speed] = speed unless speed.nil?
85
+ execute :set_location, {}, { location: loc }
86
+ end
77
87
  end # class MJSONWP
78
88
  end # class Bridge
79
89
  end # class Base
@@ -43,6 +43,10 @@ module Appium
43
43
  execute :get_all_sessions
44
44
  end
45
45
 
46
+ def status
47
+ execute :status
48
+ end
49
+
46
50
  # Perform touch actions for W3C module.
47
51
  # Generate +touch+ pointer action here and users can use this via +driver.action+
48
52
  # - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
@@ -166,18 +170,9 @@ module Appium
166
170
 
167
171
  # For Appium
168
172
  # No implementation for W3C webdriver module
169
- # called in +extend DriverExtensions::HasLocation+
170
- # It has below code as well. We should consider the same context in Selenium 4 as backward compatibility.
171
- #
172
- # def location=(loc)
173
- # # note: Location = Struct.new(:latitude, :longitude, :altitude)
174
- # raise TypeError, "expected #{Location}, got #{loc.inspect}:#{loc.class}" unless loc.is_a?(Location)
175
- #
176
- # @bridge.set_location loc.latitude, loc.longitude, loc.altitude
177
- # end
178
- #
179
- def set_location(lat, lon, alt = 0.0)
173
+ def set_location(lat, lon, alt = 0.0, speed: nil)
180
174
  loc = { latitude: lat, longitude: lon, altitude: alt }
175
+ loc[:speed] = speed unless speed.nil?
181
176
  execute :set_location, {}, { location: loc }
182
177
  end
183
178
 
@@ -16,6 +16,8 @@ require 'base64'
16
16
  require_relative 'search_context'
17
17
  require_relative 'screenshot'
18
18
  require_relative 'rotable'
19
+ require_relative 'remote_status'
20
+ require_relative 'has_location'
19
21
 
20
22
  module Appium
21
23
  module Core
@@ -25,10 +27,14 @@ module Appium
25
27
  include ::Selenium::WebDriver::DriverExtensions::HasSessionId
26
28
  include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
27
29
  include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
30
+ include ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
31
+ include ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
28
32
 
29
33
  include ::Appium::Core::Base::Rotatable
30
34
  include ::Appium::Core::Base::SearchContext
31
35
  include ::Appium::Core::Base::TakesScreenshot
36
+ include ::Appium::Core::Base::HasRemoteStatus
37
+ include ::Appium::Core::Base::HasLocation
32
38
 
33
39
  # Private API.
34
40
  # Do not use this for general use. Used by flutter driver to get bridge for creating a new element
@@ -37,16 +43,6 @@ module Appium
37
43
  def initialize(opts = {})
38
44
  listener = opts.delete(:listener)
39
45
  @bridge = ::Appium::Core::Base::Bridge.handshake(**opts)
40
- if @bridge.dialect == :oss # MJSONWP
41
- extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
42
- extend ::Selenium::WebDriver::DriverExtensions::HasLocation
43
- extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
44
- elsif @bridge.dialect == :w3c
45
- # TODO: Only for Appium. Ideally, we'd like to remove the below like selenium-webdriver
46
- extend ::Selenium::WebDriver::DriverExtensions::HasTouchScreen
47
- extend ::Selenium::WebDriver::DriverExtensions::HasLocation
48
- extend ::Selenium::WebDriver::DriverExtensions::HasNetworkConnection
49
- end
50
46
  super(@bridge, listener: listener)
51
47
  end
52
48
 
@@ -59,6 +55,7 @@ module Appium
59
55
  # Update +server_url+ and HTTP clients following this arguments, protocol, host, port and path.
60
56
  # After this method, +@bridge.http+ will be a new instance following them instead of +server_url+ which is
61
57
  # set before creating session.
58
+ # If +@bridge.http+ did not have +update_sending_request_to+ method, this method returns immediately.
62
59
  #
63
60
  # @example
64
61
  #
@@ -67,10 +64,16 @@ module Appium
67
64
  # driver.manage.timeouts.implicit_wait = 10 # @bridge.http is for 'https://example2.com:9000/wd/hub/'
68
65
  #
69
66
  def update_sending_request_to(protocol:, host:, port:, path:)
70
- @bridge.http.update_sending_request_to(scheme: protocol,
71
- host: host,
72
- port: port,
73
- path: path)
67
+ unless @bridge.http&.class&.method_defined? :update_sending_request_to
68
+ ::Appium::Logger.warn "#{@bridge.http&.class} has no 'update_sending_request_to'. " \
69
+ 'It keeps current connection target.'
70
+ return
71
+ end
72
+
73
+ @bridge.http&.update_sending_request_to(scheme: protocol,
74
+ host: host,
75
+ port: port,
76
+ path: path)
74
77
  end
75
78
 
76
79
  ### Methods for Appium
@@ -240,6 +243,8 @@ module Appium
240
243
 
241
244
  # Returns an instance of DeviceIME
242
245
  #
246
+ # @return [Appium::Core::Base::Driver::DeviceIME]
247
+ #
243
248
  # @example
244
249
  #
245
250
  # @driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'
@@ -290,6 +295,8 @@ module Appium
290
295
  # @!method ime_activated
291
296
  # Android only. Indicates whether IME input is active at the moment (not if it is available).
292
297
  #
298
+ # @return [Boolean]
299
+ #
293
300
  # @example
294
301
  #
295
302
  # @driver.ime_activated #=> True if IME is activated
@@ -854,7 +861,7 @@ module Appium
854
861
  end
855
862
 
856
863
  # Get the device window's logs.
857
- # @return [String]
864
+ # @return [Appium::Core::Logs]
858
865
  #
859
866
  # @example
860
867
  #
@@ -880,7 +887,7 @@ module Appium
880
887
  # Retrieve the capabilities of the specified session.
881
888
  # It's almost same as +@driver.capabilities+ but you can get more details.
882
889
  #
883
- # @return [Selenium::WebDriver::Remote::Capabilities]
890
+ # @return [Selenium::WebDriver::Remote::Capabilities, Selenium::WebDriver::Remote::W3C::Capabilities]
884
891
  #
885
892
  # @example
886
893
  # @driver.session_capabilities
@@ -993,11 +1000,14 @@ module Appium
993
1000
  visualize: visualize)
994
1001
  end
995
1002
 
996
- def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
1003
+ def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil,
1004
+ multiple: nil, match_neighbour_threshold: nil)
997
1005
  @bridge.find_image_occurrence(full_image: full_image,
998
1006
  partial_image: partial_image,
999
1007
  visualize: visualize,
1000
- threshold: threshold)
1008
+ threshold: threshold,
1009
+ multiple: multiple,
1010
+ match_neighbour_threshold: match_neighbour_threshold)
1001
1011
  end
1002
1012
 
1003
1013
  def get_images_similarity(first_image:, second_image:, visualize: false)
@@ -1039,7 +1049,7 @@ module Appium
1039
1049
  #
1040
1050
  # @param [String] img_path A path to a partial image you'd like to find
1041
1051
  #
1042
- # @return [::Selenium::WebDriver::Element]
1052
+ # @return [Array<Selenium::WebDriver::Element>]
1043
1053
  #
1044
1054
  # @example
1045
1055
  #
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Appium
16
+ module Core
17
+ class Base
18
+ #
19
+ # @api private
20
+ #
21
+ module HasLocation
22
+ # Get the location of the device.
23
+ #
24
+ # @return [::Selenium::WebDriver::Location]
25
+ #
26
+ # @example
27
+ #
28
+ # driver.location #=> ::Selenium::WebDriver::Location.new(10, 10, 10)
29
+ #
30
+ def location
31
+ @bridge.location
32
+ end
33
+
34
+ # Set the location of the device.
35
+ #
36
+ # @param [::Selenium::WebDriver::Location] location Set the location.
37
+ #
38
+ # @example
39
+ #
40
+ # driver.location = ::Selenium::WebDriver::Location.new(10, 10, 10)
41
+ #
42
+ def location=(location)
43
+ unless location.is_a?(::Selenium::WebDriver::Location)
44
+ raise TypeError, "expected #{::Selenium::WebDriver::Location}, got #{location.inspect}:#{location.class}"
45
+ end
46
+
47
+ @bridge.set_location location.latitude, location.longitude, location.altitude
48
+ end
49
+
50
+ # Set the location of the device.
51
+ #
52
+ # @param [String, Number] latitude Set the latitude.
53
+ # @param [String, Number] longitude Set the longitude.
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.
56
+ # @param [::Selenium::WebDriver::Location]
57
+ #
58
+ # @example
59
+ #
60
+ # driver.location = ::Selenium::WebDriver::Location.new(10, 10, 10)
61
+ #
62
+ def set_location(latitude, longitude, altitude, speed: nil)
63
+ if speed.nil?
64
+ self.location = ::Selenium::WebDriver::Location.new(Float(latitude), Float(longitude), Float(altitude))
65
+ else
66
+ loc = ::Selenium::WebDriver::Location.new(Float(latitude), Float(longitude), Float(altitude))
67
+ @bridge.set_location loc.latitude, loc.longitude, loc.altitude, speed: Float(speed)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -55,8 +55,6 @@ module Appium
55
55
  def update_sending_request_to(scheme:, host:, port:, path:)
56
56
  return @server_url unless validate_url_param(scheme, host, port, path)
57
57
 
58
- ::Appium::Logger.debug("[experimental] This feature, #{__method__}, is an experimental")
59
-
60
58
  # Add / if 'path' does not have it
61
59
  path = path.start_with?('/') ? path : "/#{path}"
62
60
  path = path.end_with?('/') ? path : "#{path}/"
@@ -71,7 +69,7 @@ module Appium
71
69
  return true unless [scheme, host, port, path].include?(nil)
72
70
 
73
71
  message = "Given parameters are scheme: '#{scheme}', host: '#{host}', port: '#{port}', path: '#{path}'"
74
- ::Appium::Logger.warn(message)
72
+ ::Appium::Logger.debug(message)
75
73
  false
76
74
  end
77
75
 
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Appium
16
+ module Core
17
+ class Base
18
+ #
19
+ # @api private
20
+ #
21
+
22
+ module HasRemoteStatus
23
+ # Selenium binding has this ability only in Remote Binding,
24
+ # so this library has this method by own for safe.
25
+ def remote_status
26
+ bridge.status
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -141,6 +141,8 @@ module Appium
141
141
  #
142
142
  # Find all elements matching the given arguments
143
143
  #
144
+ # @return [Array<Selenium::WebDriver::Element>]
145
+ #
144
146
  # @see SearchContext#find_elements
145
147
  #
146
148
  def find_elements(*args)
@@ -47,7 +47,7 @@ module Appium
47
47
  # not available in the default OpenCV installation and have to be enabled manually
48
48
  # before library compilation. The default detector name is 'ORB'.
49
49
  # @param [String] match_func The name of the matching function. The default one is 'BruteForce'.
50
- # @param [String] good_matches_factor The maximum count of "good" matches (e. g. with minimal distances).
50
+ # @param [String, nil] good_matches_factor The maximum count of "good" matches (e. g. with minimal distances).
51
51
  # The default one is nil.
52
52
  # @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
53
53
  # the corresponding picture matching operation. This option is disabled by default.
@@ -94,7 +94,12 @@ module Appium
94
94
  # are supported.
95
95
  # @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
96
96
  # the corresponding picture matching operation. This option is disabled by default.
97
- # @param [Float] threshold [0.5] At what normalized threshold to reject
97
+ # @param [Float, nil] threshold [0.5] At what normalized threshold to reject
98
+ # @param [bool, nil] multiple Whether to enable the support of multiple image occurrences @since Appium 1.21.0.
99
+ # @param [integer, nil] match_neighbour_threshold The pixel distance between matches we consider to be part of
100
+ # the same template match @since Appium 1.21.0.
101
+ # This option is only considered if multiple matches mode is enabled.
102
+ # 10 pixels by default.
98
103
  #
99
104
  # @example
100
105
  # @driver.find_image_occurrence full_image: "image data 1", partial_image: "image data 2"
@@ -102,12 +107,15 @@ module Appium
102
107
  # visual = @@driver.find_image_occurrence full_image: image1, partial_image: image2, visualize: true
103
108
  # File.write 'find_result_visual.png', Base64.decode64(visual['visualization']) # if the image is PNG
104
109
  #
105
- def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil)
110
+ def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil,
111
+ multiple: nil, match_neighbour_threshold: nil)
106
112
  raise "visualize should be #{MATCH_TEMPLATE[:visualize]}" unless MATCH_TEMPLATE[:visualize].member?(visualize)
107
113
 
108
114
  options = {}
109
115
  options[:visualize] = visualize
110
116
  options[:threshold] = threshold unless threshold.nil?
117
+ options[:multiple] = multiple unless multiple.nil?
118
+ options[:matchNeighbourThreshold] = match_neighbour_threshold unless match_neighbour_threshold.nil?
111
119
 
112
120
  compare_images(mode: :matchTemplate, first_image: full_image, second_image: partial_image, options: options)
113
121
  end
@@ -144,7 +152,7 @@ module Appium
144
152
  # +:matchFeatures is by default.
145
153
  # @param [String] first_image An image data. All image formats, that OpenCV library itself accepts, are supported.
146
154
  # @param [String] second_image An image data. All image formats, that OpenCV library itself accepts, are supported.
147
- # @param [Hash] options The content of this dictionary depends on the actual +mode+ value.
155
+ # @param [Hash, nil] options The content of this dictionary depends on the actual +mode+ value.
148
156
  # See the documentation on +appium-support+ module for more details.
149
157
  # @return [Hash] The content of the resulting dictionary depends on the actual +mode+ and +options+ values.
150
158
  # See the documentation on +appium-support+ module for more details.
@@ -27,6 +27,8 @@ module Appium
27
27
  autoload :Xcuitest, 'appium_lib_core/ios_xcuitest'
28
28
  end
29
29
 
30
+ autoload :Mac2, 'appium_lib_core/mac2'
31
+
30
32
  autoload :Windows, 'appium_lib_core/windows'
31
33
 
32
34
  # This options affects only client side as <code>:appium_lib</code> key.<br>
@@ -45,7 +47,7 @@ module Appium
45
47
  @export_session = appium_lib_opts.fetch :export_session, false
46
48
  @export_session_path = appium_lib_opts.fetch :export_session_path, default_tmp_appium_lib_session
47
49
 
48
- @direct_connect = appium_lib_opts.fetch :direct_connect, false
50
+ @direct_connect = appium_lib_opts.fetch :direct_connect, true
49
51
 
50
52
  @port = appium_lib_opts.fetch :port, Driver::DEFAULT_APPIUM_PORT
51
53
 
@@ -175,7 +177,7 @@ module Appium
175
177
  # - <code>directConnectPort</code>
176
178
  # - <code>directConnectPath</code>
177
179
  #
178
- # Ignore them if this parameter is <code>false</code>. Defaults to false.
180
+ # Ignore them if this parameter is <code>false</code>. Defaults to true.
179
181
  #
180
182
  # @return [Bool]
181
183
  attr_reader :direct_connect
@@ -435,7 +437,8 @@ module Appium
435
437
  nil
436
438
  end
437
439
 
438
- # Returns the server's version info
440
+ # Returns the server's version info. This method calls +driver.remote_status+ internally
441
+ #
439
442
  # @return [Hash]
440
443
  #
441
444
  # @example
@@ -449,18 +452,20 @@ module Appium
449
452
  # }
450
453
  # }
451
454
  #
452
- # Returns blank hash for Selenium Grid since 'remote_status' gets 500 error
455
+ # Returns blank hash in a case +driver.remote_status+ got an error
456
+ # such as Selenium Grid. It returns 500 error against 'remote_status'.
453
457
  #
454
458
  # @example
455
459
  #
456
460
  # @core.appium_server_version #=> {}
457
461
  #
458
462
  def appium_server_version
459
- @driver.remote_status
460
- rescue Selenium::WebDriver::Error::ServerError => e
461
- raise ::Appium::Core::Error::ServerError unless e.message.include?('status code 500')
463
+ return {} if @driver.nil?
462
464
 
463
- # driver.remote_status returns 500 error for using selenium grid
465
+ @driver.remote_status
466
+ rescue StandardError
467
+ # Ignore error case in a case the target appium server
468
+ # does not support `/status` API.
464
469
  {}
465
470
  end
466
471
 
@@ -526,7 +531,7 @@ module Appium
526
531
  when :gecko
527
532
  ::Appium::Logger.debug('Gecko Driver for macOS')
528
533
  when :mac2
529
- ::Appium::Logger.debug('macOS XCUITest')
534
+ ::Appium::Core::Mac2::Bridge.for self
530
535
  else
531
536
  # no Mac specific extentions
532
537
  ::Appium::Logger.debug('macOS Native')
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # loaded in common/driver.rb
16
+ require_relative 'mac2/device'
17
+ require_relative 'mac2/bridge'
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Appium
16
+ module Core
17
+ module Mac2
18
+ module Bridge
19
+ def self.for(target)
20
+ target.extend Appium::Core::Mac2::Device
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'device/screen'
16
+
17
+ module Appium
18
+ module Core
19
+ module Mac2
20
+ module Device
21
+ extend Forwardable
22
+
23
+ # rubocop:disable Layout/LineLength
24
+
25
+ # @since Appium 1.20.0
26
+ # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil, fps: nil, preset: nil, video_filter: nil, enable_capture_clicks: nil, enable_cursor_capture: nil, device_id: nil)
27
+ #
28
+ # Record the display of devices running iOS Simulator since Xcode 9 or real devices since iOS 11
29
+ # (ffmpeg utility is required: 'brew install ffmpeg').
30
+ # We would recommend to play the video by VLC or Mplayer if you can not play the video with other video players.
31
+ #
32
+ # @param [String] remote_path The path to the remote location, where the resulting video should be uploaded.
33
+ # The following protocols are supported: http/https, ftp.
34
+ # Null or empty string value (the default setting) means the content of resulting
35
+ # file should be encoded as Base64 and passed as the endpount response value.
36
+ # An exception will be thrown if the generated media file is too big to
37
+ # fit into the available process memory.
38
+ # This option only has an effect if there is screen recording process in progreess
39
+ # and +forceRestart+ parameter is not set to +true+.
40
+ # @param [String] user The name of the user for the remote authentication.
41
+ # @param [String] pass The password for the remote authentication.
42
+ # @param [String] method The http multipart upload method name. The 'PUT' one is used by default.
43
+ # @param [String] file_field_name The name of the form field containing the binary payload in multipart/form-data
44
+ # requests since Appium 1.18.0. Defaults to 'file'.
45
+ # @param [Array<Hash, Array<String>>] form_fields The form fields mapping in multipart/form-data requests since Appium 1.18.0.
46
+ # If any entry has the same key in this mapping, then it is going to be ignored.
47
+ # @param [Hash] headers The additional headers in multipart/form-data requests since Appium 1.18.0.
48
+ # @param [Boolean] force_restart Whether to try to catch and upload/return the currently running screen recording
49
+ # (+false+, the default setting on server) or ignore the result of it
50
+ # and start a new recording immediately (+true+).
51
+ # @param [integer] fps The count of frames per second in the resulting video.
52
+ # Increasing fps value also increases the size of the resulting video file and the CPU usage.
53
+ # The default value is 15.
54
+ # @param [String] preset A preset is a collection of options that will provide a certain encoding speed to compression ratio.
55
+ # A slower preset will provide better compression (compression is quality per filesize).
56
+ # This means that, for example, if you target a certain file size or constant bit rate, you will
57
+ # achieve better quality with a slower preset. Read https://trac.ffmpeg.org/wiki/Encode/H.264
58
+ # for more details.
59
+ # @param [Boolean] enable_cursor_capture Whether to capture the click gestures while recording the screen. Disabled by default.
60
+ # @param [Boolean] enable_capture_clicks Recording time. 180 seconds is by default.
61
+ # @param [String] video_filter The video filter spec to apply for ffmpeg.
62
+ # See https://trac.ffmpeg.org/wiki/FilteringGuide for more details on the possible values.
63
+ # Example: Set it to +scale=ifnot(gte(iw\,1024)\,iw\,1024):-2+ in order to limit the video width
64
+ # to 1024px. The height will be adjusted automatically to match the actual screen aspect ratio.
65
+ # @param [integer] device_id Screen device index to use for the recording.
66
+ # The list of available devices could be retrieved using
67
+ # +ffmpeg -f avfoundation -list_devices true -i ""+ command.
68
+ # This option is mandatory and must be always provided.
69
+ # @param [String] time_limit The maximum recording time. The default value is 600 seconds (10 minutes).
70
+ # The minimum time resolution unit is one second.
71
+ #
72
+ # @example
73
+ #
74
+ # @driver.start_recording_screen
75
+ # @driver.start_recording_screen fps: 30, enable_cursor_capture: true
76
+ #
77
+
78
+ # rubocop:enable Layout/LineLength
79
+
80
+ ####
81
+ ## class << self
82
+ ####
83
+
84
+ class << self
85
+ def extended(_mod)
86
+ Screen.add_methods
87
+ end
88
+ end # class << self
89
+ end # module Device
90
+ end # module Mac2
91
+ end # module Core
92
+ end # module Appium
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Appium
16
+ module Core
17
+ module Mac2
18
+ module Device
19
+ module Screen
20
+ def self.add_methods
21
+ ::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
22
+ def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
23
+ file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil,
24
+ fps: nil, preset: nil, video_filter: nil, time_limit: nil,
25
+ enable_capture_clicks: nil, enable_cursor_capture: nil, device_id: nil)
26
+ option = ::Appium::Core::Base::Device::ScreenRecord.new(
27
+ remote_path: remote_path, user: user, pass: pass, method: method,
28
+ file_field_name: file_field_name, form_fields: form_fields, headers: headers,
29
+ force_restart: force_restart
30
+ ).upload_option
31
+
32
+ option[:fps] = fps unless fps.nil?
33
+ option[:preset] = preset unless preset.nil?
34
+ option[:videoFilter] = video_filter unless video_filter.nil?
35
+ option[:captureClicks] = enable_capture_clicks unless enable_capture_clicks.nil?
36
+ option[:captureCursor] = enable_cursor_capture unless enable_cursor_capture.nil?
37
+ option[:deviceId] = device_id unless device_id.nil?
38
+ option[:timeLimit] = time_limit unless time_limit.nil?
39
+
40
+ execute(:start_recording_screen, {}, { options: option })
41
+ end
42
+ end
43
+ end
44
+ end # module Screen
45
+ end # module Device
46
+ end # module Mac2
47
+ end # module Core
48
+ end # module Appium
@@ -14,7 +14,7 @@
14
14
 
15
15
  module Appium
16
16
  module Core
17
- VERSION = '4.2.1' unless defined? ::Appium::Core::VERSION
18
- DATE = '2021-01-10' unless defined? ::Appium::Core::DATE
17
+ VERSION = '4.5.0' unless defined? ::Appium::Core::VERSION
18
+ DATE = '2021-03-14' unless defined? ::Appium::Core::DATE
19
19
  end
20
20
  end
data/release_notes.md CHANGED
@@ -1,3 +1,41 @@
1
+ #### v4.5.0 2021-03-14
2
+
3
+ - [656230e](https://github.com/appium/ruby_lib_core/commit/656230e688ed86414c06efaa73bce7359933cc91) Release 4.5.0
4
+ - [a0a3cfc](https://github.com/appium/ruby_lib_core/commit/a0a3cfc71783bed3d1b0e7afbf6bc0a27bf60a48) feat: add speed option (#318)
5
+ - [16b4f09](https://github.com/appium/ruby_lib_core/commit/16b4f0991deb639314857c3cbece1e4d00393646) feat: add multiple and match_neighbour_threshold (#313)
6
+ - [d195a5b](https://github.com/appium/ruby_lib_core/commit/d195a5ba48c2e1a7229e0145eac616fd886c1ee0) ci: use node 12
7
+
8
+
9
+ #### v4.4.1 2021-02-15
10
+
11
+ - [dc34419](https://github.com/appium/ruby_lib_core/commit/dc34419dfcc4dd8d499a6407d45ab3efe70c2445) Release 4.4.1
12
+ - [3085048](https://github.com/appium/ruby_lib_core/commit/3085048b4816e3415017ebb188e653c8e229a05e) chore: return {} in nil case as well
13
+
14
+
15
+ #### v4.4.0 2021-02-13
16
+
17
+ - [06c68fb](https://github.com/appium/ruby_lib_core/commit/06c68fbe3ffdbb7b068d2f71ad6841c66dbabf8f) Release 4.4.0
18
+ - [3c54ae2](https://github.com/appium/ruby_lib_core/commit/3c54ae25d9a334f3690c94ce8a59a5c6a4bacd20) feat: always return {} in appium_server_version for errors (#311)
19
+
20
+
21
+ #### v4.3.1 2021-02-07
22
+
23
+ - [1f4d52c](https://github.com/appium/ruby_lib_core/commit/1f4d52cc915783cf89cf4b8ca5a21bd1af5403e0) Release 4.3.1
24
+ - [fb41014](https://github.com/appium/ruby_lib_core/commit/fb410146567ed03902b602813881fd3abc3a3d28) chore: change log level
25
+ - [1e54662](https://github.com/appium/ruby_lib_core/commit/1e546628c871e4ed9c8aa038a455d03e4e2e6c4e) chore : Create Dependabot config file (#309)
26
+
27
+
28
+ #### v4.3.0 2021-02-05
29
+
30
+ - [6e85426](https://github.com/appium/ruby_lib_core/commit/6e85426c1ff8f3e4b90d3da5305d493500539467) Release 4.3.0
31
+ - [405b3d8](https://github.com/appium/ruby_lib_core/commit/405b3d8e627323376dbf74a4423d0ebce5ca0cad) feat: Add mac2 module and screen recording option (#308)
32
+ - [876d254](https://github.com/appium/ruby_lib_core/commit/876d25494c76c31ad5c26900d6e30e30ecd8d20c) chore: teak types in yardoc (#307)
33
+ - [7548ea9](https://github.com/appium/ruby_lib_core/commit/7548ea9cb7e031a3689a63e75d32da82d317488a) test: add wait
34
+ - [9d6fef4](https://github.com/appium/ruby_lib_core/commit/9d6fef469fad8bccf61ee6565f2e30095f4e2a6a) feat: makes direct_connect true by default (#303)
35
+ - [761067e](https://github.com/appium/ruby_lib_core/commit/761067e5c42cfb3e4c1e5c5a377dbeb3c903eb7b) test: add location test (#302)
36
+ - [bd33397](https://github.com/appium/ruby_lib_core/commit/bd3339791552d2eb5181ca4475c9ebc90644a456) chore(deps-dev): update rubocop requirement from = 1.8.0 to = 1.8.1 (#301)
37
+
38
+
1
39
  #### v4.2.1 2021-01-10
2
40
 
3
41
  - [23e944e](https://github.com/appium/ruby_lib_core/commit/23e944ed72c6ea861532f5acc1381af4441705e6) Release 4.2.1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appium_lib_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.1
4
+ version: 4.5.0
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-01-10 00:00:00.000000000 Z
11
+ date: 2021-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: selenium-webdriver
@@ -134,14 +134,14 @@ dependencies:
134
134
  requirements:
135
135
  - - '='
136
136
  - !ruby/object:Gem::Version
137
- version: 1.8.0
137
+ version: 1.8.1
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - '='
143
143
  - !ruby/object:Gem::Version
144
- version: 1.8.0
144
+ version: 1.8.1
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: appium_thor
147
147
  requirement: !ruby/object:Gem::Requirement
@@ -221,6 +221,7 @@ extra_rdoc_files: []
221
221
  files:
222
222
  - ".github/ISSUE_TEMPLATE/issue-report.md"
223
223
  - ".github/contributing.md"
224
+ - ".github/dependabot.yml"
224
225
  - ".github/issue_template.md"
225
226
  - ".github/workflows/unittest.yml"
226
227
  - ".gitignore"
@@ -266,8 +267,10 @@ files:
266
267
  - lib/appium_lib_core/common/base/capabilities.rb
267
268
  - lib/appium_lib_core/common/base/command.rb
268
269
  - lib/appium_lib_core/common/base/driver.rb
270
+ - lib/appium_lib_core/common/base/has_location.rb
269
271
  - lib/appium_lib_core/common/base/http_default.rb
270
272
  - lib/appium_lib_core/common/base/platform.rb
273
+ - lib/appium_lib_core/common/base/remote_status.rb
271
274
  - lib/appium_lib_core/common/base/rotable.rb
272
275
  - lib/appium_lib_core/common/base/screenshot.rb
273
276
  - lib/appium_lib_core/common/base/search_context.rb
@@ -315,6 +318,10 @@ files:
315
318
  - lib/appium_lib_core/ios/xcuitest/device/performance.rb
316
319
  - lib/appium_lib_core/ios/xcuitest/device/screen.rb
317
320
  - lib/appium_lib_core/ios_xcuitest.rb
321
+ - lib/appium_lib_core/mac2.rb
322
+ - lib/appium_lib_core/mac2/bridge.rb
323
+ - lib/appium_lib_core/mac2/device.rb
324
+ - lib/appium_lib_core/mac2/device/screen.rb
318
325
  - lib/appium_lib_core/patch.rb
319
326
  - lib/appium_lib_core/version.rb
320
327
  - lib/appium_lib_core/windows.rb