appium_lib 9.3.0 → 9.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/android_tests/appium.txt +1 -0
- data/android_tests/lib/android/specs/common/command.rb +2 -0
- data/android_tests/lib/android/specs/common/device.rb +10 -1
- data/android_tests/lib/android/specs/driver.rb +46 -13
- data/appium_lib.gemspec +1 -0
- data/docs/android_docs.md +265 -226
- data/docs/docs.md +12 -19
- data/docs/ios_docs.md +279 -240
- data/ios_tests/appium.txt +1 -0
- data/ios_tests/lib/ios/specs/driver.rb +46 -8
- data/lib/appium_lib/common/command.rb +36 -34
- data/lib/appium_lib/common/version.rb +2 -2
- data/lib/appium_lib/device/device.rb +28 -0
- data/lib/appium_lib/driver.rb +9 -5
- data/readme.md +2 -0
- data/release_notes.md +12 -0
- metadata +17 -3
data/ios_tests/appium.txt
CHANGED
@@ -30,18 +30,37 @@ describe 'driver' do
|
|
30
30
|
assert_equal expected, actual
|
31
31
|
end
|
32
32
|
|
33
|
+
t 'verify Appium::Driver::Capabilities.init_caps_for_appium' do
|
34
|
+
expected_app = File.absolute_path('UICatalog.app')
|
35
|
+
caps = ::Appium::Driver::Capabilities.init_caps_for_appium(platformName: 'ios',
|
36
|
+
platformVersion: '10.2',
|
37
|
+
automationName: 'XCUITest',
|
38
|
+
deviceName: 'iPhone Simulator',
|
39
|
+
app: expected_app,
|
40
|
+
some_capability: 'some_capability')
|
41
|
+
caps_with_json = JSON.parse(caps.to_json)
|
42
|
+
caps_with_json['platformName'].must_equal 'ios'
|
43
|
+
caps_with_json['platformVersion'].must_equal '10.2'
|
44
|
+
caps_with_json['app'].must_equal expected_app
|
45
|
+
caps_with_json['automationName'].must_equal 'XCUITest'
|
46
|
+
caps_with_json['deviceName'].must_equal 'iPhone Simulator'
|
47
|
+
caps_with_json['someCapability'].must_equal 'some_capability'
|
48
|
+
|
49
|
+
caps[:platformName].must_equal 'ios'
|
50
|
+
caps[:platformVersion].must_equal '10.2'
|
51
|
+
caps[:app].must_equal expected_app
|
52
|
+
caps[:automationName].must_equal 'XCUITest'
|
53
|
+
caps[:deviceName].must_equal 'iPhone Simulator'
|
54
|
+
caps[:some_capability].must_equal 'some_capability'
|
55
|
+
end
|
56
|
+
|
33
57
|
describe 'Appium::Driver attributes' do
|
34
58
|
t 'verify all attributes' do
|
35
59
|
actual = driver_attributes
|
36
60
|
caps_app_for_teardown = actual[:caps][:app]
|
37
61
|
expected_app = File.absolute_path('UICatalog.app')
|
38
|
-
|
39
|
-
|
40
|
-
automationName: 'XCUITest',
|
41
|
-
deviceName: 'iPhone Simulator',
|
42
|
-
app: expected_app)
|
43
|
-
expected = { caps: expected_caps,
|
44
|
-
automation_name: 'XCUITest',
|
62
|
+
|
63
|
+
expected = { automation_name: 'XCUITest',
|
45
64
|
custom_url: false,
|
46
65
|
export_session: false,
|
47
66
|
default_wait: 30,
|
@@ -54,7 +73,26 @@ describe 'driver' do
|
|
54
73
|
wait_timeout: 20, # defined in appium.txt
|
55
74
|
wait_interval: 1 } # defined in appium.txt
|
56
75
|
|
57
|
-
|
76
|
+
# actual[:caps].to_json send to Appium server
|
77
|
+
caps_with_json = JSON.parse(actual[:caps].to_json)
|
78
|
+
caps_with_json['platformName'].must_equal 'ios'
|
79
|
+
caps_with_json['platformVersion'].must_equal '10.2'
|
80
|
+
caps_with_json['app'].must_equal expected_app
|
81
|
+
caps_with_json['automationName'].must_equal 'XCUITest'
|
82
|
+
caps_with_json['deviceName'].must_equal 'iPhone Simulator'
|
83
|
+
caps_with_json['someCapability'].must_equal 'some_capability'
|
84
|
+
|
85
|
+
actual[:caps][:platformName].must_equal 'ios'
|
86
|
+
actual[:caps][:platformVersion].must_equal '10.2'
|
87
|
+
actual[:caps][:app].must_equal expected_app
|
88
|
+
actual[:caps][:automationName].must_equal 'XCUITest'
|
89
|
+
actual[:caps][:deviceName].must_equal 'iPhone Simulator'
|
90
|
+
actual[:caps][:some_capability].must_equal 'some_capability'
|
91
|
+
|
92
|
+
dup_actual = actual.dup
|
93
|
+
dup_actual.delete(:caps)
|
94
|
+
|
95
|
+
if dup_actual != expected
|
58
96
|
diff = HashDiff.diff expected, actual
|
59
97
|
diff = "diff (expected, actual):\n#{diff}"
|
60
98
|
|
@@ -3,52 +3,54 @@ module Appium
|
|
3
3
|
module Commands
|
4
4
|
COMMAND_NO_ARG = {
|
5
5
|
# common
|
6
|
-
shake:
|
7
|
-
launch_app:
|
8
|
-
close_app:
|
9
|
-
reset:
|
10
|
-
device_locked?:
|
6
|
+
shake: [:post, 'session/:session_id/appium/device/shake'.freeze],
|
7
|
+
launch_app: [:post, 'session/:session_id/appium/app/launch'.freeze],
|
8
|
+
close_app: [:post, 'session/:session_id/appium/app/close'.freeze],
|
9
|
+
reset: [:post, 'session/:session_id/appium/app/reset'.freeze],
|
10
|
+
device_locked?: [:post, 'session/:session_id/appium/device/is_locked'.freeze],
|
11
11
|
|
12
12
|
# Android
|
13
|
-
open_notifications:
|
14
|
-
toggle_airplane_mode:
|
15
|
-
current_activity:
|
16
|
-
get_network_connection:
|
13
|
+
open_notifications: [:post, 'session/:session_id/appium/device/open_notifications'.freeze],
|
14
|
+
toggle_airplane_mode: [:post, 'session/:session_id/appium/device/toggle_airplane_mode'.freeze],
|
15
|
+
current_activity: [:get, 'session/:session_id/appium/device/current_activity'.freeze],
|
16
|
+
get_network_connection: [:get, 'session/:session_id/network_connection'.freeze],
|
17
|
+
get_performance_data_types: [:post, 'session/:session_id/appium/performanceData/types'.freeze],
|
17
18
|
|
18
19
|
# iOS
|
19
|
-
device_time:
|
20
|
-
current_context:
|
20
|
+
device_time: [:get, 'session/:session_id/appium/device/system_time'.freeze],
|
21
|
+
current_context: [:get, 'session/:session_id/context'.freeze]
|
21
22
|
}.freeze
|
22
23
|
|
23
24
|
COMMAND = {
|
24
25
|
# common
|
25
|
-
available_contexts:
|
26
|
-
set_context:
|
27
|
-
app_strings:
|
28
|
-
lock:
|
29
|
-
install_app:
|
30
|
-
remove_app:
|
31
|
-
app_installed?:
|
32
|
-
background_app:
|
33
|
-
hide_keyboard:
|
34
|
-
press_keycode:
|
35
|
-
long_press_keycode:
|
36
|
-
set_immediate_value:
|
37
|
-
push_file:
|
38
|
-
pull_file:
|
39
|
-
pull_folder:
|
40
|
-
get_settings:
|
41
|
-
update_settings:
|
42
|
-
touch_actions:
|
43
|
-
multi_touch:
|
26
|
+
available_contexts: [:get, 'session/:session_id/contexts'.freeze],
|
27
|
+
set_context: [:post, 'session/:session_id/context'.freeze],
|
28
|
+
app_strings: [:post, 'session/:session_id/appium/app/strings'.freeze],
|
29
|
+
lock: [:post, 'session/:session_id/appium/device/lock'.freeze],
|
30
|
+
install_app: [:post, 'session/:session_id/appium/device/install_app'.freeze],
|
31
|
+
remove_app: [:post, 'session/:session_id/appium/device/remove_app'.freeze],
|
32
|
+
app_installed?: [:post, 'session/:session_id/appium/device/app_installed'.freeze],
|
33
|
+
background_app: [:post, 'session/:session_id/appium/app/background'.freeze],
|
34
|
+
hide_keyboard: [:post, 'session/:session_id/appium/device/hide_keyboard'.freeze],
|
35
|
+
press_keycode: [:post, 'session/:session_id/appium/device/press_keycode'.freeze],
|
36
|
+
long_press_keycode: [:post, 'session/:session_id/appium/device/long_press_keycode'.freeze],
|
37
|
+
set_immediate_value: [:post, 'session/:session_id/appium/element/:id/value'.freeze],
|
38
|
+
push_file: [:post, 'session/:session_id/appium/device/push_file'.freeze],
|
39
|
+
pull_file: [:post, 'session/:session_id/appium/device/pull_file'.freeze],
|
40
|
+
pull_folder: [:post, 'session/:session_id/appium/device/pull_folder'.freeze],
|
41
|
+
get_settings: [:get, 'session/:session_id/appium/settings'.freeze],
|
42
|
+
update_settings: [:post, 'session/:session_id/appium/settings'.freeze],
|
43
|
+
touch_actions: [:post, 'session/:session_id/touch/perform'.freeze],
|
44
|
+
multi_touch: [:post, 'session/:session_id/touch/multi/perform'.freeze],
|
44
45
|
|
45
46
|
# Android
|
46
|
-
start_activity:
|
47
|
-
end_coverage:
|
48
|
-
set_network_connection:
|
47
|
+
start_activity: [:post, 'session/:session_id/appium/device/start_activity'.freeze],
|
48
|
+
end_coverage: [:post, 'session/:session_id/appium/app/end_test_coverage'.freeze],
|
49
|
+
set_network_connection: [:post, 'session/:session_id/network_connection'.freeze],
|
50
|
+
get_performance_data: [:post, 'session/:session_id/appium/getPerformanceData'.freeze],
|
49
51
|
|
50
52
|
# iOS
|
51
|
-
touch_id:
|
53
|
+
touch_id: [:post, 'session/:session_id/appium/simulator/touch_id'.freeze]
|
52
54
|
}.merge(COMMAND_NO_ARG).merge(::Selenium::WebDriver::Remote::Bridge::COMMANDS).freeze
|
53
55
|
end
|
54
56
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Appium
|
2
2
|
# Version and Date are defined on the 'Appium' module, not 'Appium::Common'
|
3
|
-
VERSION = '9.3.
|
4
|
-
DATE = '2017-
|
3
|
+
VERSION = '9.3.1'.freeze unless defined? ::Appium::VERSION
|
4
|
+
DATE = '2017-02-05'.freeze unless defined? ::Appium::DATE
|
5
5
|
end
|
@@ -135,6 +135,26 @@ module Appium
|
|
135
135
|
# ```ruby
|
136
136
|
# set_immediate_value element, 'hello'
|
137
137
|
# ```
|
138
|
+
|
139
|
+
# @!method get_performance_data_types
|
140
|
+
# Get the information type of the system state which is supported to read such as
|
141
|
+
# cpu, memory, network, battery via adb commands.
|
142
|
+
# https://github.com/appium/appium-base-driver/blob/be29aec2318316d12b5c3295e924a5ba8f09b0fb/lib/mjsonwp/routes.js#L300
|
143
|
+
#
|
144
|
+
# ```ruby
|
145
|
+
# get_performance_data_types #=> ["cpuinfo", "batteryinfo", "networkinfo", "memoryinfo"]
|
146
|
+
# ```
|
147
|
+
|
148
|
+
# @!method get_performance_data
|
149
|
+
# Get the resource usage information of the application.
|
150
|
+
# https://github.com/appium/appium-base-driver/blob/be29aec2318316d12b5c3295e924a5ba8f09b0fb/lib/mjsonwp/routes.js#L303
|
151
|
+
# @param [String] package_name Package name
|
152
|
+
# @param [String] data_type Data type get with `get_performance_data_types`
|
153
|
+
# @param [String] data_read_timeout Command timeout. Default is 2.
|
154
|
+
#
|
155
|
+
# ```ruby
|
156
|
+
# get_performance_data package_name: package_name, data_type: data_type, data_read_timeout: 2
|
157
|
+
# ```
|
138
158
|
class << self
|
139
159
|
def extended(_mod)
|
140
160
|
extend_webdriver_with_forwardable
|
@@ -308,6 +328,14 @@ module Appium
|
|
308
328
|
end
|
309
329
|
end
|
310
330
|
|
331
|
+
add_endpoint_method(:get_performance_data) do
|
332
|
+
def get_performance_data(package_name:, data_type:, data_read_timeout: 1000)
|
333
|
+
execute :get_performance_data, {}, packageName: package_name,
|
334
|
+
dataType: data_type,
|
335
|
+
dataReadTimeout: data_read_timeout
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
311
339
|
add_touch_actions
|
312
340
|
add_ime_actions
|
313
341
|
extend_search_contexts
|
data/lib/appium_lib/driver.rb
CHANGED
@@ -55,7 +55,8 @@ end
|
|
55
55
|
module Appium
|
56
56
|
REQUIRED_VERSION_XCUITEST = '1.6.0'.freeze
|
57
57
|
|
58
|
-
# Load arbitrary text (toml format)
|
58
|
+
# Load arbitrary text ([toml format](https://github.com/toml-lang/toml))
|
59
|
+
# The toml is parsed by https://github.com/fbernier/tomlrb .
|
59
60
|
#
|
60
61
|
# ```
|
61
62
|
# [caps]
|
@@ -76,7 +77,7 @@ module Appium
|
|
76
77
|
raise 'opts must not be empty' if opts.empty?
|
77
78
|
|
78
79
|
toml = opts[:file]
|
79
|
-
raise 'Must pass file' unless toml
|
80
|
+
raise 'Must pass a capability file which has [caps] and [appium_lib]' unless toml
|
80
81
|
verbose = opts.fetch :verbose, false
|
81
82
|
|
82
83
|
Appium::Logger.info "appium settings path: #{toml}" if verbose
|
@@ -121,7 +122,7 @@ module Appium
|
|
121
122
|
|
122
123
|
File.exist?(file) ? file : nil
|
123
124
|
end
|
124
|
-
|
125
|
+
file_paths.compact! # remove nils
|
125
126
|
|
126
127
|
files = []
|
127
128
|
|
@@ -251,6 +252,9 @@ module Appium
|
|
251
252
|
# except for browser_name, default capability is equal to ::Selenium::WebDriver::Remote::Capabilities.firefox
|
252
253
|
# Because Selenium::WebDriver::Remote::Bridge uses Capabilities.firefox by default
|
253
254
|
# https://github.com/SeleniumHQ/selenium/blob/selenium-3.0.1/rb/lib/selenium/webdriver/remote/bridge.rb#L67
|
255
|
+
# @param [Hash] opts_caps Capabilities for Appium server. All capability keys are converted to lowerCamelCase when
|
256
|
+
# this client sends capabilities to Appium server as JSON format.
|
257
|
+
# @return [Selenium::WebDriver::Remote::Capabilities] Return instance of Selenium::WebDriver::Remote::Capabilities
|
254
258
|
def self.init_caps_for_appium(opts_caps = {})
|
255
259
|
default_caps_opts_firefox = {
|
256
260
|
javascript_enabled: true,
|
@@ -281,9 +285,9 @@ module Appium
|
|
281
285
|
# This value is independent of what the server is using
|
282
286
|
# @return [Integer]
|
283
287
|
attr_reader :default_wait
|
284
|
-
# Username for use on Sauce Labs
|
288
|
+
# Username for use on Sauce Labs. Set `false` to disable Sauce, even when SAUCE_USERNAME is in ENV.
|
285
289
|
attr_accessor :sauce_username
|
286
|
-
# Access Key for use on Sauce Labs
|
290
|
+
# Access Key for use on Sauce Labs. Set `false` to disable Sauce, even when SAUCE_ACCESS_KEY is in ENV.
|
287
291
|
attr_accessor :sauce_access_key
|
288
292
|
# Appium's server port
|
289
293
|
attr_accessor :appium_port
|
data/readme.md
CHANGED
@@ -45,6 +45,8 @@ gem install --no-rdoc --no-ri appium_lib
|
|
45
45
|
- `SAUCE_USERNAME` Sauce username
|
46
46
|
- `SAUCE_ACCESS_KEY` Sauce API key
|
47
47
|
|
48
|
+
(Note: If these variables are set, all tests will use Sauce Labs unless over-ridden in configuration.)
|
49
|
+
|
48
50
|
#### Troubleshooting
|
49
51
|
|
50
52
|
1. Does `adb kill-server; adb devices` list an active Android device?
|
data/release_notes.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
#### v9.3.0 2017-01-22
|
2
|
+
|
3
|
+
- [a1c2872](https://github.com/appium/ruby_lib/commit/a1c287296c9eace08ef19449998fba7229b65697) Release 9 3 0 (#474)
|
4
|
+
- [23d937a](https://github.com/appium/ruby_lib/commit/23d937a60da55c2d95ccbbda07ad23bda1b53a7b) update changelogs for v9.3.0 (#472)
|
5
|
+
- [34803ef](https://github.com/appium/ruby_lib/commit/34803ef6b7b94df9ef4e147ba8fec5c1d2cfaada) arrange docs (#470)
|
6
|
+
- [c1106aa](https://github.com/appium/ruby_lib/commit/c1106aaa6f48a4ed22dc1a7e55c9c4119cdef15c) fix returning only visible elements (#465)
|
7
|
+
- [0104a87](https://github.com/appium/ruby_lib/commit/0104a87fad933598bb2b8ac1174319857494ba21) add capability to be able to set default timeout/interval for wait/wait_true (#468)
|
8
|
+
- [1372e64](https://github.com/appium/ruby_lib/commit/1372e6453536eb64829825b5bf405ad0f11a9a46) fix typo (#467)
|
9
|
+
- [a5ddd4a](https://github.com/appium/ruby_lib/commit/a5ddd4aa1d5f009b9024ee5aa5434805ba73895c) fix swipe, pinch, zoom (#466)
|
10
|
+
- [a1c2e9e](https://github.com/appium/ruby_lib/commit/a1c2e9e815e9f85c929da857e26f419629d760df) fix appium server's version check (#464)
|
11
|
+
|
12
|
+
|
1
13
|
#### v9.2.0 2017-01-09
|
2
14
|
|
3
15
|
- [958ae3e](https://github.com/appium/ruby_lib/commit/958ae3e2fc84b78191baf22e967c8a2fb7eded22) Release 9 2 0 (#460)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.3.
|
4
|
+
version: 9.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- code@bootstraponline.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -216,6 +216,20 @@ dependencies:
|
|
216
216
|
- - "<"
|
217
217
|
- !ruby/object:Gem::Version
|
218
218
|
version: 2.2.0
|
219
|
+
- !ruby/object:Gem::Dependency
|
220
|
+
name: pry
|
221
|
+
requirement: !ruby/object:Gem::Requirement
|
222
|
+
requirements:
|
223
|
+
- - ">="
|
224
|
+
- !ruby/object:Gem::Version
|
225
|
+
version: '0'
|
226
|
+
type: :development
|
227
|
+
prerelease: false
|
228
|
+
version_requirements: !ruby/object:Gem::Requirement
|
229
|
+
requirements:
|
230
|
+
- - ">="
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
version: '0'
|
219
233
|
description: Ruby library for Appium.
|
220
234
|
email:
|
221
235
|
- code@bootstraponline.com
|
@@ -396,7 +410,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
396
410
|
version: '0'
|
397
411
|
requirements: []
|
398
412
|
rubyforge_project:
|
399
|
-
rubygems_version: 2.6.
|
413
|
+
rubygems_version: 2.6.8
|
400
414
|
signing_key:
|
401
415
|
specification_version: 4
|
402
416
|
summary: Ruby library for Appium
|