appium_lib_core 3.5.0 → 3.9.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/.rubocop.yml +3 -1
- data/CHANGELOG.md +55 -0
- data/Rakefile +7 -0
- data/appium_lib_core.gemspec +3 -3
- data/ci-jobs/functional/start-emulator.sh +1 -1
- data/ci-jobs/functional_test.yml +4 -4
- data/lib/appium_lib_core/android/device.rb +27 -1
- data/lib/appium_lib_core/android/device/screen.rb +5 -4
- data/lib/appium_lib_core/common/base/http_default.rb +20 -3
- data/lib/appium_lib_core/common/command/common.rb +4 -1
- data/lib/appium_lib_core/common/device/screen_record.rb +9 -3
- data/lib/appium_lib_core/device.rb +1 -1
- data/lib/appium_lib_core/driver.rb +55 -24
- data/lib/appium_lib_core/ios/xcuitest/device.rb +8 -1
- data/lib/appium_lib_core/ios/xcuitest/device/performance.rb +4 -2
- data/lib/appium_lib_core/ios/xcuitest/device/screen.rb +7 -6
- data/lib/appium_lib_core/version.rb +2 -2
- data/lib/appium_lib_core/windows.rb +16 -0
- data/lib/appium_lib_core/windows/bridge.rb +25 -0
- data/lib/appium_lib_core/windows/device.rb +86 -0
- data/lib/appium_lib_core/windows/device/screen.rb +43 -0
- data/release_notes.md +47 -0
- metadata +13 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3460051d458ee50ac23d5a2d6ebf9d5404382a63740de60e2c51284db5da7418
|
4
|
+
data.tar.gz: bf58c7552b40d2461fc03bf0f06eb1845cc04c801f6bafa4e13d1f8448627c73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16368ab0315f00e08232551751422cc5cbfe89e0c0b5b046d8ac3543e5c3d3253c4a27f50cadb7b7c6209df6d06e52bcfc7861bdee3126ab44e568950301da14
|
7
|
+
data.tar.gz: e5b0b72438585da43ba935584aeb58c0c17d3ce8463b724565afaa52260a2cd6e0c8727e89f219723d3c96aac527ca70b9b8f6ee49d7ef5f0f40f42d15e6c8c9
|
data/.rubocop.yml
CHANGED
@@ -15,7 +15,7 @@ Metrics/CyclomaticComplexity:
|
|
15
15
|
Metrics/PerceivedComplexity:
|
16
16
|
Max: 13
|
17
17
|
Metrics/ParameterLists:
|
18
|
-
|
18
|
+
Enabled: false
|
19
19
|
Lint/NestedMethodDefinition:
|
20
20
|
Enabled: false
|
21
21
|
# TODO: Replace <<- with <<~ after dropping Ruby 2.2
|
@@ -42,5 +42,7 @@ Naming/MemoizedInstanceVariableName:
|
|
42
42
|
Enabled: true
|
43
43
|
Exclude:
|
44
44
|
- test/**/*
|
45
|
+
Naming/RescuedExceptionsVariableName:
|
46
|
+
Enabled: false
|
45
47
|
Layout/RescueEnsureAlignment:
|
46
48
|
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -10,6 +10,61 @@ Read `release_notes.md` for commit level details.
|
|
10
10
|
|
11
11
|
### Deprecations
|
12
12
|
|
13
|
+
## [3.9.0] - 2020-05-31
|
14
|
+
|
15
|
+
### Enhancements
|
16
|
+
- `capabilities:` is available in addition to `desired_capabilities:` and `caps:` as a capability
|
17
|
+
```ruby
|
18
|
+
# case 1
|
19
|
+
opts = { caps: { }, appium_lib: { } }
|
20
|
+
@driver = Appium::Core.for(opts).start_driver
|
21
|
+
|
22
|
+
# case 2
|
23
|
+
opts = { capabilities: { }, appium_lib: { } }
|
24
|
+
@driver = Appium::Core.for(opts).start_driver
|
25
|
+
|
26
|
+
# case 3
|
27
|
+
opts = { desired_capabilities: { }, appium_lib: { } }
|
28
|
+
@driver = Appium::Core.for(opts).start_driver
|
29
|
+
```
|
30
|
+
|
31
|
+
### Bug fixes
|
32
|
+
|
33
|
+
### Deprecations
|
34
|
+
|
35
|
+
## [3.8.0] - 2020-05-17
|
36
|
+
|
37
|
+
### Enhancements
|
38
|
+
- Add options for `start_recording_screen`
|
39
|
+
- `file_field_name`, `form_fields` and `headers` are available since Appium 1.18.0
|
40
|
+
|
41
|
+
### Bug fixes
|
42
|
+
- Fix `x-idempotency-key` header to add it only in new session request (https://github.com/appium/ruby_lib_core/issues/262)
|
43
|
+
|
44
|
+
### Deprecations
|
45
|
+
|
46
|
+
## [3.7.0] - 2020-04-18
|
47
|
+
|
48
|
+
### Enhancements
|
49
|
+
- Add `x-idempotency-key` header support (https://github.com/appium/appium-base-driver/pull/400)
|
50
|
+
- Can disable the header with `enable_idempotency_header: false` in `appium_lib` capability. Defaults to `true`.
|
51
|
+
- Add chrome devtools endpoint which is available chrome module in Selenium Ruby binding
|
52
|
+
- https://github.com/appium/appium-base-driver/pull/405
|
53
|
+
|
54
|
+
### Bug fixes
|
55
|
+
|
56
|
+
### Deprecations
|
57
|
+
|
58
|
+
## [3.6.1, 3.6.0] - 2020-03-15
|
59
|
+
|
60
|
+
### Enhancements
|
61
|
+
- Add screen record feature for Windows driver (https://github.com/appium/appium-windows-driver/pull/66)
|
62
|
+
- `#start_recording_screen`, `#stop_recording_screen`
|
63
|
+
|
64
|
+
### Bug fixes
|
65
|
+
|
66
|
+
### Deprecations
|
67
|
+
|
13
68
|
## [3.5.0] - 2020-01-11
|
14
69
|
|
15
70
|
### Enhancements
|
data/Rakefile
CHANGED
@@ -56,6 +56,13 @@ namespace :test do
|
|
56
56
|
t.libs << 'lib'
|
57
57
|
t.test_files = FileList['test/unit/common/**/*_test.rb']
|
58
58
|
end
|
59
|
+
|
60
|
+
desc('Run all Windows related unit tests in test directory')
|
61
|
+
Rake::TestTask.new(:windows) do |t|
|
62
|
+
t.libs << 'test'
|
63
|
+
t.libs << 'lib'
|
64
|
+
t.test_files = FileList['test/unit/windows/**/*_test.rb']
|
65
|
+
end
|
59
66
|
end
|
60
67
|
end
|
61
68
|
|
data/appium_lib_core.gemspec
CHANGED
@@ -26,12 +26,12 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_runtime_dependency 'faye-websocket', '~> 0.10.0'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '>= 1.14'
|
29
|
-
spec.add_development_dependency 'rake', '~>
|
29
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
30
30
|
spec.add_development_dependency 'yard', '~> 0.9.11'
|
31
31
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
32
32
|
spec.add_development_dependency 'minitest-reporters', '~> 1.1'
|
33
|
-
spec.add_development_dependency 'webmock', '~> 3.
|
34
|
-
spec.add_development_dependency 'rubocop', '0.
|
33
|
+
spec.add_development_dependency 'webmock', '~> 3.8.0'
|
34
|
+
spec.add_development_dependency 'rubocop', '0.68.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'
|
@@ -18,7 +18,7 @@ echo ${ANDROID_HOME}/emulator/emulator -list-avds
|
|
18
18
|
echo "Starting emulator"
|
19
19
|
|
20
20
|
# Start emulator in background
|
21
|
-
nohup ${ANDROID_HOME}/emulator/emulator -avd testemulator -no-boot-anim -no-snapshot > /dev/null 2>&1 &
|
21
|
+
nohup ${ANDROID_HOME}/emulator/emulator -avd testemulator -accel auto -no-boot-anim -no-snapshot > /dev/null 2>&1 &
|
22
22
|
${ANDROID_HOME}/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
|
23
23
|
|
24
24
|
${ANDROID_HOME}/platform-tools/adb devices
|
data/ci-jobs/functional_test.yml
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# jobs for functional test
|
2
2
|
parameters:
|
3
|
-
vmImage: 'macOS-10.
|
4
|
-
vmImageForIOS: 'macOS-10.
|
5
|
-
xcodeForIOS: 11.
|
6
|
-
xcodeForTVOS: 11.
|
3
|
+
vmImage: 'macOS-10.15'
|
4
|
+
vmImageForIOS: 'macOS-10.15' # Not sure the reason, but macOS 10.14 instance raises no info.plist error
|
5
|
+
xcodeForIOS: 11.5
|
6
|
+
xcodeForTVOS: 11.5
|
7
7
|
androidSDK: 29
|
8
8
|
appiumVersion: 'beta'
|
9
9
|
ignoreVersionSkip: true
|
@@ -213,7 +213,7 @@ module Appium
|
|
213
213
|
# @driver.get_performance_data package_name: package_name, data_type: data_type, data_read_timeout: 2
|
214
214
|
#
|
215
215
|
|
216
|
-
# @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil, video_size: nil, time_limit: '180', bit_rate: '4000000', bug_report: nil)
|
216
|
+
# @!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, video_size: nil, time_limit: '180', bit_rate: '4000000', bug_report: nil)
|
217
217
|
# @param [String] remote_path The path to the remote location, where the resulting video should be uploaded.
|
218
218
|
# The following protocols are supported: http/https, ftp.
|
219
219
|
# Null or empty string value (the default setting) means the content of resulting
|
@@ -225,6 +225,11 @@ module Appium
|
|
225
225
|
# @param [String] user The name of the user for the remote authentication.
|
226
226
|
# @param [String] pass The password for the remote authentication.
|
227
227
|
# @param [String] method The http multipart upload method name. The 'PUT' one is used by default.
|
228
|
+
# @param [String] file_field_name The name of the form field containing the binary payload in multipart/form-data
|
229
|
+
# requests since Appium 1.18.0. Defaults to 'file'.
|
230
|
+
# @param [Array<Hash, Array<String>>] form_fields The form fields mapping in multipart/form-data requests since Appium 1.18.0.
|
231
|
+
# If any entry has the same key in this mapping, then it is going to be ignored.
|
232
|
+
# @param [Hash] headers The additional headers in multipart/form-data requests since Appium 1.18.0.
|
228
233
|
# @param [Boolean] force_restart Whether to try to catch and upload/return the currently running screen recording
|
229
234
|
# (+false+, the default setting on server) or ignore the result of it
|
230
235
|
# and start a new recording immediately (+true+).
|
@@ -245,6 +250,8 @@ module Appium
|
|
245
250
|
# @param [Boolean] bug_report Set it to +true+ in order to display additional information on the video overlay,
|
246
251
|
# such as a timestamp, that is helpful in videos captured to illustrate bugs.
|
247
252
|
# This option is only supported since API level 27 (Android P).
|
253
|
+
# @return [String] Base64 encoded content of the recorded media file or an empty string
|
254
|
+
# if the file has been successfully uploaded to a remote location (depends on the actual options)
|
248
255
|
#
|
249
256
|
# @example
|
250
257
|
#
|
@@ -283,6 +290,19 @@ module Appium
|
|
283
290
|
# @driver.finger_print 1
|
284
291
|
#
|
285
292
|
|
293
|
+
# @!method execute_cdp(cmd, params)
|
294
|
+
# Execute Chrome Devtools protocol commands
|
295
|
+
# https://chromedevtools.github.io/devtools-protocol
|
296
|
+
#
|
297
|
+
# @param [String] cmd The name of command
|
298
|
+
# @param [Hash] params The parameter for the command as hash.
|
299
|
+
#
|
300
|
+
# @example
|
301
|
+
#
|
302
|
+
# @driver.execute_cdp 'Page.captureScreenshot', { quality: 50, format: 'jpeg' }
|
303
|
+
# @driver.execute_cdp 'Page.getResourceTree'
|
304
|
+
#
|
305
|
+
|
286
306
|
####
|
287
307
|
## class << self
|
288
308
|
####
|
@@ -391,6 +411,12 @@ module Appium
|
|
391
411
|
end
|
392
412
|
end
|
393
413
|
|
414
|
+
::Appium::Core::Device.add_endpoint_method(:execute_cdp) do
|
415
|
+
def execute_cdp(cmd, **params)
|
416
|
+
execute :chrome_send_command, {}, { cmd: cmd, params: params }
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
394
420
|
Screen.add_methods
|
395
421
|
Performance.add_methods
|
396
422
|
Network.add_methods
|
@@ -25,11 +25,13 @@ module Appium
|
|
25
25
|
end
|
26
26
|
|
27
27
|
::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
|
28
|
-
|
29
|
-
|
28
|
+
def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
|
29
|
+
file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil,
|
30
30
|
video_size: nil, time_limit: '180', bit_rate: nil, bug_report: nil)
|
31
31
|
option = ::Appium::Core::Base::Device::ScreenRecord.new(
|
32
|
-
remote_path: remote_path, user: user, pass: pass, method: method,
|
32
|
+
remote_path: remote_path, user: user, pass: pass, method: method,
|
33
|
+
file_field_name: file_field_name, form_fields: form_fields, headers: headers,
|
34
|
+
force_restart: force_restart
|
33
35
|
).upload_option
|
34
36
|
|
35
37
|
option[:videoSize] = video_size unless video_size.nil?
|
@@ -44,7 +46,6 @@ module Appium
|
|
44
46
|
|
45
47
|
execute(:start_recording_screen, {}, { options: option })
|
46
48
|
end
|
47
|
-
# rubocop:enable Metrics/ParameterLists
|
48
49
|
end
|
49
50
|
end
|
50
51
|
end # module Screen
|
@@ -12,12 +12,20 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'securerandom'
|
16
|
+
|
15
17
|
require_relative '../../version'
|
16
18
|
|
17
19
|
module Appium
|
18
20
|
module Core
|
19
21
|
class Base
|
20
22
|
module Http
|
23
|
+
module RequestHeaders
|
24
|
+
KEYS = {
|
25
|
+
idempotency: 'X-Idempotency-Key'
|
26
|
+
}.freeze
|
27
|
+
end
|
28
|
+
|
21
29
|
class Default < Selenium::WebDriver::Remote::Http::Default
|
22
30
|
DEFAULT_HEADERS = {
|
23
31
|
'Accept' => CONTENT_TYPE,
|
@@ -26,6 +34,14 @@ module Appium
|
|
26
34
|
"appium/ruby_lib_core/#{VERSION} (#{::Selenium::WebDriver::Remote::Http::Common::DEFAULT_HEADERS['User-Agent']})"
|
27
35
|
}.freeze
|
28
36
|
|
37
|
+
attr_reader :additional_headers
|
38
|
+
|
39
|
+
def initialize(open_timeout: nil, read_timeout: nil)
|
40
|
+
@open_timeout = open_timeout
|
41
|
+
@read_timeout = read_timeout
|
42
|
+
@additional_headers = {}
|
43
|
+
end
|
44
|
+
|
29
45
|
# Update <code>server_url</code> provided when ruby_lib _core created a default http client.
|
30
46
|
# Set <code>@http</code> as nil to re-create http client for the <code>server_url</code>
|
31
47
|
#
|
@@ -65,19 +81,20 @@ module Appium
|
|
65
81
|
def call(verb, url, command_hash)
|
66
82
|
url = server_url.merge(url) unless url.is_a?(URI)
|
67
83
|
headers = DEFAULT_HEADERS.dup
|
84
|
+
headers = headers.merge @additional_headers unless @additional_headers.empty?
|
68
85
|
headers['Cache-Control'] = 'no-cache' if verb == :get
|
69
86
|
|
70
87
|
if command_hash
|
71
88
|
payload = JSON.generate(command_hash)
|
72
89
|
headers['Content-Length'] = payload.bytesize.to_s if [:post, :put].include?(verb)
|
73
|
-
|
74
|
-
::Appium::Logger.info(" >>> #{url} | #{payload}")
|
75
|
-
::Appium::Logger.debug(" > #{headers.inspect}")
|
76
90
|
elsif verb == :post
|
77
91
|
payload = '{}'
|
78
92
|
headers['Content-Length'] = '2'
|
79
93
|
end
|
80
94
|
|
95
|
+
::Appium::Logger.info(" >>> #{url} | #{payload}")
|
96
|
+
::Appium::Logger.info(" > #{headers.inspect}")
|
97
|
+
|
81
98
|
request verb, url, headers, payload
|
82
99
|
end
|
83
100
|
end
|
@@ -94,7 +94,10 @@ module Appium
|
|
94
94
|
gsm_voice: [:post, 'session/:session_id/appium/device/gsm_voice'],
|
95
95
|
set_network_speed: [:post, 'session/:session_id/appium/device/network_speed'],
|
96
96
|
set_power_capacity: [:post, 'session/:session_id/appium/device/power_capacity'],
|
97
|
-
set_power_ac: [:post, 'session/:session_id/appium/device/power_ac']
|
97
|
+
set_power_ac: [:post, 'session/:session_id/appium/device/power_ac'],
|
98
|
+
|
99
|
+
# For chromium: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
|
100
|
+
chrome_send_command: [:post, 'session/:session_id/goog/cdp/execute']
|
98
101
|
}.freeze
|
99
102
|
|
100
103
|
COMMAND_IOS = {
|
@@ -25,7 +25,8 @@ module Appium
|
|
25
25
|
|
26
26
|
METHOD = %w(POST PUT).freeze
|
27
27
|
|
28
|
-
def initialize(remote_path: nil, user: nil, pass: nil, method: 'PUT',
|
28
|
+
def initialize(remote_path: nil, user: nil, pass: nil, method: 'PUT',
|
29
|
+
file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil)
|
29
30
|
@upload_option = if remote_path.nil?
|
30
31
|
{}
|
31
32
|
else
|
@@ -36,6 +37,9 @@ module Appium
|
|
36
37
|
option[:user] = user unless user.nil?
|
37
38
|
option[:pass] = pass unless pass.nil?
|
38
39
|
option[:method] = method
|
40
|
+
option[:fileFieldName] = file_field_name unless file_field_name.nil?
|
41
|
+
option[:formFields] = form_fields unless form_fields.nil?
|
42
|
+
option[:headers] = headers unless headers.nil?
|
39
43
|
option
|
40
44
|
end
|
41
45
|
|
@@ -47,9 +51,11 @@ module Appium
|
|
47
51
|
end
|
48
52
|
|
49
53
|
module Command
|
50
|
-
def stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT'
|
54
|
+
def stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
|
55
|
+
file_field_name: nil, form_fields: nil, headers: nil)
|
51
56
|
option = ::Appium::Core::Base::Device::ScreenRecord.new(
|
52
|
-
remote_path: remote_path, user: user, pass: pass, method: method
|
57
|
+
remote_path: remote_path, user: user, pass: pass, method: method,
|
58
|
+
file_field_name: file_field_name, form_fields: form_fields, headers: headers
|
53
59
|
).upload_option
|
54
60
|
|
55
61
|
params = option.empty? ? {} : { options: option }
|
@@ -27,16 +27,19 @@ module Appium
|
|
27
27
|
autoload :Xcuitest, 'appium_lib_core/ios_xcuitest'
|
28
28
|
end
|
29
29
|
|
30
|
+
autoload :Windows, 'appium_lib_core/windows'
|
31
|
+
|
30
32
|
# This options affects only client side as <code>:appium_lib</code> key.<br>
|
31
33
|
# Read {::Appium::Core::Driver} about each attribute
|
32
34
|
class Options
|
33
35
|
attr_reader :custom_url, :default_wait, :export_session, :export_session_path,
|
34
36
|
:port, :wait_timeout, :wait_interval, :listener,
|
35
|
-
:direct_connect
|
37
|
+
:direct_connect, :enable_idempotency_header
|
36
38
|
|
37
39
|
def initialize(appium_lib_opts)
|
38
40
|
@custom_url = appium_lib_opts.fetch :server_url, nil
|
39
41
|
@default_wait = appium_lib_opts.fetch :wait, Driver::DEFAULT_IMPLICIT_WAIT
|
42
|
+
@enable_idempotency_header = appium_lib_opts.fetch :enable_idempotency_header, true
|
40
43
|
|
41
44
|
# bump current session id into a particular file
|
42
45
|
@export_session = appium_lib_opts.fetch :export_session, false
|
@@ -102,6 +105,13 @@ module Appium
|
|
102
105
|
# @return [Appium::Core::Base::Http::Default] the http client
|
103
106
|
attr_reader :http_client
|
104
107
|
|
108
|
+
# Return if adding 'x-idempotency-key' header is enabled for each new session request.
|
109
|
+
# Following commands should not have the key.
|
110
|
+
# The key is unique for each http client instance. Defaults to <code>true</code>
|
111
|
+
# https://github.com/appium/appium-base-driver/pull/400
|
112
|
+
# @return [Bool]
|
113
|
+
attr_reader :enable_idempotency_header
|
114
|
+
|
105
115
|
# Device type to request from the appium server
|
106
116
|
# @return [Symbol] :android and :ios, for example
|
107
117
|
attr_reader :device
|
@@ -112,11 +122,11 @@ module Appium
|
|
112
122
|
attr_reader :automation_name
|
113
123
|
|
114
124
|
# Custom URL for the selenium server. If set this attribute, ruby_lib_core try to handshake to the custom url.<br>
|
115
|
-
# Defaults to false. Then try to connect to <code>http://127.0.0.1:#{port}/wd/hub
|
125
|
+
# Defaults to false. Then try to connect to <code>http://127.0.0.1:#{port}/wd/hub</code>.
|
116
126
|
# @return [String]
|
117
127
|
attr_reader :custom_url
|
118
128
|
|
119
|
-
# Export session id to textfile in /tmp for 3rd party tools. False
|
129
|
+
# Export session id to textfile in /tmp for 3rd party tools. False by default.
|
120
130
|
# @return [Boolean]
|
121
131
|
attr_reader :export_session
|
122
132
|
# @return [String] By default, session id is exported in '/tmp/appium_lib_session'
|
@@ -172,7 +182,9 @@ module Appium
|
|
172
182
|
|
173
183
|
# Creates a new driver and extend particular methods
|
174
184
|
# @param [Hash] opts A options include capabilities for the Appium Server and for the client.
|
175
|
-
# @option opts [Hash] :caps Appium capabilities.
|
185
|
+
# @option opts [Hash] :caps Appium capabilities.
|
186
|
+
# @option opts [Hash] :capabilities The same as :caps.
|
187
|
+
# This param is for compatibility with Selenium WebDriver format
|
176
188
|
# @option opts [Hash] :desired_capabilities The same as :caps.
|
177
189
|
# This param is for compatibility with Selenium WebDriver format
|
178
190
|
# @option opts [Appium::Core::Options] :appium_lib Capabilities affect only ruby client
|
@@ -185,8 +197,8 @@ module Appium
|
|
185
197
|
#
|
186
198
|
# # format 1
|
187
199
|
# @core = Appium::Core.for caps: {...}, appium_lib: {...}
|
188
|
-
# # format 2. 'desired_capabilities:' is also available instead of 'caps:'.
|
189
|
-
# @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub",
|
200
|
+
# # format 2. 'capabilities:' or 'desired_capabilities:' is also available instead of 'caps:'.
|
201
|
+
# @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", capabilities: {...}, appium_lib: {...}
|
190
202
|
# # format 3. 'appium_lib: {...}' can be blank
|
191
203
|
# @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", desired_capabilities: {...}
|
192
204
|
#
|
@@ -216,9 +228,9 @@ module Appium
|
|
216
228
|
# @core.start_driver # Connect to 'http://127.0.0.1:8080/wd/hub' because of 'port: 8080'
|
217
229
|
#
|
218
230
|
# # Start iOS driver with .zip file over HTTP
|
219
|
-
# # 'desired_capabilities:' is also available instead of 'caps:'. Either is fine.
|
231
|
+
# # 'desired_capabilities:' or 'capabilities:' is also available instead of 'caps:'. Either is fine.
|
220
232
|
# opts = {
|
221
|
-
#
|
233
|
+
# capabilities: {
|
222
234
|
# platformName: :ios,
|
223
235
|
# platformVersion: '11.0',
|
224
236
|
# deviceName: 'iPhone Simulator',
|
@@ -340,9 +352,17 @@ module Appium
|
|
340
352
|
http_client_ops: { http_client: nil, open_timeout: 999_999, read_timeout: 999_999 })
|
341
353
|
@custom_url ||= server_url || "http://127.0.0.1:#{@port}/wd/hub"
|
342
354
|
|
343
|
-
|
344
|
-
|
345
|
-
|
355
|
+
@http_client = get_http_client http_client: http_client_ops.delete(:http_client),
|
356
|
+
open_timeout: http_client_ops.delete(:open_timeout),
|
357
|
+
read_timeout: http_client_ops.delete(:read_timeout)
|
358
|
+
|
359
|
+
if @enable_idempotency_header
|
360
|
+
if @http_client.instance_variable_defined? :@additional_headers
|
361
|
+
@http_client.additional_headers[Appium::Core::Base::Http::RequestHeaders::KEYS[:idempotency]] = SecureRandom.uuid
|
362
|
+
else
|
363
|
+
::Appium::Logger.warn 'No additional_headers attribute in this http client instance'
|
364
|
+
end
|
365
|
+
end
|
346
366
|
|
347
367
|
begin
|
348
368
|
# included https://github.com/SeleniumHQ/selenium/blob/43f8b3f66e7e01124eff6a5805269ee441f65707/rb/lib/selenium/webdriver/remote/driver.rb#L29
|
@@ -362,6 +382,11 @@ module Appium
|
|
362
382
|
raise "ERROR: Unable to connect to Appium. Is the server running on #{@custom_url}?"
|
363
383
|
end
|
364
384
|
|
385
|
+
if @http_client.instance_variable_defined? :@additional_headers
|
386
|
+
# We only need the key for a new session request. Should remove it for other following commands.
|
387
|
+
@http_client.additional_headers.delete Appium::Core::Base::Http::RequestHeaders::KEYS[:idempotency]
|
388
|
+
end
|
389
|
+
|
365
390
|
# If "automationName" is set only server side, this method set "automationName" attribute into @automation_name.
|
366
391
|
# Since @automation_name is set only client side before start_driver is called.
|
367
392
|
set_automation_name_if_nil
|
@@ -373,12 +398,14 @@ module Appium
|
|
373
398
|
|
374
399
|
private
|
375
400
|
|
376
|
-
def
|
377
|
-
|
401
|
+
def get_http_client(http_client: nil, open_timeout: nil, read_timeout: nil)
|
402
|
+
client = http_client || Appium::Core::Base::Http::Default.new
|
378
403
|
|
379
404
|
# open_timeout and read_timeout are explicit wait.
|
380
|
-
|
381
|
-
|
405
|
+
client.open_timeout = open_timeout if open_timeout
|
406
|
+
client.read_timeout = read_timeout if read_timeout
|
407
|
+
|
408
|
+
client
|
382
409
|
end
|
383
410
|
|
384
411
|
# Ignore setting default wait if the target driver has no implementation
|
@@ -475,25 +502,24 @@ module Appium
|
|
475
502
|
when :android
|
476
503
|
case automation_name
|
477
504
|
when :espresso
|
478
|
-
::Appium::Core::Android::Espresso::Bridge.for
|
505
|
+
::Appium::Core::Android::Espresso::Bridge.for self
|
479
506
|
when :uiautomator2
|
480
|
-
::Appium::Core::Android::Uiautomator2::Bridge.for
|
507
|
+
::Appium::Core::Android::Uiautomator2::Bridge.for self
|
481
508
|
else # default and UiAutomator
|
482
|
-
::Appium::Core::Android::Uiautomator1::Bridge.for
|
509
|
+
::Appium::Core::Android::Uiautomator1::Bridge.for self
|
483
510
|
end
|
484
511
|
when :ios, :tvos
|
485
512
|
case automation_name
|
486
513
|
when :xcuitest
|
487
|
-
::Appium::Core::Ios::Xcuitest::Bridge.for
|
514
|
+
::Appium::Core::Ios::Xcuitest::Bridge.for self
|
488
515
|
else # default and UIAutomation
|
489
|
-
::Appium::Core::Ios::Uiautomation::Bridge.for
|
516
|
+
::Appium::Core::Ios::Uiautomation::Bridge.for self
|
490
517
|
end
|
491
518
|
when :mac
|
492
519
|
# no Mac specific extentions
|
493
520
|
::Appium::Logger.debug('mac')
|
494
521
|
when :windows
|
495
|
-
|
496
|
-
::Appium::Logger.debug('windows')
|
522
|
+
::Appium::Core::Windows::Bridge.for self
|
497
523
|
when :tizen
|
498
524
|
# https://github.com/Samsung/appium-tizen-driver
|
499
525
|
::Appium::Logger.debug('tizen')
|
@@ -517,7 +543,10 @@ module Appium
|
|
517
543
|
def validate_keys(opts)
|
518
544
|
flatten_ops = flatten_hash_keys(opts)
|
519
545
|
|
520
|
-
|
546
|
+
# FIXME: Remove 'desired_capabilities' in the next major Selenium update
|
547
|
+
unless opts.member?(:caps) || opts.member?(:capabilities) || opts.member?(:desired_capabilities)
|
548
|
+
raise Error::NoCapabilityError
|
549
|
+
end
|
521
550
|
|
522
551
|
if !opts.member?(:appium_lib) && flatten_ops.member?(:appium_lib)
|
523
552
|
raise Error::CapabilityStructureError, 'Please check the value of appium_lib in the capability'
|
@@ -538,7 +567,8 @@ module Appium
|
|
538
567
|
|
539
568
|
# @private
|
540
569
|
def get_caps(opts)
|
541
|
-
|
570
|
+
# FIXME: Remove 'desired_capabilities' in the next major Selenium update
|
571
|
+
Core::Base::Capabilities.create_capabilities(opts[:caps] || opts[:capabilities] || opts[:desired_capabilities] || {})
|
542
572
|
end
|
543
573
|
|
544
574
|
# @private
|
@@ -569,6 +599,7 @@ module Appium
|
|
569
599
|
opts = Options.new appium_lib_opts
|
570
600
|
|
571
601
|
@custom_url ||= opts.custom_url # Keep existence capability if it's already provided
|
602
|
+
@enable_idempotency_header = opts.enable_idempotency_header
|
572
603
|
|
573
604
|
@default_wait = opts.default_wait
|
574
605
|
|
@@ -51,7 +51,7 @@ module Appium
|
|
51
51
|
#
|
52
52
|
|
53
53
|
# @since Appium 1.9.1
|
54
|
-
# @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: nil, force_restart: nil, video_type: 'mjpeg', video_fps: nil, time_limit: '180', video_quality:
|
54
|
+
# @!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, video_type: 'mjpeg', video_fps: nil, time_limit: '180', video_quality: nil, video_scale: nil, video_filters: nil, pixel_format: nil)
|
55
55
|
#
|
56
56
|
# Record the display of devices running iOS Simulator since Xcode 9 or real devices since iOS 11
|
57
57
|
# (ffmpeg utility is required: 'brew install ffmpeg').
|
@@ -68,6 +68,11 @@ module Appium
|
|
68
68
|
# @param [String] user The name of the user for the remote authentication.
|
69
69
|
# @param [String] pass The password for the remote authentication.
|
70
70
|
# @param [String] method The http multipart upload method name. The 'PUT' one is used by default.
|
71
|
+
# @param [String] file_field_name The name of the form field containing the binary payload in multipart/form-data
|
72
|
+
# requests since Appium 1.18.0. Defaults to 'file'.
|
73
|
+
# @param [Array<Hash, Array<String>>] form_fields The form fields mapping in multipart/form-data requests since Appium 1.18.0.
|
74
|
+
# If any entry has the same key in this mapping, then it is going to be ignored.
|
75
|
+
# @param [Hash] headers The additional headers in multipart/form-data requests since Appium 1.18.0.
|
71
76
|
# @param [Boolean] force_restart Whether to try to catch and upload/return the currently running screen recording
|
72
77
|
# (+false+, the default setting on server) or ignore the result of it
|
73
78
|
# and start a new recording immediately (+true+).
|
@@ -91,6 +96,8 @@ module Appium
|
|
91
96
|
# - https://www.reddit.com/r/linux4noobs/comments/671z6b/width_not_divisible_by_2_error_when_using_ffmpeg/
|
92
97
|
# @param [String] pixel_format Output pixel format. Run +ffmpeg -pix_fmts+ to list possible values.
|
93
98
|
# For Quicktime compatibility, set to "yuv420p" along with videoType: "libx264".
|
99
|
+
# @return [String] Base64 encoded content of the recorded media file or an empty string
|
100
|
+
# if the file has been successfully uploaded to a remote location (depends on the actual options)
|
94
101
|
#
|
95
102
|
# @example
|
96
103
|
#
|
@@ -32,9 +32,11 @@ module Appium
|
|
32
32
|
|
33
33
|
::Appium::Core::Device.add_endpoint_method(:get_performance_record) do
|
34
34
|
def get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor',
|
35
|
-
remote_path: nil, user: nil, pass: nil, method: 'PUT'
|
35
|
+
remote_path: nil, user: nil, pass: nil, method: 'PUT',
|
36
|
+
file_field_name: nil, form_fields: nil, headers: nil)
|
36
37
|
option = ::Appium::Core::Base::Device::ScreenRecord.new(
|
37
|
-
remote_path: remote_path, user: user, pass: pass, method: method
|
38
|
+
remote_path: remote_path, user: user, pass: pass, method: method,
|
39
|
+
file_field_name: file_field_name, form_fields: form_fields, headers: headers
|
38
40
|
).upload_option
|
39
41
|
|
40
42
|
option[:profileName] = profile_name
|
@@ -20,18 +20,20 @@ module Appium
|
|
20
20
|
module Screen
|
21
21
|
def self.add_methods
|
22
22
|
::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
|
23
|
-
|
24
|
-
|
25
|
-
video_type: 'mjpeg', time_limit: '180', video_quality:
|
23
|
+
def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
|
24
|
+
file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil,
|
25
|
+
video_type: 'mjpeg', time_limit: '180', video_quality: nil,
|
26
26
|
video_fps: nil, video_scale: nil, video_filters: nil, pixel_format: nil)
|
27
27
|
option = ::Appium::Core::Base::Device::ScreenRecord.new(
|
28
|
-
remote_path: remote_path, user: user, pass: pass, method: method,
|
28
|
+
remote_path: remote_path, user: user, pass: pass, method: method,
|
29
|
+
file_field_name: file_field_name, form_fields: form_fields, headers: headers,
|
30
|
+
force_restart: force_restart
|
29
31
|
).upload_option
|
30
32
|
|
31
33
|
option[:videoType] = video_type
|
32
34
|
option[:timeLimit] = time_limit
|
33
|
-
option[:videoQuality] = video_quality
|
34
35
|
|
36
|
+
option[:videoQuality] = video_quality unless video_quality.nil?
|
35
37
|
option[:videoFps] = video_fps unless video_fps.nil?
|
36
38
|
option[:videoScale] = video_scale unless video_scale.nil?
|
37
39
|
option[:videoFilters] = video_filters unless video_filters.nil?
|
@@ -39,7 +41,6 @@ module Appium
|
|
39
41
|
|
40
42
|
execute(:start_recording_screen, {}, { options: option })
|
41
43
|
end
|
42
|
-
# rubocop:enable Metrics/ParameterLists
|
43
44
|
end
|
44
45
|
end
|
45
46
|
end # module Screen
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module Appium
|
16
16
|
module Core
|
17
|
-
VERSION = '3.
|
18
|
-
DATE = '2020-
|
17
|
+
VERSION = '3.9.0' unless defined? ::Appium::Core::VERSION
|
18
|
+
DATE = '2020-05-31' unless defined? ::Appium::Core::DATE
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,16 @@
|
|
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 'windows/device'
|
16
|
+
require_relative 'windows/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 Windows
|
18
|
+
module Bridge
|
19
|
+
def self.for(target)
|
20
|
+
target.extend Appium::Core::Windows::Device
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,86 @@
|
|
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 Windows
|
20
|
+
module Device
|
21
|
+
extend Forwardable
|
22
|
+
|
23
|
+
# rubocop:disable Metrics/LineLength
|
24
|
+
|
25
|
+
# @since Appium 1.18.0
|
26
|
+
# @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil, time_limit: nil, fps: nil, preset: nil, video_filter: nil, capture_clicks: nil, capture_cursor: nil, audio_input: nil)
|
27
|
+
#
|
28
|
+
# Record the display in background while the automated test is running.
|
29
|
+
# This method requires FFMPEG (https://www.ffmpeg.org/download.html) to be installed and present in PATH.
|
30
|
+
# The resulting video uses H264 codec and is ready to be played by media players built-in into web browsers.
|
31
|
+
#
|
32
|
+
# @param [Boolean] force_restart Whether to stop existing recording process forcefully and start a new recording process.
|
33
|
+
# @param [String] time_limit Recording time. 600 seconds is by default.
|
34
|
+
# @param [Number|String] fps The count of frames per second in the resulting video.
|
35
|
+
# Increasing fps value also increases the size of the resulting
|
36
|
+
# video file and the CPU usage. Defaults to 15.
|
37
|
+
# @param [String] preset A preset is a collection of options that will provide a certain encoding speed to compression ratio.
|
38
|
+
# A slower preset will provide better compression (compression is quality per filesize).
|
39
|
+
# This means that, for example, if you target a certain file size or constant bit rate, you will
|
40
|
+
# achieve better quality with a slower preset. Read https://trac.ffmpeg.org/wiki/Encode/H.264
|
41
|
+
# for more details.
|
42
|
+
# One of the supported encoding presets. Possible values are:
|
43
|
+
# - ultrafast
|
44
|
+
# - superfast
|
45
|
+
# - veryfast (default)
|
46
|
+
# - faster
|
47
|
+
# - fast
|
48
|
+
# - medium
|
49
|
+
# - slow
|
50
|
+
# - slower
|
51
|
+
# - veryslow
|
52
|
+
# @param [String] video_filter The video filter spec to apply for ffmpeg.
|
53
|
+
# See https://trac.ffmpeg.org/wiki/FilteringGuide for more details on the possible values.
|
54
|
+
# Example: Set it to +scale=ifnot(gte(iw\,1024)\,iw\,1024):-2+ in order to limit the video width
|
55
|
+
# to 1024px. The height will be adjusted automatically to match the actual screen aspect ratio.
|
56
|
+
# @param [Bool] capture_cursor Whether to capture the mouse cursor while recording the screen.
|
57
|
+
# Disabled by default.
|
58
|
+
# @param [Bool] capture_clicks Whether to capture the click gestures while recording the screen.
|
59
|
+
# Disabled by default.
|
60
|
+
# @param [String] audio_input If provided then the given audio input will be used to record the computer audio
|
61
|
+
# along with the desktop video. The list of available devices could be retrieved using
|
62
|
+
# +ffmpeg -list_devices true -f dshow -i dummy+ command.
|
63
|
+
# @return [String] Base64 encoded content of the recorded media file
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
#
|
67
|
+
# @driver.start_recording_screen
|
68
|
+
# @driver.start_recording_screen video_filter: 'scale=ifnot(gte(iw\,1024)\,iw\,1024):-2'
|
69
|
+
# @driver.start_recording_screen capture_cursor: true, capture_clicks: true, time_limit: '260'
|
70
|
+
#
|
71
|
+
|
72
|
+
# rubocop:enable Metrics/LineLength
|
73
|
+
|
74
|
+
####
|
75
|
+
## class << self
|
76
|
+
####
|
77
|
+
|
78
|
+
class << self
|
79
|
+
def extended(_mod)
|
80
|
+
Screen.add_methods
|
81
|
+
end
|
82
|
+
end # class << self
|
83
|
+
end # module Device
|
84
|
+
end # module Windows
|
85
|
+
end # module Core
|
86
|
+
end # module Appium
|
@@ -0,0 +1,43 @@
|
|
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 Windows
|
18
|
+
module Device
|
19
|
+
module Screen
|
20
|
+
def self.add_methods
|
21
|
+
::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
|
22
|
+
def start_recording_screen(force_restart: nil, time_limit: nil,
|
23
|
+
fps: nil, preset: nil, video_filter: nil,
|
24
|
+
capture_clicks: nil, capture_cursor: nil, audio_input: nil)
|
25
|
+
option = {}
|
26
|
+
option[:forceRestart] = force_restart unless force_restart.nil?
|
27
|
+
option[:timeLimit] = time_limit unless time_limit.nil?
|
28
|
+
option[:fps] = fps unless fps.nil?
|
29
|
+
option[:preset] = preset unless preset.nil?
|
30
|
+
option[:videoFilter] = video_filter unless video_filter.nil?
|
31
|
+
option[:captureClicks] = capture_clicks unless capture_clicks.nil?
|
32
|
+
option[:captureCursor] = capture_cursor unless capture_cursor.nil?
|
33
|
+
option[:audioInput] = audio_input unless audio_input.nil?
|
34
|
+
|
35
|
+
execute(:start_recording_screen, {}, { options: option })
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end # module Screen
|
40
|
+
end # module Device
|
41
|
+
end # module Windows
|
42
|
+
end # module Core
|
43
|
+
end # module Appium
|
data/release_notes.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
#### v3.9.0 2020-05-31
|
2
|
+
|
3
|
+
- [f306188](https://github.com/appium/ruby_lib_core/commit/f306188102222088fbd31b0b9249c6a39ddd074f) Release 3.9.0
|
4
|
+
- [30c6529](https://github.com/appium/ruby_lib_core/commit/30c65299e4dffb9a2cea8b7a11b27cfcba294707) ci: run with Xcode 11.5 (#265)
|
5
|
+
- [a10f2d1](https://github.com/appium/ruby_lib_core/commit/a10f2d15ef83e9ce7003b88ec1c0923c922974ea) feat: allow :capabilities as argument (#266)
|
6
|
+
|
7
|
+
|
8
|
+
#### v3.8.0 2020-05-17
|
9
|
+
|
10
|
+
- [8986a54](https://github.com/appium/ruby_lib_core/commit/8986a5400d6a3575b7413f15bb61de09af2ec789) Release 3.8.0
|
11
|
+
- [2379f9a](https://github.com/appium/ruby_lib_core/commit/2379f9a69b43e8c2d2b584ac1e56d3a1aea5e85b) refactor: move idempotency in driver (#264)
|
12
|
+
- [8103619](https://github.com/appium/ruby_lib_core/commit/8103619313328064df516e7094e2c8a6e1e9719c) fix: x-idempotency-key only for a new session (#263)
|
13
|
+
- [971f912](https://github.com/appium/ruby_lib_core/commit/971f912a6b4d8e28896d146939c9e5b86dd4b1e0) feat: Add options for start_recording_screen (#261)
|
14
|
+
- [11f840a](https://github.com/appium/ruby_lib_core/commit/11f840a2945b0376bb3ad762e9b2eefd0aace3b4) ci: add wait
|
15
|
+
- [4931f4e](https://github.com/appium/ruby_lib_core/commit/4931f4e318e94f9253edd649757f5c774c3404a7) ci: tweak flaky case
|
16
|
+
- [cb6ef1a](https://github.com/appium/ruby_lib_core/commit/cb6ef1a74dae7200952630076dd58af6bb9500ec) Merge branch 'master' of github.com:appium/ruby_lib_core
|
17
|
+
- [9117de2](https://github.com/appium/ruby_lib_core/commit/9117de2674f018cfe8e10d9dadc188af846e6be4) ci: relax tests for uia2
|
18
|
+
|
19
|
+
|
20
|
+
#### v3.7.0 2020-04-18
|
21
|
+
|
22
|
+
- [5ffe630](https://github.com/appium/ruby_lib_core/commit/5ffe630e670943c6f6f60c0e331cdab4685e31c7) Release 3.7.0
|
23
|
+
- [e561c8d](https://github.com/appium/ruby_lib_core/commit/e561c8db5b00f1132391f8ea79133c295d39a90b) feat: Add chrome devtools endpoints (#260)
|
24
|
+
- [73cf85f](https://github.com/appium/ruby_lib_core/commit/73cf85fd6ab5bdfb9df7833a713b8d4df3e51a70) test: add w3c send_keys action
|
25
|
+
- [b1c36fa](https://github.com/appium/ruby_lib_core/commit/b1c36fa538c145326dc50f49ab4d738478e5e0ac) fix typo
|
26
|
+
- [350ba7b](https://github.com/appium/ruby_lib_core/commit/350ba7bdafd567dabc9bd54ab1476740c6f54a20) feat: Add x idempotency header (#259)
|
27
|
+
- [94f16d8](https://github.com/appium/ruby_lib_core/commit/94f16d83909a2fb6111d281a00c0b911a00bb23c) ci: bump to Xcode 11.4 and iOS 13.4 (#257)
|
28
|
+
- [53b7191](https://github.com/appium/ruby_lib_core/commit/53b7191b89e61d11b06628d710a13dac5ca9dfaf) ci: add -accel auto
|
29
|
+
|
30
|
+
|
31
|
+
#### v3.6.1 2020-03-16
|
32
|
+
|
33
|
+
- [46a2277](https://github.com/appium/ruby_lib_core/commit/46a2277e792cc583c9978db3ebd548bfee343942) Release 3.6.1
|
34
|
+
- [2e28b32](https://github.com/appium/ruby_lib_core/commit/2e28b3205e83358e0aaba79d844c30ac7e29917d) fix: Tweak screen option (#256)
|
35
|
+
|
36
|
+
|
37
|
+
#### v3.6.0 2020-03-15
|
38
|
+
|
39
|
+
- [260d45e](https://github.com/appium/ruby_lib_core/commit/260d45e28a36e99e3dedbe8d41e2703c4d3fbdc8) Release 3.6.0
|
40
|
+
- [e67abd5](https://github.com/appium/ruby_lib_core/commit/e67abd53d188f0a77adb15882dd2151b1c0132e8) feat: add Windows screen record (#255)
|
41
|
+
- [164fd72](https://github.com/appium/ruby_lib_core/commit/164fd7205944a06055427000b7371311f9dc20a3) ci: Bump ci macOS version (#254)
|
42
|
+
- [7200f25](https://github.com/appium/ruby_lib_core/commit/7200f255bc5eb74a8fe8b3667db1c004a55092cf) update rubocop yml
|
43
|
+
- [2fe8c0a](https://github.com/appium/ruby_lib_core/commit/2fe8c0ae01fa3fd2653cd83415f512931adac655) Update webmock requirement from ~> 3.4.0 to ~> 3.8.0 (#253)
|
44
|
+
- [32dc172](https://github.com/appium/ruby_lib_core/commit/32dc17289f5c130b7f949bfca415e10fa4fe87d7) Update rubocop requirement from = 0.61.0 to = 0.68.1 (#251)
|
45
|
+
- [7b4402e](https://github.com/appium/ruby_lib_core/commit/7b4402e3c59d3cfee600c6375494eecb2c7c6ddf) Update rake requirement from ~> 12.0 to ~> 13.0 (#252)
|
46
|
+
|
47
|
+
|
1
48
|
#### v3.5.0 2020-01-11
|
2
49
|
|
3
50
|
- [79174fd](https://github.com/appium/ruby_lib_core/commit/79174fd6821398eacc32a897c1161140087b11e6) Release 3.5.0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_lib_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuaki MATSUO
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -64,14 +64,14 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
67
|
+
version: '13.0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '13.0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: yard
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,28 +120,28 @@ dependencies:
|
|
120
120
|
requirements:
|
121
121
|
- - "~>"
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: 3.
|
123
|
+
version: 3.8.0
|
124
124
|
type: :development
|
125
125
|
prerelease: false
|
126
126
|
version_requirements: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
128
|
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version: 3.
|
130
|
+
version: 3.8.0
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
132
|
name: rubocop
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - '='
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: 0.
|
137
|
+
version: 0.68.1
|
138
138
|
type: :development
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - '='
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: 0.
|
144
|
+
version: 0.68.1
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: appium_thor
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -314,6 +314,10 @@ files:
|
|
314
314
|
- lib/appium_lib_core/ios_xcuitest.rb
|
315
315
|
- lib/appium_lib_core/patch.rb
|
316
316
|
- lib/appium_lib_core/version.rb
|
317
|
+
- lib/appium_lib_core/windows.rb
|
318
|
+
- lib/appium_lib_core/windows/bridge.rb
|
319
|
+
- lib/appium_lib_core/windows/device.rb
|
320
|
+
- lib/appium_lib_core/windows/device/screen.rb
|
317
321
|
- release_notes.md
|
318
322
|
- script/commands.rb
|
319
323
|
homepage: https://github.com/appium/ruby_lib_core/
|
@@ -335,7 +339,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
339
|
- !ruby/object:Gem::Version
|
336
340
|
version: '0'
|
337
341
|
requirements: []
|
338
|
-
rubygems_version: 3.0.
|
342
|
+
rubygems_version: 3.0.1
|
339
343
|
signing_key:
|
340
344
|
specification_version: 4
|
341
345
|
summary: Minimal Ruby library for Appium.
|