appium_lib_core 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/CHANGELOG.md +16 -0
  4. data/lib/appium_lib_core/android/device.rb +301 -406
  5. data/lib/appium_lib_core/android/device/clipboard.rb +42 -0
  6. data/lib/appium_lib_core/android/device/emulator.rb +149 -147
  7. data/lib/appium_lib_core/android/device/network.rb +47 -0
  8. data/lib/appium_lib_core/android/device/performance.rb +24 -0
  9. data/lib/appium_lib_core/android/device/screen.rb +39 -0
  10. data/lib/appium_lib_core/android/espresso/bridge.rb +1 -1
  11. data/lib/appium_lib_core/android/uiautomator1/bridge.rb +1 -1
  12. data/lib/appium_lib_core/android/uiautomator2/bridge.rb +1 -1
  13. data/lib/appium_lib_core/android/uiautomator2/device.rb +3 -14
  14. data/lib/appium_lib_core/android/uiautomator2/device/battery.rb +28 -0
  15. data/lib/appium_lib_core/common/base/http_default.rb +5 -1
  16. data/lib/appium_lib_core/device.rb +50 -370
  17. data/lib/appium_lib_core/device/app_management.rb +113 -0
  18. data/lib/appium_lib_core/device/app_state.rb +18 -1
  19. data/lib/appium_lib_core/device/context.rb +48 -0
  20. data/lib/appium_lib_core/device/device_lock.rb +28 -0
  21. data/lib/appium_lib_core/device/file_management.rb +32 -0
  22. data/lib/appium_lib_core/device/image_comparison.rb +1 -3
  23. data/lib/appium_lib_core/device/ime_actions.rb +43 -0
  24. data/lib/appium_lib_core/device/keyboard.rb +26 -0
  25. data/lib/appium_lib_core/device/keyevent.rb +44 -0
  26. data/lib/appium_lib_core/device/screen_record.rb +21 -0
  27. data/lib/appium_lib_core/device/setting.rb +21 -0
  28. data/lib/appium_lib_core/device/touch_actions.rb +22 -0
  29. data/lib/appium_lib_core/device/value.rb +23 -0
  30. data/lib/appium_lib_core/driver.rb +8 -0
  31. data/lib/appium_lib_core/ios/device.rb +70 -101
  32. data/lib/appium_lib_core/ios/device/clipboard.rb +41 -0
  33. data/lib/appium_lib_core/ios/uiautomation/bridge.rb +1 -1
  34. data/lib/appium_lib_core/ios/xcuitest/bridge.rb +2 -2
  35. data/lib/appium_lib_core/ios/xcuitest/device.rb +166 -227
  36. data/lib/appium_lib_core/ios/xcuitest/device/battery.rb +28 -0
  37. data/lib/appium_lib_core/ios/xcuitest/device/performance.rb +40 -0
  38. data/lib/appium_lib_core/ios/xcuitest/device/screen.rb +30 -0
  39. data/lib/appium_lib_core/version.rb +2 -2
  40. data/release_notes.md +12 -0
  41. metadata +21 -2
@@ -0,0 +1,23 @@
1
+ module Appium
2
+ module Core
3
+ module Device
4
+ module Value
5
+ def self.add_methods
6
+ ::Appium::Core::Device.add_endpoint_method(:set_immediate_value) do
7
+ def set_immediate_value(element, *value)
8
+ keys = ::Selenium::WebDriver::Keys.encode(value)
9
+ execute :set_immediate_value, { id: element.ref }, value: Array(keys)
10
+ end
11
+ end
12
+
13
+ ::Appium::Core::Device.add_endpoint_method(:replace_value) do
14
+ def replace_value(element, *value)
15
+ keys = ::Selenium::WebDriver::Keys.encode(value)
16
+ execute :replace_value, { id: element.ref }, value: Array(keys)
17
+ end
18
+ end
19
+ end
20
+ end # module Value
21
+ end # module Device
22
+ end # module Core
23
+ end # module Appium
@@ -97,8 +97,16 @@ module Appium
97
97
  new(target, opts)
