appium_lib_core 4.1.1 → 4.4.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/dependabot.yml +8 -0
- data/CHANGELOG.md +24 -277
- data/appium_lib_core.gemspec +1 -1
- data/lib/appium_lib_core/common/base.rb +1 -0
- data/lib/appium_lib_core/common/base/bridge/mjsonwp.rb +4 -0
- data/lib/appium_lib_core/common/base/bridge/w3c.rb +5 -0
- data/lib/appium_lib_core/common/base/driver.rb +23 -9
- data/lib/appium_lib_core/common/base/http_default.rb +1 -3
- data/lib/appium_lib_core/common/base/remote_status.rb +31 -0
- 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 +2 -0
- 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/driver.rb +13 -10
- 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/release_notes.md +39 -0
- metadata +16 -8
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', '1.
|
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'
|
@@ -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'
|
@@ -32,6 +32,7 @@ module Appium
|
|
32
32
|
include Device::Device
|
33
33
|
include Device::TouchActions
|
34
34
|
include Device::ExecuteDriver
|
35
|
+
include Device::Orientation
|
35
36
|
|
36
37
|
def commands(command)
|
37
38
|
::Appium::Core::Commands::W3C::COMMANDS[command]
|
@@ -42,6 +43,10 @@ module Appium
|
|
42
43
|
execute :get_all_sessions
|
43
44
|
end
|
44
45
|
|
46
|
+
def status
|
47
|
+
execute :status
|
48
|
+
end
|
49
|
+
|
45
50
|
# Perform touch actions for W3C module.
|
46
51
|
# Generate +touch+ pointer action here and users can use this via +driver.action+
|
47
52
|
# - https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/W3CActionBuilder.html
|
@@ -15,6 +15,8 @@
|
|
15
15
|
require 'base64'
|
16
16
|
require_relative 'search_context'
|
17
17
|
require_relative 'screenshot'
|
18
|
+
require_relative 'rotable'
|
19
|
+
require_relative 'remote_status'
|
18
20
|
|
19
21
|
module Appium
|
20
22
|
module Core
|
@@ -22,12 +24,13 @@ module Appium
|
|
22
24
|
class Driver < ::Selenium::WebDriver::Driver
|
23
25
|
include ::Selenium::WebDriver::DriverExtensions::UploadsFiles
|
24
26
|
include ::Selenium::WebDriver::DriverExtensions::HasSessionId
|
25
|
-
include ::Selenium::WebDriver::DriverExtensions::Rotatable
|
26
27
|
include ::Selenium::WebDriver::DriverExtensions::HasRemoteStatus
|
27
28
|
include ::Selenium::WebDriver::DriverExtensions::HasWebStorage
|
28
29
|
|
30
|
+
include ::Appium::Core::Base::Rotatable
|
29
31
|
include ::Appium::Core::Base::SearchContext
|
30
|
-
include ::Appium::Core::Base::
|
32
|
+
include ::Appium::Core::Base::TakesScreenshot
|
33
|
+
include ::Appium::Core::Base::HasRemoteStatus
|
31
34
|
|
32
35
|
# Private API.
|
33
36
|
# Do not use this for general use. Used by flutter driver to get bridge for creating a new element
|
@@ -58,6 +61,7 @@ module Appium
|
|
58
61
|
# Update +server_url+ and HTTP clients following this arguments, protocol, host, port and path.
|
59
62
|
# After this method, +@bridge.http+ will be a new instance following them instead of +server_url+ which is
|
60
63
|
# set before creating session.
|
64
|
+
# If +@bridge.http+ did not have +update_sending_request_to+ method, this method returns immediately.
|
61
65
|
#
|
62
66
|
# @example
|
63
67
|
#
|
@@ -66,10 +70,16 @@ module Appium
|
|
66
70
|
# driver.manage.timeouts.implicit_wait = 10 # @bridge.http is for 'https://example2.com:9000/wd/hub/'
|
67
71
|
#
|
68
72
|
def update_sending_request_to(protocol:, host:, port:, path:)
|
69
|
-
@bridge.http
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
+
unless @bridge.http&.class&.method_defined? :update_sending_request_to
|
74
|
+
::Appium::Logger.fatal "#{@bridge.http&.class} has no 'update_sending_request_to'. " \
|
75
|
+
'It keeps current connection target.'
|
76
|
+
return
|
77
|
+
end
|
78
|
+
|
79
|
+
@bridge.http&.update_sending_request_to(scheme: protocol,
|
80
|
+
host: host,
|
81
|
+
port: port,
|
82
|
+
path: path)
|
73
83
|
end
|
74
84
|
|
75
85
|
### Methods for Appium
|
@@ -239,6 +249,8 @@ module Appium
|
|
239
249
|
|
240
250
|
# Returns an instance of DeviceIME
|
241
251
|
#
|
252
|
+
# @return [Appium::Core::Base::Driver::DeviceIME]
|
253
|
+
#
|
242
254
|
# @example
|
243
255
|
#
|
244
256
|
# @driver.ime.activate engine: 'com.android.inputmethod.latin/.LatinIME'
|
@@ -289,6 +301,8 @@ module Appium
|
|
289
301
|
# @!method ime_activated
|
290
302
|
# Android only. Indicates whether IME input is active at the moment (not if it is available).
|
291
303
|
#
|
304
|
+
# @return [Boolean]
|
305
|
+
#
|
292
306
|
# @example
|
293
307
|
#
|
294
308
|
# @driver.ime_activated #=> True if IME is activated
|
@@ -853,7 +867,7 @@ module Appium
|
|
853
867
|
end
|
854
868
|
|
855
869
|
# Get the device window's logs.
|
856
|
-
# @return [
|
870
|
+
# @return [Appium::Core::Logs]
|
857
871
|
#
|
858
872
|
# @example
|
859
873
|
#
|
@@ -879,7 +893,7 @@ module Appium
|
|
879
893
|
# Retrieve the capabilities of the specified session.
|
880
894
|
# It's almost same as +@driver.capabilities+ but you can get more details.
|
881
895
|
#
|
882
|
-
# @return [Selenium::WebDriver::Remote::Capabilities]
|
896
|
+
# @return [Selenium::WebDriver::Remote::Capabilities, Selenium::WebDriver::Remote::W3C::Capabilities]
|
883
897
|
#
|
884
898
|
# @example
|
885
899
|
# @driver.session_capabilities
|
@@ -1038,7 +1052,7 @@ module Appium
|
|
1038
1052
|
#
|
1039
1053
|
# @param [String] img_path A path to a partial image you'd like to find
|
1040
1054
|
#
|
1041
|
-
# @return [
|
1055
|
+
# @return [Array<Selenium::WebDriver::Element>]
|
1042
1056
|
#
|
1043
1057
|
# @example
|
1044
1058
|
#
|
@@ -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.
|
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
|
@@ -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
|
@@ -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
|
@@ -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,
|
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
|
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,18 @@ module Appium
|
|
449
452
|
# }
|
450
453
|
# }
|
451
454
|
#
|
452
|
-
# Returns blank hash
|
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
|
460
|
-
rescue
|
461
|
-
|
462
|
-
|
463
|
-
# driver.remote_status returns 500 error for using selenium grid
|
463
|
+
@driver&.remote_status
|
464
|
+
rescue StandardError
|
465
|
+
# Ignore error case in a case the target appium server
|
466
|
+
# does not support `/status` API.
|
464
467
|
{}
|
465
468
|
end
|
466
469
|
|
@@ -526,7 +529,7 @@ module Appium
|
|
526
529
|
when :gecko
|
527
530
|
::Appium::Logger.debug('Gecko Driver for macOS')
|
528
531
|
when :mac2
|
529
|
-
::Appium::
|
532
|
+
::Appium::Core::Mac2::Bridge.for self
|
530
533
|
else
|
531
534
|
# no Mac specific extentions
|
532
535
|
::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
|