appium_lib_core 1.6.0 → 1.7.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.
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