98
98
  end
99
99
 
100
+ # @private
101
+ # For testing purpose of delegate_from_appium_driver
102
+ private def delegated_target_for_test
103
+ @delegate_target
104
+ end
105
+
100
106
  # @private
101
107
  def initialize(target, opts = {})
108
+ @delegate_target = target # for testing purpose
109
+
102
110
  opts = Appium.symbolize_keys opts
103
111
  validate_keys(opts)
104
112
 
@@ -1,111 +1,80 @@
1
- require 'base64'
1
+ require_relative 'device/clipboard'
2
2
 
3
3
  module Appium
4
- module Ios
5
- module Device
6
- extend Forwardable
7
-
8
- # @!method touch_id(match = true)
9
- # An instance method of Appium::Core::Device .
10
- # Simulate Touch ID with either valid (match == true) or invalid (match == false) fingerprint.
11
- # @param [Boolean] match fingerprint validity. Defaults to true.
12
- # @return [String]
13
- #
14
- # @example
15
- #
16
- # @driver.touch_id true #=> Simulate valid fingerprint
17
- # @driver.touch_id false #=> Simulate invalid fingerprint
18
- #
19
-
20
- # @!method toggle_touch_id_enrollment(enabled = true)
21
- # An instance method of Appium::Core::Device .
22
- # Toggle touch id enrollment on an iOS Simulator.
23
- # @param [Boolean] enabled Enable toggle touch id enrollment. Set true by default.
24
- # @return [String]
25
- #
26
- # @example
27
- #
28
- # @driver.toggle_touch_id_enrollment #=> Enable toggle enrolled
29
- # @driver.toggle_touch_id_enrollment true #=> Enable toggle enrolled
30
- # @driver.toggle_touch_id_enrollment false #=> Disable toggle enrolled
31
- #
32
-
33
- # @!method get_clipboard(content_type: :plaintext)
34
- # Set the content of device's clipboard.
35
- # @param [String] content_type: one of supported content types.
36
- # @return [String]
37
- #
38
- # @example
39
- #
40
- # @driver.get_clipboard #=> "happy testing"
41
- #
42
-
43
- # @!method set_clipboard(content:, content_type: :plaintext)
44
- # Set the content of device's clipboard.
45
- # @param [String] content_type: one of supported content types.
46
- # @param [String] content: Contents to be set. (Will encode with base64-encoded inside this method)
47
- #
48
- # @example
49
- #
50
- # @driver.set_clipboard(content: 'happy testing') #=> {"protocol"=>"W3C"}
51
- #
52
-
53
- ####
54
- ## class << self
55
- ####
56
-
57
- class << self
58
- def extended(_mod)
59
- ::Appium::Core::Device.extend_webdriver_with_forwardable
60
-
61
- ::Appium::Core::Device.add_endpoint_method(:touch_id) do
62
- def touch_id(match = true)
63
- execute :touch_id, {}, match: match
64
- end
65
- end
66
-
67
- ::Appium::Core::Device.add_endpoint_method(:toggle_touch_id_enrollment) do
68
- def toggle_touch_id_enrollment(enabled = true)
69
- execute :toggle_touch_id_enrollment, {}, enabled: enabled
70
- end
71
- end
72
-
73
- add_clipboard
74
- end
75
-
76
- private
77
-
78
- def add_clipboard
79
- ::Appium::Core::Device.add_endpoint_method(:get_clipboard) do
80
- def get_clipboard(content_type: :plaintext)
81
- unless ::Appium::Core::Device::Clipboard::CONTENT_TYPE.member?(content_type)
82
- raise "content_type should be #{::Appium::Core::Device::Clipboard::CONTENT_TYPE}"
4
+ module Core
5
+ module Ios
6
+ module Device
7
+ extend Forwardable
8
+
9
+ # @!method touch_id(match = true)
10
+ # An instance method of Appium::Core::Device .
11
+ # Simulate Touch ID with either valid (match == true) or invalid (match == false) fingerprint.
12
+ # @param [Boolean] match fingerprint validity. Defaults to true.
13
+ # @return [String]
14
+ #
15
+ # @example
16
+ #
17
+ # @driver.touch_id true #=> Simulate valid fingerprint
18
+ # @driver.touch_id false #=> Simulate invalid fingerprint
19
+ #
20
+
21
+ # @!method toggle_touch_id_enrollment(enabled = true)
22
+ # An instance method of Appium::Core::Device .
23
+ # Toggle touch id enrollment on an iOS Simulator.
24
+ # @param [Boolean] enabled Enable toggle touch id enrollment. Set true by default.
25
+ # @return [String]
26
+ #
27
+ # @example
28
+ #
29
+ # @driver.toggle_touch_id_enrollment #=> Enable toggle enrolled
30
+ # @driver.toggle_touch_id_enrollment true #=> Enable toggle enrolled
31
+ # @driver.toggle_touch_id_enrollment false #=> Disable toggle enrolled
32
+ #
33
+
34
+ # @!method get_clipboard(content_type: :plaintext)
35
+ # Set the content of device's clipboard.
36
+ # @param [String] content_type: one of supported content types.
37
+ # @return [String]
38
+ #
39
+ # @example
40
+ #
41
+ # @driver.get_clipboard #=> "happy testing"
42
+ #
43
+
44
+ # @!method set_clipboard(content:, content_type: :plaintext)
45
+ # Set the content of device's clipboard.
46
+ # @param [String] content_type: one of supported content types.
47
+ # @param [String] content: Contents to be set. (Will encode with base64-encoded inside this method)
48
+ #
49
+ # @example
50
+ #
51
+ # @driver.set_clipboard(content: 'happy testing') #=> {"protocol"=>"W3C"}
52
+ #
53
+
54
+ ####
55
+ ## class << self
56
+ ####
57
+
58
+ class << self
59
+ def extended(_mod)
60
+ ::Appium::Core::Device.extend_webdriver_with_forwardable
61
+
62
+ ::Appium::Core::Device.add_endpoint_method(:touch_id) do
63
+ def touch_id(match = true)
64
+ execute :touch_id, {}, match: match
83
65
  end
