appium_lib_core 4.0.0 → 4.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.
- checksums.yaml +4 -4
- data/.github/workflows/unittest.yml +1 -1
- data/.rubocop.yml +18 -4
- data/CHANGELOG.md +29 -272
- data/appium_lib_core.gemspec +1 -1
- data/ci-jobs/functional/run_appium.yml +1 -1
- data/lib/appium_lib_core.rb +5 -5
- data/lib/appium_lib_core/android/device.rb +5 -5
- data/lib/appium_lib_core/common/base.rb +1 -0
- data/lib/appium_lib_core/common/base/bridge/w3c.rb +1 -0
- data/lib/appium_lib_core/common/base/driver.rb +24 -11
- data/lib/appium_lib_core/common/base/http_default.rb +2 -3
- data/lib/appium_lib_core/common/base/rotable.rb +54 -0
- data/lib/appium_lib_core/common/base/screenshot.rb +1 -1
- data/lib/appium_lib_core/common/base/search_context.rb +4 -4
- data/lib/appium_lib_core/common/command/common.rb +0 -2
- data/lib/appium_lib_core/common/command/mjsonwp.rb +0 -2
- data/lib/appium_lib_core/common/command/w3c.rb +0 -2
- data/lib/appium_lib_core/common/device/app_management.rb +1 -1
- data/lib/appium_lib_core/common/device/image_comparison.rb +3 -3
- data/lib/appium_lib_core/common/device/orientation.rb +31 -0
- data/lib/appium_lib_core/common/wait.rb +2 -2
- data/lib/appium_lib_core/driver.rb +5 -3
- data/lib/appium_lib_core/ios/xcuitest/device.rb +2 -2
- data/lib/appium_lib_core/mac2.rb +17 -0
- data/lib/appium_lib_core/mac2/bridge.rb +25 -0
- data/lib/appium_lib_core/mac2/device.rb +92 -0
- data/lib/appium_lib_core/mac2/device/screen.rb +48 -0
- data/lib/appium_lib_core/patch.rb +53 -0
- data/lib/appium_lib_core/version.rb +2 -2
- data/lib/appium_lib_core/windows/device.rb +2 -2
- data/release_notes.md +40 -0
- data/script/commands.rb +3 -3
- metadata +10 -4
data/appium_lib_core.gemspec
CHANGED
@@ -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', '
|
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'
|
@@ -11,7 +11,7 @@ steps:
|
|
11
11
|
displayName: Installed node dependencies
|
12
12
|
- task: UseRubyVersion@0
|
13
13
|
inputs:
|
14
|
-
versionSpec: '2.
|
14
|
+
versionSpec: '2.7'
|
15
15
|
- script: |
|
16
16
|
mkdir -p test/report
|
17
17
|
nohup appium --relaxed-security --log-timestamp --log-no-colors > test/report/appium.out 2>&1 &
|
data/lib/appium_lib_core.rb
CHANGED
@@ -34,11 +34,11 @@ module Appium
|
|
34
34
|
|
35
35
|
hash.each_with_object({}) do |pair, acc|
|
36
36
|
key = begin
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
pair[0].to_sym
|
38
|
+
rescue StandardError => e
|
39
|
+
::Appium::Logger.warn(e.message)
|
40
|
+
pair[0]
|
41
|
+
end
|
42
42
|
|
43
43
|
value = pair[1]
|
44
44
|
acc[key] = value.is_a?(Hash) ? symbolize_keys(value) : value
|
@@ -25,7 +25,7 @@ module Appium
|
|
25
25
|
module Device
|
26
26
|
extend Forwardable
|
27
27
|
|
28
|
-
# rubocop:disable
|
28
|
+
# rubocop:disable Layout/LineLength
|
29
29
|
|
30
30
|
# @!method open_notifications
|
31
31
|
# Open Android notifications
|
@@ -290,16 +290,16 @@ module Appium
|
|
290
290
|
# @driver.finger_print 1
|
291
291
|
#
|
292
292
|
|
293
|
-
# @!method execute_cdp(cmd, params)
|
293
|
+
# @!method execute_cdp(cmd, **params)
|
294
294
|
# Execute Chrome Devtools protocol commands
|
295
295
|
# https://chromedevtools.github.io/devtools-protocol
|
296
296
|
#
|
297
297
|
# @param [String] cmd The name of command
|
298
|
-
# @
|
298
|
+
# @option params The parameter for the command as keyword options.
|
299
299
|
#
|
300
300
|
# @example
|
301
301
|
#
|
302
|
-
# @driver.execute_cdp 'Page.captureScreenshot',
|
302
|
+
# @driver.execute_cdp 'Page.captureScreenshot', quality: 50, format: 'jpeg'
|
303
303
|
# @driver.execute_cdp 'Page.getResourceTree'
|
304
304
|
#
|
305
305
|
|
@@ -307,7 +307,7 @@ module Appium
|
|
307
307
|
## class << self
|
308
308
|
####
|
309
309
|
|
310
|
-
# rubocop:enable
|
310
|
+
# rubocop:enable Layout/LineLength
|
311
311
|
|
312
312
|
class << self
|
313
313
|
def extended(_mod)
|
@@ -29,6 +29,7 @@ require_relative 'device/clipboard_content_type'
|
|
29
29
|
require_relative 'device/device'
|
30
30
|
require_relative 'device/touch_actions'
|
31
31
|
require_relative 'device/execute_driver'
|
32
|
+
require_relative 'device/orientation'
|
32
33
|
|
33
34
|
# The following files have selenium-webdriver related stuff.
|
34
35
|
require_relative 'base/driver'
|
@@ -15,6 +15,7 @@
|
|
15
15
|
require 'base64'
|
16
16
|
require_relative 'search_context'
|
17
17
|
require_relative 'screenshot'
|
18
|
+
require_relative 'rotable'
|
18
19
|
|
19
20
|
module Appium
|
20
21
|
module Core
|
@@ -22,12 +23,12 @@ module Appium
|
|
22
23
|
class Driver < ::Selenium::WebDriver::Driver
|
23
24
|
include ::Selenium::WebDriver::DriverExtensions::UploadsFiles
|
24
25
|
include ::Selenium::WebDriver::DriverExtensions::HasSessionId
|
25
|
-
include ::Selenium::WebDriver::DriverExtensions::Rotatable
|
26
26
|
include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
|
27
27
|
include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
|
28
28
|
|
29
|
+
include ::Appium::Core::Base::Rotatable
|
29
30
|
include ::Appium::Core::Base::SearchContext
|
30
|
-
include ::Appium::Core::Base::
|
31
|
+
include ::Appium::Core::Base::TakesScreenshot
|
31
32
|
|
32
33
|
# Private API.
|
33
34
|
# Do not use this for general use. Used by flutter driver to get bridge for creating a new element
|
@@ -58,6 +59,7 @@ module Appium
|
|
58
59
|
# Update +server_url+ and HTTP clients following this arguments, protocol, host, port and path.
|
59
60
|
# After this method, +@bridge.http+ will be a new instance following them instead of +server_url+ which is
|
60
61
|
# set before creating session.
|
62
|
+
# If +@bridge.http+ did not have +update_sending_request_to+ method, this method returns immediately.
|
61
63
|
#
|
62
64
|
# @example
|
63
65
|
#
|
@@ -66,10 +68,16 @@ module Appium
|
|
66
68
|
# driver.manage.timeouts.implicit_wait = 10 # @bridge.http is for 'https://example2.com:9000/wd/hub/'
|
67
69
|
#
|
68
70
|
def update_sending_request_to(protocol:, host:, port:, path:)
|
69
|
-
@bridge.http
|
70
|
-
|
71
|
-
|
72
|
-
|
71
|
+
unless @bridge.http&.class&.method_defined? :update_sending_request_to
|
72
|
+
::Appium::Logger.fatal "#{@bridge.http&.class} has no 'update_sending_request_to'. " \
|
73
|
+
'It keeps current connection target.'
|
74
|
+
return
|
75
|
+
end
|
76
|
+
|
77
|
+
@bridge.http&.update_sending_request_to(scheme: protocol,
|
78
|
+
host: host,
|
79
|
+
port: port,
|
80
|
+
path: path)
|
73
81
|
end
|
74
82
|
|
75
83
|
### Methods for Appium
|
@@ -239,6 +247,8 @@ module Appium
|
|
239
247
|
|
240
248
|
# Returns an instance of DeviceIME
|
241
249
|
#
|
250
|
+
# @return [Appium::Core::Base::Driver::DeviceIME]
|
251
|
+
#
|
242
252
|
# @example
|
243
253
|
#
|
244
254
|
# @driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'
|
@@ -289,6 +299,8 @@ module Appium
|
|
289
299
|
# @!method ime_activated
|
290
300
|
# Android only. Indicates whether IME input is active at the moment (not if it is available).
|
291
301
|
#
|
302
|
+
# @return [Boolean]
|
303
|
+
#
|
292
304
|
# @example
|
293
305
|
#
|
294
306
|
# @driver.ime_activated #=> True if IME is activated
|
@@ -311,6 +323,7 @@ module Appium
|
|
311
323
|
|
312
324
|
# Perform a block within the given context, then switch back to the starting context.
|
313
325
|
# @param [String] context The context to switch to for the duration of the block.
|
326
|
+
# @param [Proc] block The block to involve within the context
|
314
327
|
#
|
315
328
|
# @example
|
316
329
|
#
|
@@ -318,8 +331,8 @@ module Appium
|
|
318
331
|
# @driver.find_element :tag, "button"
|
319
332
|
# end # The result of 'find_element :tag, "button"'
|
320
333
|
#
|
321
|
-
def within_context(context)
|
322
|
-
block_given? ? @bridge.within_context(context, &
|
334
|
+
def within_context(context, &block)
|
335
|
+
block_given? ? @bridge.within_context(context, &block) : @bridge.within_context(context)
|
323
336
|
end
|
324
337
|
|
325
338
|
# Change to the default context. This is equivalent to +set_context nil+.
|
@@ -852,7 +865,7 @@ module Appium
|
|
852
865
|
end
|
853
866
|
|
854
867
|
# Get the device window's logs.
|
855
|
-
# @return [
|
868
|
+
# @return [Appium::Core::Logs]
|
856
869
|
#
|
857
870
|
# @example
|
858
871
|
#
|
@@ -878,7 +891,7 @@ module Appium
|
|
878
891
|
# Retrieve the capabilities of the specified session.
|
879
892
|
# It's almost same as +@driver.capabilities+ but you can get more details.
|
880
893
|
#
|
881
|
-
# @return [Selenium::WebDriver::Remote::Capabilities]
|
894
|
+
# @return [Selenium::WebDriver::Remote::Capabilities, Selenium::WebDriver::Remote::W3C::Capabilities]
|
882
895
|
#
|
883
896
|
# @example
|
884
897
|
# @driver.session_capabilities
|
@@ -1037,7 +1050,7 @@ module Appium
|
|
1037
1050
|
#
|
1038
1051
|
# @param [String] img_path A path to a partial image you'd like to find
|
1039
1052
|
#
|
1040
|
-
# @return [
|
1053
|
+
# @return [Array<Selenium::WebDriver::Element>]
|
1041
1054
|
#
|
1042
1055
|
# @example
|
1043
1056
|
#
|
@@ -36,7 +36,8 @@ module Appium
|
|
36
36
|
|
37
37
|
attr_reader :additional_headers
|
38
38
|
|
39
|
-
|
39
|
+
# override
|
40
|
+
def initialize(open_timeout: nil, read_timeout: nil) # rubocop:disable Lint/MissingSuper
|
40
41
|
@open_timeout = open_timeout
|
41
42
|
@read_timeout = read_timeout
|
42
43
|
@additional_headers = {}
|
@@ -54,8 +55,6 @@ module Appium
|
|
54
55
|
def update_sending_request_to(scheme:, host:, port:, path:)
|
55
56
|
return @server_url unless validate_url_param(scheme, host, port, path)
|
56
57
|
|
57
|
-
::Appium::Logger.debug("[experimental] This feature, #{__method__}, is an experimental")
|
58
|
-
|
59
58
|
# Add / if 'path' does not have it
|
60
59
|
path = path.start_with?('/') ? path : "/#{path}"
|
61
60
|
path = path.end_with?('/') ? path : "#{path}/"
|
@@ -0,0 +1,54 @@
|
|
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 Rotatable
|
23
|
+
ORIENTATIONS = %i[landscape portrait].freeze
|
24
|
+
|
25
|
+
#
|
26
|
+
# Change the screen orientation
|
27
|
+
#
|
28
|
+
# @param [:landscape, :portrait] orientation
|
29
|
+
#
|
30
|
+
#
|
31
|
+
def rotation=(orientation)
|
32
|
+
unless ORIENTATIONS.include?(orientation)
|
33
|
+
raise ArgumentError, "expected #{ORIENTATIONS.inspect}, got #{orientation.inspect}"
|
34
|
+
end
|
35
|
+
|
36
|
+
bridge.screen_orientation = orientation.to_s.upcase
|
37
|
+
end
|
38
|
+
alias rotate rotation=
|
39
|
+
|
40
|
+
#
|
41
|
+
# Get the current screen orientation
|
42
|
+
#
|
43
|
+
# @return [:landscape, :portrait] orientation
|
44
|
+
#
|
45
|
+
# @api public
|
46
|
+
#
|
47
|
+
|
48
|
+
def orientation
|
49
|
+
bridge.screen_orientation.to_sym.downcase
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -18,7 +18,6 @@ module Appium
|
|
18
18
|
module SearchContext
|
19
19
|
# referenced: ::Selenium::WebDriver::SearchContext
|
20
20
|
|
21
|
-
# rubocop:disable Layout/AlignHash
|
22
21
|
FINDERS = ::Selenium::WebDriver::SearchContext::FINDERS.merge(
|
23
22
|
accessibility_id: 'accessibility id',
|
24
23
|
image: '-image',
|
@@ -37,9 +36,8 @@ module Appium
|
|
37
36
|
# Tizen with Tizen prefix
|
38
37
|
tizen_uiautomation: '-tizen uiautomation'
|
39
38
|
)
|
40
|
-
# rubocop:enable Layout/AlignHash
|
41
39
|
|
42
|
-
# rubocop:disable
|
40
|
+
# rubocop:disable Layout/LineLength
|
43
41
|
#
|
44
42
|
# Find the first element matching the given arguments
|
45
43
|
#
|
@@ -129,7 +127,7 @@ module Appium
|
|
129
127
|
# # For Tizen
|
130
128
|
# @driver.find_elements :tizen_uiautomation, '....'
|
131
129
|
#
|
132
|
-
# rubocop:enable
|
130
|
+
# rubocop:enable Layout/LineLength
|
133
131
|
def find_element(*args)
|
134
132
|
how, what = extract_args(args)
|
135
133
|
by = _set_by_from_finders(how)
|
@@ -143,6 +141,8 @@ module Appium
|
|
143
141
|
#
|
144
142
|
# Find all elements matching the given arguments
|
145
143
|
#
|
144
|
+
# @return [Array<Selenium::WebDriver::Element>]
|
145
|
+
#
|
146
146
|
# @see SearchContext#find_elements
|
147
147
|
#
|
148
148
|
def find_elements(*args)
|
@@ -12,7 +12,6 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
# rubocop:disable Layout/AlignHash
|
16
15
|
module Appium
|
17
16
|
module Core
|
18
17
|
# ref: https://github.com/appium/appium-base-driver/blob/master/lib/mjsonwp/routes.js
|
@@ -109,4 +108,3 @@ module Appium
|
|
109
108
|
end # module Commands
|
110
109
|
end # module Core
|
111
110
|
end # module Appium
|
112
|
-
# rubocop:enable Layout/AlignHash
|
@@ -12,7 +12,6 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
# rubocop:disable Layout/AlignHash
|
16
15
|
module Appium
|
17
16
|
module Core
|
18
17
|
module Commands
|
@@ -27,4 +26,3 @@ module Appium
|
|
27
26
|
end # module Commands
|
28
27
|
end # module Core
|
29
28
|
end # Appium
|
30
|
-
# rubocop:enable Layout/AlignHash
|
@@ -12,7 +12,6 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
# rubocop:disable Layout/AlignHash
|
16
15
|
module Appium
|
17
16
|
module Core
|
18
17
|
module Commands
|
@@ -55,4 +54,3 @@ module Appium
|
|
55
54
|
end # module Commands
|
56
55
|
end # module Core
|
57
56
|
end # module Appium
|
58
|
-
# rubocop:enable Layout/AlignHash
|
@@ -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,7 @@ 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
98
|
#
|
99
99
|
# @example
|
100
100
|
# @driver.find_image_occurrence full_image: "image data 1", partial_image: "image data 2"
|
@@ -144,7 +144,7 @@ module Appium
|
|
144
144
|
# +:matchFeatures is by default.
|
145
145
|
# @param [String] first_image An image data. All image formats, that OpenCV library itself accepts, are supported.
|
146
146
|
# @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.
|
147
|
+
# @param [Hash, nil] options The content of this dictionary depends on the actual +mode+ value.
|
148
148
|
# See the documentation on +appium-support+ module for more details.
|
149
149
|
# @return [Hash] The content of the resulting dictionary depends on the actual +mode+ and +options+ values.
|
150
150
|
# See the documentation on +appium-support+ module for more details.
|
@@ -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
|
+
module Device
|
19
|
+
module Orientation
|
20
|
+
def screen_orientation=(orientation)
|
21
|
+
execute :set_screen_orientation, {}, { orientation: orientation }
|
22
|
+
end
|
23
|
+
|
24
|
+
def screen_orientation
|
25
|
+
execute :get_screen_orientation
|
26
|
+
end
|
27
|
+
end # module Orientation
|
28
|
+
end # module Device
|
29
|
+
end # class Base
|
30
|
+
end # module Core
|
31
|
+
end # module Appium
|
@@ -53,7 +53,7 @@ module Appium
|
|
53
53
|
return yield(object)
|
54
54
|
rescue ::Errno::ECONNREFUSED => e
|
55
55
|
raise e
|
56
|
-
rescue *ignored => last_error
|
56
|
+
rescue *ignored => last_error
|
57
57
|
# swallowed
|
58
58
|
end
|
59
59
|
sleep interval
|
@@ -98,7 +98,7 @@ module Appium
|
|
98
98
|
return result if result
|
99
99
|
rescue ::Errno::ECONNREFUSED => e
|
100
100
|
raise e
|
101
|
-
rescue *ignored => last_error
|
101
|
+
rescue *ignored => last_error
|
102
102
|
# swallowed
|
103
103
|
end
|
104
104
|
sleep interval
|