该方是基于uiautomator2如下版本进行验证的:
PS C:\windows\system32> pip show uiautomator2
Name: uiautomator2
Version: 1.2.2
Summary: Python Wrapper for Android UiAutomator2 test tool
Home-page: https://github.com/codeskyblue/uiautomator2
Author: codeskyblue
Author-email: codeskyblue@gmail.com
License: MIT
Location: c:\program files\python36\lib\site-packages
Requires: six, progress, whichcraft, logzero, lxml, adbutils, retry, Pillow, requests, humanize
Required-by: weditor, atx
下面贴出githup上关于该方法的使用
1
Watcher
2
You can register watchers to perform some actions when a selector does
not
find a match.
3
4
Register Watcher
5
6
When a selector can
not
find a match, uiautomator2 will run all registered watchers.
7
8
Click target when conditions match
9
d.watcher(
"
AUTO_FC_WHEN_ANR
"
).when(text=
"
ANR
"
).when(text=
"
Wait
"
) \
10
.click(text=
"
Force Close
"
)
11
#
d.watcher(name) ## creates a new named watcher.
12
#
.when(condition) ## the UiSelector condition of the watcher.
13
#
.click(target) ## perform click action on the target UiSelector.
14
There
is
also a trick about click. You can use click without arguments.
15
16
d.watcher(
"
ALERT
"
).when(text=
"
OK
"
).click()
17
#
Same as
18
d.watcher(
"
ALERT
"
).when(text=
"
OK
"
).click(text=
"
OK
"
)
19
Press key when a condition becomes true
20
d.watcher(
"
AUTO_FC_WHEN_ANR
"
).when(text=
"
ANR
"
).when(text=
"
Wait
"
) \
21
.press(
"
back
"
,
"
home
"
)
22
#
d.watcher(name) ## creates a new named watcher.
23
#
.when(condition) ## the UiSelector condition of the watcher.
24
#
.press(
, ...,
.() ## press keys one by one in sequence.
25
Check
if
the named watcher triggered
26
27
A watcher
is
triggered, which means the watcher was run
and
all its conditions matched.
28
29
d.watcher(
"
watcher_name
"
).triggered
30
#
true in case of the specified watcher triggered, else false
31
Remove a named watcher
32
33
#
remove the watcher
34
d.watcher(
"
watcher_name
"
).remove()
35
List all watchers
36
37
d.watchers
38
#
a list of all registered watchers
39
Check
for
any triggered watcher
40
41
d.watchers.triggered
42
#
true in case of any watcher triggered
43
Reset all triggered watchers
44
45
#
reset all triggered watchers, after that, d.watchers.triggered will be false.
46
d.watchers.reset()
47
Remove watchers
48
49
#
remove all registered watchers
50
d.watchers.remove()
51
#
remove the named watcher, same as d.watcher("watcher_name").remove()
52
d.watchers.remove(
"
watcher_name
"
)
53
Force to run all watchers
54
55
#
force to run all registered watchers
56
d.watchers.run()
注:里面涉及的watcher_name可以自定义,可以做到见名知意即可
watcher的使用是要先注册(第9行至20行均是注册watcher的方法),然后激活watcher(第56行),注意这个激活方法只是一个瞬时激活,就是说使用之后即销毁,不会一直存于后台。那这样的话在实际的使用场景中怎么使用这个功能呢,下面看一段脚本 1 # -*- coding:utf-8 -*-
2
3
import
uiautomator2 as u2
4
import
time
5
6
7
d =
u2.connect()
8
cfg =
MTBFConfig()
9
package = cfg.getstr(
"
Admit
"
,
"
pkg
"
,
"
config
"
)
10
PACKAGELIST = package.split(
"
,
"
)
11
print
(PACKAGELIST)
12
d.watcher("ALLOW").when(text="ALLOW").click(text="ALLOW")
13
#
d.watchers.run()
14
print
(d.watchers)
15
16
time.sleep(2
)
17
pkglen =
len(PACKAGELIST)
18
print
((
"
There are %d package for test
"
) %
pkglen)
19
20
class
Admit(object):
21
22
def
main(self):
23
for
i
in
range(pkglen):
24
k =
0
25
for
j
in
range(5
):
26
if
d.info[
'
currentPackageName
'
] !=
PACKAGELIST[i]:
27
d.app_start(PACKAGELIST[i])
28
print
(PACKAGELIST[i])
29
time.sleep(1
)
30
k += 1
31
if
k == 3
:
32
print
(
"
Can not enter
"
+
str(PACKAGELIST[i]))
33
return
False
34
if
PACKAGELIST[i] ==
'
com.google.android.contacts
'
:
35
print
(
"
hello
"
)
36
if
d(description =
"
Open navigation drawer
"
).exists(timeout = 5
):
37
d(description =
"
Open navigation drawer
"
).click()
38
39
if
d(text =
"
Settings
"
).exists(timeout = 5
):
40
d(text =
"
Settings
"
).click()
41
42
if
d(resourceId=
"
android:id/title
"
, text =
"
Import
"
).exists(timeout=5
):
43
d(resourceId=
"
android:id/title
"
, text =
"
Import
"
).click()
44
time.sleep(3
)
45
46
if
d(resourceId =
"
android:id/button1
"
, text =
"
OK
"
).exists(timeout = 5
):
47
d(resourceId =
"
android:id/button1
"
, text =
"
OK
"
).click()
48
time.sleep(1
)
49
d.watchers.run() //在上面OK点击之后会弹出一个权限访问的许可,所以这个时候需要激活一次watcher把弹框关掉,以便不影响后续测试,所以就一个原则,哪里可能会有弹框就在哪里激活watcher
50
51
52
53
if
__name__
==
"
__main__
"
:
54
ad =
Admit()
55
ad.main()