84
-
85
- params = {}
86
- params[:contentType] = content_type
87
-
88
- data = execute(:get_clipboard, {}, params)
89
- Base64.decode64 data
90
66
  end
91
- end
92
67
 
93
- ::Appium::Core::Device.add_endpoint_method(:set_clipboard) do
94
- def set_clipboard(content:, content_type: :plaintext)
95
- unless ::Appium::Core::Device::Clipboard::CONTENT_TYPE.member?(content_type)
96
- raise "content_type should be #{::Appium::Core::Device::Clipboard::CONTENT_TYPE}"
68
+ ::Appium::Core::Device.add_endpoint_method(:toggle_touch_id_enrollment) do
69
+ def toggle_touch_id_enrollment(enabled = true)
70
+ execute :toggle_touch_id_enrollment, {}, enabled: enabled
97
71
  end
98
-
99
- params = {
100
- contentType: content_type,
101
- content: Base64.encode64(content)
102
- }
103
-
104
- execute(:set_clipboard, {}, params)
105
72
  end
73
+
74
+ Clipboard.add_methods
106
75
  end
107
76
  end
108
- end
109
- end # module Device
110
- end # module iOS
77
+ end # module Device
78
+ end # module iOS
79
+ end # module Core
111
80
  end # module Appium
@@ -0,0 +1,41 @@
1
+ require 'base64'
2
+
3
+ module Appium
4
+ module Core
5
+ module Ios
6
+ module Device
7
+ module Clipboard
8
+ def self.add_methods
9
+ ::Appium::Core::Device.add_endpoint_method(:get_clipboard) do
10
+ def get_clipboard(content_type: :plaintext)
11
+ unless ::Appium::Core::Device::Clipboard::CONTENT_TYPE.member?(content_type)
12
+ raise "content_type should be #{::Appium::Core::Device::Clipboard::CONTENT_TYPE}"
13
+ end
14
+
15
+ params = { contentType: content_type }
16
+
17
+ data = execute(:get_clipboard, {}, params)
18
+ Base64.decode64 data
19
+ end
20
+ end
21
+
22
+ ::Appium::Core::Device.add_endpoint_method(:set_clipboard) do
23
+ def set_clipboard(content:, content_type: :plaintext)
24
+ unless ::Appium::Core::Device::Clipboard::CONTENT_TYPE.member?(content_type)
25
+ raise "content_type should be #{::Appium::Core::Device::Clipboard::CONTENT_TYPE}"
26
+ end
27
+
28
+ params = {
29
+ contentType: content_type,
30
+ content: Base64.encode64(content)
31
+ }
32
+
33
+ execute(:set_clipboard, {}, params)
34
+ end
35
+ end
36
+ end
37
+ end # module Clipboard
38
+ end # module Device
39
+ end # module Ios
40
+ end # module Core
41
+ end # module Appium
@@ -5,7 +5,7 @@ module Appium
5
5
  module Bridge
