探索目的

因为目前公司的一些情况,任务重,人力紧,现在没有过多的人力投入到自动化脚本的编辑,所有想出一个可以一劳永逸,能够简单便利 App 的测试脚本,完成简答的兼容测试;

目前实现状况

目前基本已经实现,但在使用的过程中,发现还有一些问题:
1、下载页面布局慢,导致执行速度慢
2、需要处理的异常情况过多,比如监控系统弹框等,如果要完美实现这一功能,需要做的优化还有很多
3、便利测试的规则难以完美制定,原因是一个页面可能是分很多 Tabs 的,每个 Tabs 的内容又各不相同,可能需要同一个页面多次获取页面布局信息,导致遍历的时候有可能一些点是过不到了

实现逻辑

简单来讲,设置一个心跳循环,先创建 2 个 JSONObject,一个用于存放 App 页面布局信息(A),一个用于控制页面内容的点击(B),打开 App 后,获取当前页面 Activity 名称,通过 Activity 名称去查看存放 App 页面布局信息的 JSON(A)数据,是否已保存当前页面布局信息,如果未保存,则下载当前页面布局文件,并分析文件,获取到 ResourceID 和 Text 项,将这些元素整合到合并到一起(中间添加必要的元素用于区分),以当前 Activity 名称为 Key 保存到 JSON(A)中,如果当前页面布局信息已经保存,则读取 JSON(A)数据获得当前页面的元素,并逐次执行,这里同样适用 JSON(B)中 Key 同为当前 Activity 名称的 Value 值来控制点击内容,Value 值一开始赋予当前当前 Activity 元素的个数,执行一个之后,则执行-1,并做一些控制,如果当前页面连续三次点击错误(定位失败),则重新获取下布局信息,覆盖之前的布局文件;

简单代码实现

private Handler handler = new Handler();
private Runnable myRunnable = new Runnable() {
        public void run() {
                  String Activity  获取当前页面Activity
                  if(!JSON_A.has(Activity){
                           获取当前文件布局信息dumpWindowHierarchy()
                            解析部分文件并将获得的元素放到key 为Activity的Value
                  }
                  String Activity_element = JOSN_A.getString(Activity);
                  String[] element  Activity_element.split(区分元素添加的特殊字符);
                 JSON_B.put(Activity,element.length);

                 //转换成点击操作
                 1从后往前依次取出元素并做判断后执行点击操作
                  如果成功则将JSON_B的Activity的值-1;
                  如果失败则将另一个统计失败次数的int index+=1;
                 if(index==3){
                        重新获取元素
                 }
         }
         handler.postDelayed(this, 50);
}
handler.post(myRunnable);


↙↙↙阅读原文可查看相关链接,并与作者交流