appium_lib 9.3.4 → 9.3.5
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/CHANGELOG.md +18 -0
- data/android_tests/lib/android/specs/android/element/generic.rb +13 -2
- data/android_tests/lib/android/specs/common/command.rb +3 -0
- data/android_tests/lib/android/specs/common/device.rb +12 -0
- data/android_tests/lib/android/specs/common/device_touchaction.rb +3 -1
- data/docs/android_docs.md +286 -229
- data/docs/ios_docs.md +314 -243
- data/docs/ios_xcuitest.md +7 -0
- data/ios_tests/lib/ios/specs/device/device.rb +23 -3
- data/ios_tests/lib/ios/specs/ios/mobile_methods.rb +20 -0
- data/lib/appium_lib/android/element/generic.rb +14 -10
- data/lib/appium_lib/android/helper.rb +5 -5
- data/lib/appium_lib/common/command.rb +3 -0
- data/lib/appium_lib/common/version.rb +2 -2
- data/lib/appium_lib/device/device.rb +25 -1
- data/lib/appium_lib/device/multi_touch.rb +3 -0
- data/lib/appium_lib/device/touch_actions.rb +10 -0
- data/lib/appium_lib/ios/mobile_methods.rb +14 -0
- data/release_notes.md +11 -0
- metadata +3 -2
data/docs/ios_xcuitest.md
CHANGED
@@ -53,6 +53,13 @@ textfield(value) # Return a XCUIElementTypeSecureTextField or XCUIElementTypeTex
|
|
53
53
|
finds_exact(value) # Return any elements include `value` as its name attributes.
|
54
54
|
```
|
55
55
|
|
56
|
+
### with Class Chain
|
57
|
+
- require Appium 1.6.4+
|
58
|
+
- https://github.com/appium/appium-xcuitest-driver/pull/391
|
59
|
+
- https://github.com/appium/java-client/pull/599/files
|
60
|
+
- WebDriverAgent
|
61
|
+
- https://github.com/facebook/WebDriverAgent/wiki/Queries
|
62
|
+
|
56
63
|
### with XPath
|
57
64
|
- It is better to avoid XPath strategy.
|
58
65
|
- https://github.com/appium/appium/blob/v1.6.2/docs/en/advanced-concepts/migrating-to-xcuitest.md#xpath-locator-strategy
|
@@ -54,7 +54,10 @@ describe 'device/device' do
|
|
54
54
|
|
55
55
|
t 'background_app homescreen' do
|
56
56
|
background_app(-1) # background_app(nil) should work as same.
|
57
|
-
|
57
|
+
|
58
|
+
screen.must_equal 'UICatalog'
|
59
|
+
# TODO: Should update this assert.
|
60
|
+
# screen.must_raise ::Selenium::WebDriver::Error::NoSuchElementError
|
58
61
|
end
|
59
62
|
|
60
63
|
t 'reset' do
|
@@ -80,13 +83,30 @@ describe 'device/device' do
|
|
80
83
|
end
|
81
84
|
|
82
85
|
t 'action_chain' do
|
83
|
-
Appium::TouchAction.new.press(element:
|
86
|
+
Appium::TouchAction.new.press(element: text(app_strings['ButtonsExplain'])).perform
|
84
87
|
wait { id 'ArrowButton' } # successfully transitioned to buttons page
|
85
88
|
go_back
|
86
89
|
end
|
87
90
|
|
88
91
|
t 'swipe' do
|
89
|
-
swipe
|
92
|
+
touch_action = swipe(start_x: 75, start_y: 500, offset_x: 75, offset_y: 20, duration: 500)
|
93
|
+
touch_action.actions.must_equal []
|
94
|
+
|
95
|
+
touch_action = Appium::TouchAction.new.swipe(start_x: 75, start_y: 500, offset_x: 75, offset_y: 20, duration: 500)
|
96
|
+
|
97
|
+
touch_action.actions[0][:action].must_equal :press
|
98
|
+
touch_action.actions[0][:options].must_equal(x: 75, y: 500)
|
99
|
+
|
100
|
+
touch_action.actions[1][:action].must_equal :wait,
|
101
|
+
touch_action.actions[1][:options].must_equal(ms: 500)
|
102
|
+
|
103
|
+
touch_action.actions[2][:action].must_equal :moveTo
|
104
|
+
touch_action.actions[2][:options].must_equal(x: 75, y: 20)
|
105
|
+
|
106
|
+
touch_action.actions[3][:action].must_equal :release
|
107
|
+
|
108
|
+
touch_action.perform
|
109
|
+
touch_action.actions.must_equal []
|
90
110
|
end
|
91
111
|
|
92
112
|
t 'pull_file' do
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# rake ios[ios/mobile_methods]
|
2
|
+
describe 'ios/mobile_methods' do
|
3
|
+
def before_first
|
4
|
+
screen.must_equal catalog
|
5
|
+
end
|
6
|
+
|
7
|
+
t 'an element with class chain' do
|
8
|
+
element = find_element :class_chain, 'XCUIElementTypeWindow/*/*/XCUIElementTypeStaticText'
|
9
|
+
|
10
|
+
element.name.must_equal catalog
|
11
|
+
end
|
12
|
+
|
13
|
+
t 'elements with class chain' do
|
14
|
+
elements = find_elements :class_chain, 'XCUIElementTypeWindow/*/*'
|
15
|
+
|
16
|
+
elements.size.must_equal 2
|
17
|
+
elements[0].name.must_equal catalog
|
18
|
+
elements[1].name.must_be_nil
|
19
|
+
end
|
20
|
+
end
|
@@ -29,30 +29,34 @@ module Appium
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# @private
|
32
|
-
def scroll_uiselector(content)
|
33
|
-
"new UiScrollable(new UiSelector().scrollable(true).instance(
|
32
|
+
def scroll_uiselector(content, index = 0)
|
33
|
+
"new UiScrollable(new UiSelector().scrollable(true).instance(#{index})).scrollIntoView(#{content}.instance(0));"
|
34
34
|
end
|
35
35
|
|
36
36
|
# Scroll to the first element containing target text or description.
|
37
|
-
# @param text [String] the text to search for in the text value and content description
|
37
|
+
# @param text [String] the text or resourceId to search for in the text value and content description
|
38
|
+
# @param scrollable_index [Integer] the index for scrollable views.
|
38
39
|
# @return [Element] the element scrolled to
|
39
|
-
def scroll_to(text)
|
40
|
+
def scroll_to(text, scrollable_index = 0)
|
40
41
|
text = %("#{text}")
|
41
42
|
|
42
|
-
args = scroll_uiselector("new UiSelector().textContains(#{text})") +
|
43
|
-
scroll_uiselector("new UiSelector().descriptionContains(#{text})")
|
43
|
+
args = scroll_uiselector("new UiSelector().textContains(#{text})", scrollable_index) +
|
44
|
+
scroll_uiselector("new UiSelector().descriptionContains(#{text})", scrollable_index) +
|
45
|
+
scroll_uiselector(resource_id(text, "new UiSelector().resourceId(#{text});"), scrollable_index)
|
44
46
|
|
45
47
|
find_element :uiautomator, args
|
46
48
|
end
|
47
49
|
|
48
50
|
# Scroll to the first element with the exact target text or description.
|
49
|
-
# @param text [String] the text to search for in the text value and content description
|
51
|
+
# @param text [String] the text or resourceId to search for in the text value and content description
|
52
|
+
# @param scrollable_index [Integer] the index for scrollable views.
|
50
53
|
# @return [Element] the element scrolled to
|
51
|
-
def scroll_to_exact(text)
|
54
|
+
def scroll_to_exact(text, scrollable_index = 0)
|
52
55
|
text = %("#{text}")
|
53
56
|
|
54
|
-
args = scroll_uiselector("new UiSelector().text(#{text})") +
|
55
|
-
scroll_uiselector("new UiSelector().description(#{text})")
|
57
|
+
args = scroll_uiselector("new UiSelector().text(#{text})", scrollable_index) +
|
58
|
+
scroll_uiselector("new UiSelector().description(#{text})", scrollable_index) +
|
59
|
+
scroll_uiselector(resource_id(text, "new UiSelector().resourceId(#{text});"), scrollable_index)
|
56
60
|
|
57
61
|
find_element :uiautomator, args
|
58
62
|
end
|
@@ -256,7 +256,7 @@ module Appium
|
|
256
256
|
# @param on_match [String] the string to return on resourceId match
|
257
257
|
#
|
258
258
|
# @return [String] empty string on failure, on_match on successful match
|
259
|
-
def
|
259
|
+
def resource_id(string, on_match)
|
260
260
|
return '' unless string
|
261
261
|
|
262
262
|
# unquote the string
|
@@ -289,14 +289,14 @@ module Appium
|
|
289
289
|
value = %("#{value}")
|
290
290
|
|
291
291
|
if class_name == '*'
|
292
|
-
return (
|
292
|
+
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
293
293
|
"new UiSelector().descriptionContains(#{value});" \
|
294
294
|
"new UiSelector().textContains(#{value});")
|
295
295
|
end
|
296
296
|
|
297
297
|
class_name = %("#{class_name}")
|
298
298
|
|
299
|
-
|
299
|
+
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
300
300
|
"new UiSelector().className(#{class_name}).descriptionContains(#{value});" \
|
301
301
|
"new UiSelector().className(#{class_name}).textContains(#{value});"
|
302
302
|
end
|
@@ -326,14 +326,14 @@ module Appium
|
|
326
326
|
value = %("#{value}")
|
327
327
|
|
328
328
|
if class_name == '*'
|
329
|
-
return (
|
329
|
+
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
330
330
|
"new UiSelector().description(#{value});" \
|
331
331
|
"new UiSelector().text(#{value});")
|
332
332
|
end
|
333
333
|
|
334
334
|
class_name = %("#{class_name}")
|
335
335
|
|
336
|
-
|
336
|
+
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
337
337
|
"new UiSelector().className(#{class_name}).description(#{value});" \
|
338
338
|
"new UiSelector().className(#{class_name}).text(#{value});"
|
339
339
|
end
|
@@ -13,6 +13,9 @@ module Appium
|
|
13
13
|
open_notifications: [:post, 'session/:session_id/appium/device/open_notifications'.freeze],
|
14
14
|
toggle_airplane_mode: [:post, 'session/:session_id/appium/device/toggle_airplane_mode'.freeze],
|
15
15
|
current_activity: [:get, 'session/:session_id/appium/device/current_activity'.freeze],
|
16
|
+
get_system_bars: [:get, 'session/:session_id/appium/device/system_bars'.freeze],
|
17
|
+
get_display_density: [:get, 'session/:session_id/appium/device/display_density'.freeze],
|
18
|
+
is_keyboard_shown: [:get, 'session/:session_id/appium/device/is_keyboard_shown'.freeze],
|
16
19
|
get_network_connection: [:get, 'session/:session_id/network_connection'.freeze],
|
17
20
|
get_performance_data_types: [:post, 'session/:session_id/appium/performanceData/types'.freeze],
|
18
21
|
|
@@ -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-03-
|
3
|
+
VERSION = '9.3.5'.freeze unless defined? ::Appium::VERSION
|
4
|
+
DATE = '2017-03-26'.freeze unless defined? ::Appium::DATE
|
5
5
|
end
|
@@ -23,6 +23,30 @@ module Appium
|
|
23
23
|
|
24
24
|
# @!method current_activity
|
25
25
|
|
26
|
+
# @!method get_system_bars
|
27
|
+
# Get system bar's information
|
28
|
+
# @return [String] System bar
|
29
|
+
#
|
30
|
+
# ```ruby
|
31
|
+
# get_system_bars
|
32
|
+
# ```
|
33
|
+
|
34
|
+
# @!method get_display_density
|
35
|
+
# Get connected device's density.
|
36
|
+
# @return [Integer] The size of density
|
37
|
+
#
|
38
|
+
# ```ruby
|
39
|
+
# get_display_density # 320
|
40
|
+
# ```
|
41
|
+
|
42
|
+
# @!method is_keyboard_shown
|
43
|
+
# Get whether keyboard is displayed or not.
|
44
|
+
# @return [Bool] Return true if keyboard is shown. Return false if keyboard is hidden.
|
45
|
+
#
|
46
|
+
# ```ruby
|
47
|
+
# is_keyboard_shown # false
|
48
|
+
# ```
|
49
|
+
|
26
50
|
# @!method launch_app
|
27
51
|
# Start the simulator and application configured with desired capabilities
|
28
52
|
|
@@ -538,7 +562,7 @@ module Appium
|
|
538
562
|
# @return [String] The context currently being used.
|
539
563
|
|
540
564
|
# @!method available_contexts
|
541
|
-
#
|
565
|
+
# @return [Array<String>] All usable contexts, as an array of strings.
|
542
566
|
|
543
567
|
# Perform a block within the given context, then switch back to the starting context.
|
544
568
|
# @param context (String) The context to switch to for the duration of the block.
|
@@ -163,6 +163,8 @@ module Appium
|
|
163
163
|
end
|
164
164
|
end # self
|
165
165
|
|
166
|
+
attr_reader :actions
|
167
|
+
|
166
168
|
# Create a new multi-action
|
167
169
|
def initialize
|
168
170
|
@actions = []
|
@@ -177,6 +179,7 @@ module Appium
|
|
177
179
|
# Ask Appium to perform the actions
|
178
180
|
def perform
|
179
181
|
$driver.multi_touch @actions
|
182
|
+
@actions.clear
|
180
183
|
end
|
181
184
|
end # class MultiTouch
|
182
185
|
end # module Appium
|
@@ -7,6 +7,15 @@ module Appium
|
|
7
7
|
# ```ruby
|
8
8
|
# action = TouchAction.new.press(x: 45, y: 100).wait(5).release
|
9
9
|
# action.perform
|
10
|
+
# ```
|
11
|
+
#
|
12
|
+
# Or each methods can call without `TouchAction.new` as the following.
|
13
|
+
# In this case, `perform` is called automatically.
|
14
|
+
# ```ruby
|
15
|
+
# # called `swipe(...).perform` in this method.
|
16
|
+
# swipe(start_x: 75, start_y: 500, offset_x: 75, offset_y: 20, duration: 500)
|
17
|
+
# ```
|
18
|
+
|
10
19
|
class TouchAction
|
11
20
|
ACTIONS = [:move_to, :long_press, :double_tap, :two_finger_tap, :press, :release, :tap, :wait, :perform].freeze
|
12
21
|
COMPLEX_ACTIONS = [:swipe].freeze
|
@@ -167,6 +176,7 @@ module Appium
|
|
167
176
|
# Ask the driver to perform all actions in this action chain.
|
168
177
|
def perform
|
169
178
|
$driver.touch_actions @actions
|
179
|
+
@actions.clear
|
170
180
|
self
|
171
181
|
end
|
172
182
|
|
@@ -16,9 +16,23 @@ module Appium
|
|
16
16
|
# find_elements :predicate, 'wdName == "Buttons"'
|
17
17
|
# find_elements :predicate, 'wdValue == "SearchBar" AND isWDDivisible == 1'
|
18
18
|
# ```
|
19
|
+
#
|
20
|
+
# @!method ios_class_chain_find
|
21
|
+
# Only for XCUITest(WebDriverAgent)
|
22
|
+
# find_element/s can be used with a [class chain]( https://github.com/facebook/WebDriverAgent/wiki/Queries)
|
23
|
+
#
|
24
|
+
# ```ruby
|
25
|
+
# # select the third child button of the first child window element
|
26
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
|
27
|
+
# # select all the children windows
|
28
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow'
|
29
|
+
# # select the second last child of the second child window
|
30
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
|
31
|
+
# ```
|
19
32
|
def extended(_mod)
|
20
33
|
::Appium::Driver::SearchContext::FINDERS[:uiautomation] = '-ios uiautomation'
|
21
34
|
::Appium::Driver::SearchContext::FINDERS[:predicate] = '-ios predicate string'
|
35
|
+
::Appium::Driver::SearchContext::FINDERS[:class_chain] = '-ios class chain'
|
22
36
|
end
|
23
37
|
end # class << self
|
24
38
|
end # module Ios
|
data/release_notes.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
#### v9.3.4 2017-03-16
|
2
|
+
|
3
|
+
- [2b01065](https://github.com/appium/ruby_lib/commit/2b01065d0b2c2287ed9568cb23de5e459082ef62) Release 9 3 4 (#509)
|
4
|
+
- [0abf62f](https://github.com/appium/ruby_lib/commit/0abf62f0fa99d1ce0841a98e86a6ca334a143f0e) add doc for uiautomator (#508)
|
5
|
+
- [0199159](https://github.com/appium/ruby_lib/commit/0199159b6f0193884ebcffbfa460b3403859e537) Search with predicate (#504)
|
6
|
+
- [dbd8762](https://github.com/appium/ruby_lib/commit/dbd87620b771e7448e9826181b0ae595701ccaa2) Update deactive app for xcuitest (#502)
|
7
|
+
- [e06b25e](https://github.com/appium/ruby_lib/commit/e06b25ed1df5ed1a67fcf1a59767cc42ddcdb0d0) add a test for predicate (#499)
|
8
|
+
- [447f13c](https://github.com/appium/ruby_lib/commit/447f13cd799652d203bed4fc557b3c251ef2aa2c) Use awesome print 1.7 (#498)
|
9
|
+
- [a68cc5f](https://github.com/appium/ruby_lib/commit/a68cc5fc38b64d1d41945024a808df9af90828d7) remove workaround for rainbow (#497)
|
10
|
+
|
11
|
+
|
1
12
|
#### v9.3.3 2017-02-18
|
2
13
|
|
3
14
|
- [422a468](https://github.com/appium/ruby_lib/commit/422a4683f10fc99d3731985d532b71e1fe80b4e6) Release 9 3 3 (#494)
|
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.5
|
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-03-
|
11
|
+
date: 2017-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -331,6 +331,7 @@ files:
|
|
331
331
|
- ios_tests/lib/ios/specs/ios/element/text.rb
|
332
332
|
- ios_tests/lib/ios/specs/ios/element/textfield.rb
|
333
333
|
- ios_tests/lib/ios/specs/ios/helper.rb
|
334
|
+
- ios_tests/lib/ios/specs/ios/mobile_methods.rb
|
334
335
|
- ios_tests/lib/ios/specs/ios/patch.rb
|
335
336
|
- ios_tests/lib/run.rb
|
336
337
|
- ios_tests/readme.md
|