6
6
  def self.for(target)
7
7
  Core::Ios::SearchContext.extend
8
- target.extend Appium::Ios::Device
8
+ target.extend Appium::Core::Ios::Device
9
9
 
10
10
  Core::Ios::Uiautomation.patch_webdriver_element
11
11
  end
@@ -6,8 +6,8 @@ module Appium
6
6
  def self.for(target)
7
7
  Core::Ios::SearchContext.extend
8
8
  Core::Ios::Xcuitest::SearchContext.extend
9
- target.extend Appium::Ios::Device
10
- target.extend Appium::Ios::Xcuitest::Device
9
+ target.extend Appium::Core::Ios::Device
10
+ target.extend Appium::Core::Ios::Xcuitest::Device
11
11
  end
12
12
  end
13
13
  end
@@ -1,234 +1,173 @@
1
- module Appium
2
- module Ios
3
- module Xcuitest
4
- module Device
5
- extend Forwardable
6
-
7
- # rubocop:disable Metrics/LineLength
8
-
9
- # @!method hide_keyboard(close_key = nil, strategy = nil)
10
- # Hide the onscreen keyboard
11
- # @param [String] close_key The name of the key which closes the keyboard.
12
- # @param [Symbol] strategy The symbol of the strategy which closes the keyboard.
13
- # XCUITest ignore this argument.
14
- # Default for iOS is `:pressKey`. Default for Android is `:tapOutside`.
15
- #
16
- # @example
17
- #
18
- # @driver.hide_keyboard # Close a keyboard with the 'Done' button
19
- # @driver.hide_keyboard('Finished') # Close a keyboard with the 'Finished' button
20
- #
21
-
22
- # @!method background_app(duration = 0)
23
- # Backgrounds the app for a set number of seconds.
24
- # This is a blocking application.
25
- # @param [Integer] duration How many seconds to background the app for.
26
- #
27
- # @example
28
- #
29
- # @driver.background_app
30
- # @driver.background_app(5)
31
- # @driver.background_app(-1) #=> the app never come back. https://github.com/appium/appium/issues/7741
32
- #
33
-
34
- # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: nil, force_restart: nil, video_type: 'mp4', time_limit: '180', video_quality: 'medium')
35
- # @param [String] remote_path: The path to the remote location, where the resulting video should be uploaded.
36
- # The following protocols are supported: http/https, ftp.
37
- # Null or empty string value (the default setting) means the content of resulting
38
- # file should be encoded as Base64 and passed as the endpount response value.
39
- # An exception will be thrown if the generated media file is too big to
40
- # fit into the available process memory.
41
- # This option only has an effect if there is screen recording process in progreess
42
- # and `forceRestart` parameter is not set to `true`.
43
- # @param [String] user: The name of the user for the remote authentication.
44
- # @param [String] pass: The password for the remote authentication.
45
- # @param [String] method: The http multipart upload method name. The 'PUT' one is used by default.
46
- # @param [Boolean] force_restart: Whether to try to catch and upload/return the currently running screen recording
47
- # (`false`, the default setting on server) or ignore the result of it
48
- # and start a new recording immediately (`true`).
49
- # @param [String] video_type: The format of the screen capture to be recorded.
50
- # Available formats: "h264", "mp4" or "fmp4". Default is "mp4".
51
- # Only works for Simulator.
52
- # @param [String] time_limit: Recording time. 180 seconds is by default.
53
- # @param [String] video_quality: The video encoding quality (low, medium, high, photo - defaults to medium).
54
- # Only works for real devices.
55
- #
56
- # @example
57
- #
58
- # @driver.start_recording_screen
59
- # @driver.start_recording_screen video_type: 'h264', time_limit: '260'
60
- #
61
-
62
- # @since 1.3.4
63
- # @!method start_performance_record(timeout: 300000, profile_name: 'Activity Monitor')
64
- #
65
- # This is a blocking application.
66
- # @param [Integer|String] timeout: The maximum count of milliseconds to record the profiling information.
67
- # @param [String] profile_name: The name of existing performance profile to apply.
68
- # Execute `instruments -s` to show the list of available profiles.
69
- # Note, that not all profiles are supported on mobile devices.
70
- # @param [Integer|String] pid: The ID of the process to measure the performance for.
71
- # Set it to `current` in order to measure the performance of
72
- # the process, which belongs to the currently active application.
73
- # All processes running on the device are measured if
74
- # pid is unset (the default setting). Setting process ID while
75
- # device under test is Simulator might require `instruments` to be launched
76
- # with sudo privileges, which is not supported and will throw a timeout exception.
77
- # @return nil
78
- #
79
- # @example
80
- #
81
- # @driver.start_performance_record # default: (timeout: 300000, profile_name: 'Activity Monitor')
82
- # @driver.start_performance_record(timeout: 300000, profile_name: 'Activity Monitor')
83
- #
84
-
85
- # @since 1.3.4
86
- # @!method get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor', remote_path: nil, user: nil, pass: nil, method: 'PUT')
87
- #
88
- # This is a blocking application.
89
- #
90
- # @param [String] save_file_path: A path to save data as zipped .trace file
91
- # @param [String] profile_name: The name of existing performance profile to apply.
92
- # Execute `instruments -s` to show the list of available profiles.
93
- # Note, that not all profiles are supported on mobile devices.
94
- # @param [String] save_file_path: The name of existing performance profile to apply.
95
- # Execute `instruments -s` to show the list of available profiles.
96
- # Note, that not all profiles are supported on mobile devices.
97
- # @param [String] remote_path: The path to the remote location, where the resulting zipped .trace file should be uploaded.
98
- # The following protocols are supported: http/https, ftp.
99
- # Null or empty string value (the default setting) means the content of resulting
100
- # file should be zipped, encoded as Base64 and passed as the endpount response value.
101
- # An exception will be thrown if the generated file is too big to
102
- # fit into the available process memory.
103
- # @param [String] user: The name of the user for the remote authentication. Only works if `remotePath` is provided.
104
- # @param [String] pass: The password for the remote authentication. Only works if `remotePath` is provided.
105
- # @param [String] method: The http multipart upload method name. Only works if `remotePath` is provided.
106
- #
107
- # @example
108
- #
109
- # @driver.get_performance_record
110
- # @driver.get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor')
111
-
112
- # @since 1.6.0
113
- # @!method battery_info
114
- #
115
- # Get battery information.
116
- #
117
- # @return [Hash] Return battery level and battery state from the target real device. (Simulator has no battery.)
118
- # https://developer.apple.com/documentation/uikit/uidevice/ 's `batteryLevel` and `batteryState`.
119
- # Battery level in range [0.0, 1.0], where 1.0 means 100% charge. -1 is returned
120
- # if the actual value cannot be retrieved from the system.
121
- # Battery state. The following symbols are possible
122
- # `:unplugged, :charging, :full`
123
- #
124
- # @example
125
- #
126
- # @driver.battery_info #=> { state: :full, level: 0.7 }
127
- #
128
-
129
- # rubocop:enable Metrics/LineLength
1
+ require_relative 'device/performance'
2
+ require_relative 'device/screen'
3
+ require_relative 'device/battery'
130
4
 
