• 有个更方便的排序方法

    >> 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)) # 那么用这种方式排序即可
    
  • python 版 appcrawler at 2020年10月26日

    现在更新了下版本,你可以试试看。之前控件唯一指纹定义的的确有问题

  • python 版 appcrawler at 2020年10月26日

    一般不同页面的 activity name 是不一样的,但也有特殊页面或者 H5 页面,activity name 一样但内容不一样。那你可以通过页面上独有的特殊控件给 Activity 对象打标签

  • python 版 appcrawler at 2020年10月26日

    1、我只有在刚启动 app 的时候,设置了 10 秒的等待启动的时间。之后遍历控件的时候,并没有设置操作延迟。我这里使用基本 3 秒点击一次。可能和设备性能有关?😳
    2、你可以用 airtest IDE 查看一下那些没有被点击的控件的属性是什么,和配置文件中的属性对比一下。
    只有满足 select_list 下面条件的控件才会被解析。

  • python 版 appcrawler at 2020年10月23日

    是的。目前的逻辑就是把当前看到的控件按照规则遍历,不会去管当前界面是怎么进入的和控件之间的逻辑关系。

  • python 版 appcrawler at 2020年10月23日

    没太懂你的意思…你的想法是什么?

  • python 版 appcrawler at 2020年10月22日

    每个页面根据 activity 标识,建立一个页面对象,当前页面的控件存在对应页面的 list 里

    相当于不同页面有不同的命名空间

    进入到新页面后,按照同样的逻辑进行筛选和分类,且执行操作

  • python 版 appcrawler at 2020年10月22日

    遍历的算法实际上的本质是给界面上的每个控件进行筛选和分组

    首先使用 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 进行对应的配置

  • python 版 appcrawler at 2020年10月22日

    目前还没有做这方面的功能

  • python 版 appcrawler at 2020年10月22日

    设备连接字符串如何编写
    在刚才的命令行中使用的 --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/