appium_lib 9.4.0 → 9.4.1
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 +10 -0
- data/docs/android_docs.md +288 -232
- data/docs/ios_docs.md +269 -257
- data/lib/appium_lib/android/element/button.rb +82 -16
- data/lib/appium_lib/android/helper.rb +66 -8
- data/lib/appium_lib/common/version.rb +2 -2
- data/lib/appium_lib/driver.rb +6 -0
- data/release_notes.md +8 -0
- metadata +2 -2
@@ -7,20 +7,47 @@ module Appium
|
|
7
7
|
private
|
8
8
|
|
9
9
|
# @private
|
10
|
-
def
|
10
|
+
def _button_visible_selectors_xpath
|
11
11
|
"//#{Button}|#{ImageButton}"
|
12
12
|
end
|
13
13
|
|
14
|
+
def _button_visible_selectors(opts = {})
|
15
|
+
button_index = opts.fetch :button_index, false
|
16
|
+
image_button_index = opts.fetch :image_button_index, false
|
17
|
+
|
18
|
+
if button_index && image_button_index
|
19
|
+
"new UiSelector().className(#{Button}).instance(#{button_index});" \
|
20
|
+
"new UiSelector().className(#{ImageButton}).instance(#{image_button_index});"
|
21
|
+
else
|
22
|
+
"new UiSelector().className(#{Button});" \
|
23
|
+
"new UiSelector().className(#{ImageButton});"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
14
27
|
# @private
|
28
|
+
# For automationName is uiautomator2
|
29
|
+
def _button_exact_string_xpath(value)
|
30
|
+
string_visible_exact_xpath(Button, value) +
|
31
|
+
string_visible_exact_xpath(ImageButton, value).sub(/\A\/\//, '|')
|
32
|
+
end
|
33
|
+
|
15
34
|
def _button_exact_string(value)
|
16
|
-
string_visible_exact
|
17
|
-
|
35
|
+
button = string_visible_exact Button, value
|
36
|
+
image_button = string_visible_exact ImageButton, value
|
37
|
+
button + image_button
|
18
38
|
end
|
19
39
|
|
20
40
|
# @private
|
41
|
+
# For automationName is uiautomator2
|
42
|
+
def _button_contains_string_xpath(value)
|
43
|
+
string_visible_contains_xpath(Button, value) +
|
44
|
+
string_visible_contains_xpath(ImageButton, value).sub(/\A\/\//, '|')
|
45
|
+
end
|
46
|
+
|
21
47
|
def _button_contains_string(value)
|
22
|
-
string_visible_contains
|
23
|
-
|
48
|
+
button = string_visible_contains Button, value
|
49
|
+
image_button = string_visible_contains ImageButton, value
|
50
|
+
button + image_button
|
24
51
|
end
|
25
52
|
|
26
53
|
public
|
@@ -36,12 +63,21 @@ module Appium
|
|
36
63
|
index = value
|
37
64
|
raise "#{index} is not a valid index. Must be >= 1" if index <= 0
|
38
65
|
|
39
|
-
|
40
|
-
|
66
|
+
if automation_name_is_uiautomator2?
|
67
|
+
result = find_elements(:xpath, _button_visible_selectors_xpath)[value - 1]
|
68
|
+
raise Selenium::WebDriver::Error::NoSuchElementError unless result
|
69
|
+
else
|
70
|
+
result = find_element :uiautomator, _button_visible_selectors(index: index)
|
71
|
+
end
|
72
|
+
|
41
73
|
return result
|
42
74
|
end
|
43
75
|
|
44
|
-
|
76
|
+
if automation_name_is_uiautomator2?
|
77
|
+
find_element :xpath, _button_contains_string_xpath(value)
|
78
|
+
else
|
79
|
+
find_element :uiautomator, _button_contains_string(value)
|
80
|
+
end
|
45
81
|
end
|
46
82
|
|
47
83
|
# Find all buttons containing value.
|
@@ -49,36 +85,66 @@ module Appium
|
|
49
85
|
# @param value [String] the value to search for
|
50
86
|
# @return [Array<Button>]
|
51
87
|
def buttons(value = false)
|
52
|
-
|
53
|
-
|
88
|
+
if automation_name_is_uiautomator2?
|
89
|
+
return find_elements :xpath, _button_visible_selectors_xpath unless value
|
90
|
+
find_elements :xpath, _button_contains_string_xpath(value)
|
91
|
+
else
|
92
|
+
return find_elements :uiautomator, _button_visible_selectors unless value
|
93
|
+
find_elements :uiautomator, _button_contains_string(value)
|
94
|
+
end
|
54
95
|
end
|
55
96
|
|
56
97
|
# Find the first button.
|
57
98
|
# @return [Button]
|
58
99
|
def first_button
|
59
|
-
|
100
|
+
if automation_name_is_uiautomator2?
|
101
|
+
find_element :xpath, _button_visible_selectors_xpath
|
102
|
+
else
|
103
|
+
find_element :uiautomator, _button_visible_selectors(button_index: 0, image_button_index: 0)
|
104
|
+
end
|
60
105
|
end
|
61
106
|
|
62
107
|
# Find the last button.
|
63
108
|
# @return [Button]
|
64
109
|
def last_button
|
65
|
-
|
66
|
-
|
67
|
-
|
110
|
+
if automation_name_is_uiautomator2?
|
111
|
+
result = find_elements(:xpath, _button_visible_selectors_xpath).last
|
112
|
+
raise Selenium::WebDriver::Error::NoSuchElementError unless result
|
113
|
+
result
|
114
|
+
else
|
115
|
+
# uiautomator index doesn't support last
|
116
|
+
# and it's 0 indexed
|
117
|
+
button_index = tags(Button).length
|
118
|
+
button_index -= 1 if button_index > 0
|
119
|
+
image_button_index = tags(ImageButton).length
|
120
|
+
image_button_index -= 1 if image_button_index > 0
|
121
|
+
|
122
|
+
find_element :uiautomator,
|
123
|
+
_button_visible_selectors(button_index: button_index,
|
124
|
+
image_button_index: image_button_index)
|
125
|
+
end
|
68
126
|
end
|
69
127
|
|
70
128
|
# Find the first button that exactly matches value.
|
71
129
|
# @param value [String] the value to match exactly
|
72
130
|
# @return [Button]
|
73
131
|
def button_exact(value)
|
74
|
-
|
132
|
+
if automation_name_is_uiautomator2?
|
133
|
+
find_element :xpath, _button_exact_string_xpath(value)
|
134
|
+
else
|
135
|
+
find_element :uiautomator, _button_exact_string(value)
|
136
|
+
end
|
75
137
|
end
|
76
138
|
|
77
139
|
# Find all buttons that exactly match value.
|
78
140
|
# @param value [String] the value to match exactly
|
79
141
|
# @return [Array<Button>]
|
80
142
|
def buttons_exact(value)
|
81
|
-
|
143
|
+
if automation_name_is_uiautomator2?
|
144
|
+
find_elements :xpath, _button_exact_string_xpath(value)
|
145
|
+
else
|
146
|
+
find_elements :uiautomator, _button_exact_string(value)
|
147
|
+
end
|
82
148
|
end
|
83
149
|
end # module Android
|
84
150
|
end # module Appium
|
@@ -279,13 +279,13 @@ module Appium
|
|
279
279
|
end
|
280
280
|
|
281
281
|
# Returns a string that matches the first element that contains value
|
282
|
-
#
|
283
|
-
# example:
|
282
|
+
# For automationName is uiautomator2
|
283
|
+
# example: string_visible_contains_xpath 'UIATextField', 'sign in'
|
284
284
|
#
|
285
285
|
# @param class_name [String] the class name for the element
|
286
286
|
# @param value [String] the value to search for
|
287
287
|
# @return [String]
|
288
|
-
def
|
288
|
+
def string_visible_contains_xpath(class_name, value)
|
289
289
|
r_id = resource_id(value, " or @resource-id='#{value}'")
|
290
290
|
|
291
291
|
if class_name == '*'
|
@@ -297,12 +297,37 @@ module Appium
|
|
297
297
|
" or contains(translate(@content-desc,'#{value.upcase}', '#{value}'), '#{value}')" + r_id + ']'
|
298
298
|
end
|
299
299
|
|
300
|
+
# Returns a string that matches the first element that contains value
|
301
|
+
# For automationName is Appium
|
302
|
+
# example: string_visible_contains 'UIATextField', 'sign in'
|
303
|
+
#
|
304
|
+
# @param class_name [String] the class name for the element
|
305
|
+
# @param value [String] the value to search for
|
306
|
+
# @return [String]
|
307
|
+
def string_visible_contains(class_name, value)
|
308
|
+
value = %("#{value}")
|
309
|
+
if class_name == '*'
|
310
|
+
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
311
|
+
"new UiSelector().descriptionContains(#{value});" \
|
312
|
+
"new UiSelector().textContains(#{value});")
|
313
|
+
end
|
314
|
+
|
315
|
+
class_name = %("#{class_name}")
|
316
|
+
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
317
|
+
"new UiSelector().className(#{class_name}).descriptionContains(#{value});" \
|
318
|
+
"new UiSelector().className(#{class_name}).textContains(#{value});"
|
319
|
+
end
|
320
|
+
|
300
321
|
# Find the first element that contains value
|
301
322
|
# @param element [String] the class name for the element
|
302
323
|
# @param value [String] the value to search for
|
303
324
|
# @return [Element]
|
304
325
|
def complex_find_contains(element, value)
|
305
|
-
|
326
|
+
if automation_name_is_uiautomator2?
|
327
|
+
find_element :xpath, string_visible_contains_xpath(element, value)
|
328
|
+
else
|
329
|
+
find_element :uiautomator, string_visible_contains(element, value)
|
330
|
+
end
|
306
331
|
end
|
307
332
|
|
308
333
|
# Find all elements containing value
|
@@ -310,15 +335,20 @@ module Appium
|
|
310
335
|
# @param value [String] the value to search for
|
311
336
|
# @return [Array<Element>]
|
312
337
|
def complex_finds_contains(element, value)
|
313
|
-
|
338
|
+
if automation_name_is_uiautomator2?
|
339
|
+
find_elements :xpath, string_visible_contains_xpath(element, value)
|
340
|
+
else
|
341
|
+
find_elements :uiautomator, string_visible_contains(element, value)
|
342
|
+
end
|
314
343
|
end
|
315
344
|
|
316
345
|
# @private
|
317
346
|
# Create an string to exactly match the first element with target value
|
347
|
+
# For automationName is uiautomator2
|
318
348
|
# @param class_name [String] the class name for the element
|
319
349
|
# @param value [String] the value to search for
|
320
350
|
# @return [String]
|
321
|
-
def
|
351
|
+
def string_visible_exact_xpath(class_name, value)
|
322
352
|
r_id = resource_id(value, " or @resource-id='#{value}'")
|
323
353
|
|
324
354
|
if class_name == '*'
|
@@ -328,12 +358,36 @@ module Appium
|
|
328
358
|
"//#{class_name}[@text='#{value}' or @content-desc='#{value}'" + r_id + ']'
|
329
359
|
end
|
330
360
|
|
361
|
+
# @private
|
362
|
+
# Create an string to exactly match the first element with target value
|
363
|
+
# @param class_name [String] the class name for the element
|
364
|
+
# @param value [String] the value to search for
|
365
|
+
# @return [String]
|
366
|
+
def string_visible_exact(class_name, value)
|
367
|
+
value = %("#{value}")
|
368
|
+
|
369
|
+
if class_name == '*'
|
370
|
+
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
371
|
+
"new UiSelector().description(#{value});" \
|
372
|
+
"new UiSelector().text(#{value});")
|
373
|
+
end
|
374
|
+
|
375
|
+
class_name = %("#{class_name}")
|
376
|
+
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
377
|
+
"new UiSelector().className(#{class_name}).description(#{value});" \
|
378
|
+
"new UiSelector().className(#{class_name}).text(#{value});"
|
379
|
+
end
|
380
|
+
|
331
381
|
# Find the first element exactly matching value
|
332
382
|
# @param class_name [String] the class name for the element
|
333
383
|
# @param value [String] the value to search for
|
334
384
|
# @return [Element]
|
335
385
|
def complex_find_exact(class_name, value)
|
336
|
-
|
386
|
+
if automation_name_is_uiautomator2?
|
387
|
+
find_element :xpath, string_visible_exact_xpath(class_name, value)
|
388
|
+
else
|
389
|
+
find_element :uiautomator, string_visible_exact(class_name, value)
|
390
|
+
end
|
337
391
|
end
|
338
392
|
|
339
393
|
# Find all elements exactly matching value
|
@@ -341,7 +395,11 @@ module Appium
|
|
341
395
|
# @param value [String] the value to search for
|
342
396
|
# @return [Element]
|
343
397
|
def complex_finds_exact(class_name, value)
|
344
|
-
|
398
|
+
if automation_name_is_uiautomator2?
|
399
|
+
find_elements :xpath, string_visible_exact_xpath(class_name, value)
|
400
|
+
else
|
401
|
+
find_elements :uiautomator, string_visible_exact(class_name, value)
|
402
|
+
end
|
345
403
|
end
|
346
404
|
|
347
405
|
# Returns XML string for the current page
|
@@ -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.4.
|
4
|
-
DATE = '2017-04-
|
3
|
+
VERSION = '9.4.1'.freeze unless defined? ::Appium::VERSION
|
4
|
+
DATE = '2017-04-19'.freeze unless defined? ::Appium::DATE
|
5
5
|
end
|
data/lib/appium_lib/driver.rb
CHANGED
@@ -474,6 +474,12 @@ module Appium
|
|
474
474
|
!@automation_name.nil? && 'xcuitest'.casecmp(@automation_name).zero?
|
475
475
|
end
|
476
476
|
|
477
|
+
# Return true if automationName is 'uiautomator2'
|
478
|
+
# @return [Boolean]
|
479
|
+
def automation_name_is_uiautomator2?
|
480
|
+
!@automation_name.nil? && 'uiautomator2'.casecmp(@automation_name).zero?
|
481
|
+
end
|
482
|
+
|
477
483
|
# Return true if the target Appium server is over REQUIRED_VERSION_XCUITEST.
|
478
484
|
# If the Appium server is under REQUIRED_VERSION_XCUITEST, then error is raised.
|
479
485
|
# @return [Boolean]
|
data/release_notes.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
#### v9.4.0 2017-04-17
|
2
|
+
|
3
|
+
- [9492690](https://github.com/appium/ruby_lib/commit/9492690f80efaab79ce165e16dd335fca9717c4a) Release 9 4 0 (#545)
|
4
|
+
- [2ea94c3](https://github.com/appium/ruby_lib/commit/2ea94c3933f1ecd1362c33f306348236facefc37) add mobile gesture (#542)
|
5
|
+
- [1c7dd0f](https://github.com/appium/ruby_lib/commit/1c7dd0ff844265e76b3f2e15a0e6b3651005518f) use xpath instead of uiselectors (#544)
|
6
|
+
- [5841a39](https://github.com/appium/ruby_lib/commit/5841a39d60b0986f1a1dd786b910bfbd6223d124) add mobile gesture for XCUITest (#537)
|
7
|
+
|
8
|
+
|
1
9
|
#### v9.3.8 2017-04-13
|
2
10
|
|
3
11
|
- [7a7cf44](https://github.com/appium/ruby_lib/commit/7a7cf44c3cb11a90142285b8e8d731dc452b89eb) Release 9 3 8 (#540)
|
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.4.
|
4
|
+
version: 9.4.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-04-
|
11
|
+
date: 2017-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|