131
- ####
132
- ## class << self
133
- ####
134
-
135
- class << self
136
- def extended(_mod)
137
- # Override
138
- ::Appium::Core::Device.add_endpoint_method(:hide_keyboard) do
139
- def hide_keyboard(close_key = nil, strategy = nil)
140
- option = {}
141
-
142
- option[:key] = close_key if close_key
143
- option[:strategy] = strategy if strategy
144
-
145
- execute :hide_keyboard, {}, option
146
- end
147
- end
148
-
149
- # Override
150
- ::Appium::Core::Device.add_endpoint_method(:background_app) do
151
- def background_app(duration = 0)
152
- # https://github.com/appium/ruby_lib/issues/500, https://github.com/appium/appium/issues/7741
153
- # `execute :background_app, {}, seconds: { timeout: duration_milli_sec }` works over Appium 1.6.4
154
- duration_milli_sec = duration.nil? ? nil : duration * 1000
155
- execute :background_app, {}, seconds: { timeout: duration_milli_sec }
156
- end
157
- end
158
-
159
- add_performance
160
- add_screen_recording
161
- add_battery_info
162
- end
163
-
164
- private
165
-
166
- def add_battery_info
167
- Appium::Core::Device.add_endpoint_method(:battery_info) do
168
- def battery_info
169
- response = execute_script 'mobile: batteryInfo', {}
170
-
171
- state = case response['state']
172
- when 1, 2, 3
173
- ::Appium::Core::Device::BatteryStatus::IOS[response['state']]
174
- else
175
- Appium::Logger.warn("The state is unknown or undefined: #{response['state']}")
176
- ::Appium::Core::Device::BatteryStatus::IOS[0] # :unknown
177
- end
178
- { state: state, level: response['level'] }
179
- end
180
- end
181
- end
182
-
183
- def add_performance
184
- Appium::Core::Device.add_endpoint_method(:start_performance_record) do
185
- def start_performance_record(timeout: 300_000, profile_name: 'Activity Monitor', pid: nil)
186
- option = {}
187
- option[:timeout] = timeout
188
- option[:profileName] = profile_name
189
- option[:pid] = pid if pid
190
-
191
- execute_script 'mobile: startPerfRecord', option
5
+ module Appium
6
+ module Core
7
+ module Ios
8
+ module Xcuitest
9
+ module Device
10
+ extend Forwardable
11
+
12
+ # rubocop:disable Metrics/LineLength
13
+
14
+ # @!method hide_keyboard(close_key = nil, strategy = nil)
15
+ # Hide the onscreen keyboard
16
+ # @param [String] close_key The name of the key which closes the keyboard.
17
+ # @param [Symbol] strategy The symbol of the strategy which closes the keyboard.
18
+ # XCUITest ignore this argument.
19
+ # Default for iOS is `:pressKey`. Default for Android is `:tapOutside`.
20
+ #
21
+ # @example
22
+ #
23
+ # @driver.hide_keyboard # Close a keyboard with the 'Done' button
24
+ # @driver.hide_keyboard('Finished') # Close a keyboard with the 'Finished' button
25
+ #
26
+
27
+ # @!method background_app(duration = 0)
28
+ # Backgrounds the app for a set number of seconds.
29
+ # This is a blocking application.
30
+ # @param [Integer] duration How many seconds to background the app for.
31
+ #
32
+ # @example
33
+ #
34
+ # @driver.background_app
35
+ # @driver.background_app(5)
36
+ # @driver.background_app(-1) #=> the app never come back. https://github.com/appium/appium/issues/7741
37
+ #
38
+
39
+ # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: nil, force_restart: nil, video_type: 'mp4', time_limit: '180', video_quality: 'medium')
40
+ # @param [String] remote_path: The path to the remote location, where the resulting video should be uploaded.
41
+ # The following protocols are supported: http/https, ftp.
42
+ # Null or empty string value (the default setting) means the content of resulting
43
+ # file should be encoded as Base64 and passed as the endpount response value.
44
+ # An exception will be thrown if the generated media file is too big to
45
+ # fit into the available process memory.
46
+ # This option only has an effect if there is screen recording process in progreess
47
+ # and `forceRestart` parameter is not set to `true`.
48
+ # @param [String] user: The name of the user for the remote authentication.
49
+ # @param [String] pass: The password for the remote authentication.
50
+ # @param [String] method: The http multipart upload method name. The 'PUT' one is used by default.
51
+ # @param [Boolean] force_restart: Whether to try to catch and upload/return the currently running screen recording
52
+ # (`false`, the default setting on server) or ignore the result of it
53
+ # and start a new recording immediately (`true`).
54
+ # @param [String] video_type: The format of the screen capture to be recorded.
55
+ # Available formats: "h264", "mp4" or "fmp4". Default is "mp4".
56
+ # Only works for Simulator.
57
+ # @param [String] time_limit: Recording time. 180 seconds is by default.
58
+ # @param [String] video_quality: The video encoding quality (low, medium, high, photo - defaults to medium).
59
+ # Only works for real devices.
60
+ #
61
+ # @example
62
+ #
63
+ # @driver.start_recording_screen
64
+ # @driver.start_recording_screen video_type: 'h264', time_limit: '260'
65
+ #
66
+
67
+ # @since 1.3.4
68
+ # @!method start_performance_record(timeout: 300000, profile_name: 'Activity Monitor')
69
+ #
70
+ # This is a blocking application.
71
+ # @param [Integer|String] timeout: The maximum count of milliseconds to record the profiling information.
72
+ # @param [String] profile_name: The name of existing performance profile to apply.
73
+ # Execute `instruments -s` to show the list of available profiles.
74
+ # Note, that not all profiles are supported on mobile devices.
75
+ # @param [Integer|String] pid: The ID of the process to measure the performance for.
76
+ # Set it to `current` in order to measure the performance of
77
+ # the process, which belongs to the currently active application.
78
+ # All processes running on the device are measured if
79
+ # pid is unset (the default setting). Setting process ID while
80
+ # device under test is Simulator might require `instruments` to be launched
81
+ # with sudo privileges, which is not supported and will throw a timeout exception.
82
+ # @return nil
83
+ #
84
+ # @example
85
+ #
86
+ # @driver.start_performance_record # default: (timeout: 300000, profile_name: 'Activity Monitor')
87
+ # @driver.start_performance_record(timeout: 300000, profile_name: 'Activity Monitor')
88
+ #
89
+
90
+ # @since 1.3.4
91
+ # @!method get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor', remote_path: nil, user: nil, pass: nil, method: 'PUT')
92
+ #
93
+ # This is a blocking application.
94
+ #
95
+ # @param [String] save_file_path: A path to save data as zipped .trace file
96
+ # @param [String] profile_name: The name of existing performance profile to apply.
97
+ # Execute `instruments -s` to show the list of available profiles.
98
+ # Note, that not all profiles are supported on mobile devices.
99
+ # @param [String] save_file_path: The name of existing performance profile to apply.
100
+ # Execute `instruments -s` to show the list of available profiles.
101
+ # Note, that not all profiles are supported on mobile devices.
102
+ # @param [String] remote_path: The path to the remote location, where the resulting zipped .trace file should be uploaded.
103
+ # The following protocols are supported: http/https, ftp.
104
+ # Null or empty string value (the default setting) means the content of resulting
105
+ # file should be zipped, encoded as Base64 and passed as the endpount response value.
106
+ # An exception will be thrown if the generated file is too big to
107
+ # fit into the available process memory.
108
+ # @param [String] user: The name of the user for the remote authentication. Only works if `remotePath` is provided.
109
+ # @param [String] pass: The password for the remote authentication. Only works if `remotePath` is provided.
110
+ # @param [String] method: The http multipart upload method name. Only works if `remotePath` is provided.
111
+ #
112
+ # @example
113
+ #
114
+ # @driver.get_performance_record
115
+ # @driver.get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor')
116
+
117
+ # @since 1.6.0
118
+ # @!method battery_info
119
+ #
120
+ # Get battery information.
121
+ #
122
+ # @return [Hash] Return battery level and battery state from the target real device. (Simulator has no battery.)
123
+ # https://developer.apple.com/documentation/uikit/uidevice/ 's `batteryLevel` and `batteryState`.
124
+ # Battery level in range [0.0, 1.0], where 1.0 means 100% charge. -1 is returned
125
+ # if the actual value cannot be retrieved from the system.
126
+ # Battery state. The following symbols are possible
127
+ # `:unplugged, :charging, :full`
128
+ #
129
+ # @example
130
+ #
131
+ # @driver.battery_info #=> { state: :full, level: 0.7 }
132
+ #
133
+
134
+ # rubocop:enable Metrics/LineLength
135
+
136
+ ####
137
+ ## class << self
138
+ ####
139
+
140
+ class << self
141
+ def extended(_mod)
142
+ # Override
143
+ ::Appium::Core::Device.add_endpoint_method(:hide_keyboard) do
144
+ def hide_keyboard(close_key = nil, strategy = nil)
145
+ option = {}
146
+
147
+ option[:key] = close_key if close_key
148
+ option[:strategy] = strategy if strategy
149
+
150
+ execute :hide_keyboard, {}, option
151
+ end
192
152
  end
