appium_lib_core 4.2.0 → 4.4.1

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.
@@ -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.7.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'
@@ -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'
@@ -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 }
@@ -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
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.update_sending_request_to(scheme: protocol,
70
- host: host,
71
- port: port,
72
- path: path)
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 [String]
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 [::Selenium::WebDriver::Element]
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.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
@@ -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
@@ -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,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, 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