有个更方便的排序方法
>> for s in parent.child("android.view.View"):# poco定位web元素的时候,位置的确会乱序。如下
>> print(s)
UIObjectProxy of "type=android.widget.ListView&text=&android.widget.ListView/android.view.View[0]/android.view.View[0]"
UIObjectProxy of "type=android.widget.ListView&text=&android.widget.ListView/android.view.View[0]/android.view.View[4]"
UIObjectProxy of "type=android.widget.ListView&text=&android.widget.ListView/android.view.View[0]/android.view.View[1]"
UIObjectProxy of "type=android.widget.ListView&text=&android.widget.ListView/android.view.View[0]/android.view.View[2]"
UIObjectProxy of "type=android.widget.ListView&text=&android.widget.ListView/android.view.View[0]/android.view.View[3]"
# 但它们各个元素 str 后,[] 里面的数字是正确的
>>children = sorted(parent.child("android.view.View"), key=lambda x: str(x)) # 那么用这种方式排序即可
现在更新了下版本,你可以试试看。之前控件唯一指纹定义的的确有问题
一般不同页面的 activity name 是不一样的,但也有特殊页面或者 H5 页面,activity name 一样但内容不一样。那你可以通过页面上独有的特殊控件给 Activity 对象打标签
1、我只有在刚启动 app 的时候,设置了 10 秒的等待启动的时间。之后遍历控件的时候,并没有设置操作延迟。我这里使用基本 3 秒点击一次。可能和设备性能有关?
2、你可以用 airtest IDE 查看一下那些没有被点击的控件的属性是什么,和配置文件中的属性对比一下。
只有满足 select_list 下面条件的控件才会被解析。
是的。目前的逻辑就是把当前看到的控件按照规则遍历,不会去管当前界面是怎么进入的和控件之间的逻辑关系。
没太懂你的意思…你的想法是什么?
每个页面根据 activity 标识,建立一个页面对象,当前页面的控件存在对应页面的 list 里
相当于不同页面有不同的命名空间
进入到新页面后,按照同样的逻辑进行筛选和分类,且执行操作
遍历的算法实际上的本质是给界面上的每个控件进行筛选和分组
首先使用 poco dump 下所有控件的结构信息
poco 的 dump 的数据结构是 json,appium 使用的原生的 dump 结构是 xml
"children": [
茫茫多的子结构
]
"name": "android.widget.FrameLayout",
"payload": {
"checkable": false,
"pos": [
0.5,
0.5
],
"scrollable": false,
"boundsInParent": [
1,
1
],
"selected": false,
"anchorPoint": [
0.5,
0.5
],
"size": [
1,
1
],
"zOrders": {
"global": 0,
"local": 0
},
"editalbe": false,
"visible": true,
"enabled": true,
"checked": false,
"focused": false,
"touchable": false,
"package": "cn.ehanghai.android.hex",
"name": "android.widget.FrameLayout",
"scale": [
1,
1
],
"dismissable": false,
"longClickable": false,
"type": "android.widget.FrameLayout",
"focusable": false
}
}
首先把 dump 下拉的控件(或者说节点),都存在一个 list 里面
然后把这个 list 塞到 actons 里面去过滤
actions = [SelectAction(), # 初步进行控件筛选
FilterAction(), # 对特定的控件进行筛选
BlackAction(), # 将在黑名单中的控件排除
FirstAction(), # 优先点击的控件,执行run后续不执行
TriggerAction(), # 触发器,遇到特定控件进行特定的操作,执行run后续不执行
BackHeadAction(), # 将返回类型的按键单独取出来
NormalAction(), # 一般的控件,每个控件默认点击一次,执行run后续不执行
BackEndAction(), # 前面的都没有执行,那么点击返回按钮
]
这堆 action 相当于一层层的漏斗,筛选并且分类控件
action 的执行过程如下图
可以扩充 action 来增加遍历的逻辑
不可能有可以适用于所有 app 的遍历逻辑,所以我倾向于可以方便的扩充 action,
来对各个不同的 app 进行对应的配置
目前还没有做这方面的功能
设备连接字符串如何编写
在刚才的命令行中使用的 --device 参数,传入的是一个设备字符串,以安卓设备为例,字串完整定义如下:
Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>
其中,adbhost 是 adb server 所在主机的 ip,默认是本机 127.0.0.1,adb port 默认是 5037,serialno 是 android 手机的序列号。
这里提供一些常见的填写范例供大家参考:
#什么都不填写,会默认取当前连接中的第一台手机
Android:///
# 连接本机默认端口连的一台设备号为79d03fa的手机
Android://127.0.0.1:5037/79d03fa
# 用本机的adb连接一台adb connect过的远程设备,注意10.254.60.1:5555其实是serialno
Android://127.0.0.1:5037/10.254.60.1:5555
# 模拟器等特殊设备、使用了连接参数时:
# 模拟器连接,勾选了Use javacap模式
Android://127.0.0.1:5037/127.0.0.1:7555?cap_method=JAVACAP
# 所有的选项都勾选上之后连接的设备,用&&来连接多个参数字符串
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI&&touch_method=ADBTOUCH
更多的可以参考这个文档: https://airtest.doc.io.netease.com/tutorial/4_Android_automated_testing_one/