193
- end
194
-
195
- Appium::Core::Device.add_endpoint_method(:get_performance_record) do
196
- # rubocop:disable Metrics/ParameterLists
197
- def get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor',
198
- remote_path: nil, user: nil, pass: nil, method: 'PUT')
199
- option = ::Appium::Core::Device::ScreenRecord.new(
200
- remote_path: remote_path, user: user, pass: pass, method: method
201
- ).upload_option
202
-
203
- option[:profileName] = profile_name
204
- result = execute_script 'mobile: stopPerfRecord', option
205
153
 
206
- File.open("#{save_file_path}.zip", 'wb') { |f| f << result.unpack('m')[0] }
154
+ # Override
155
+ ::Appium::Core::Device.add_endpoint_method(:background_app) do
156
+ def background_app(duration = 0)
157
+ # https://github.com/appium/ruby_lib/issues/500, https://github.com/appium/appium/issues/7741
158
+ # `execute :background_app, {}, seconds: { timeout: duration_milli_sec }` works over Appium 1.6.4
159
+ duration_milli_sec = duration.nil? ? nil : duration * 1000
160
+ execute :background_app, {}, seconds: { timeout: duration_milli_sec }
161
+ end
207
162
  end
208
- # rubocop:enable Metrics/ParameterLists
209
- end
210
- end
211
-
212
- def add_screen_recording
213
- Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
214
- # rubocop:disable Metrics/ParameterLists
215
- def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: nil, force_restart: nil,
216
- video_type: 'mp4', time_limit: '180', video_quality: 'medium')
217
- option = ::Appium::Core::Device::ScreenRecord.new(
218
- remote_path: remote_path, user: user, pass: pass, method: method, force_restart: force_restart
219
- ).upload_option
220
163
 
221
- option[:videoType] = video_type
222
- option[:timeLimit] = time_limit
223
- option[:videoQuality] = video_quality
224
-
225
- execute(:start_recording_screen, {}, { options: option })
226
- end
227
- # rubocop:enable Metrics/ParameterLists
164
+ Performance.add_methods
165
+ Screen.add_methods
166
+ Battery.add_methods
228
167
  end
229
- end
230
- end # class << self
231
- end # module Device
232
- end # module Xcuitest
233
- end # module Ios
168
+ end # class << self
169
+ end # module Device
170
+ end # module Xcuitest
171
+ end # module Ios
172
+ end # module Core
234
173
  end # module Appium