一、需求背景

        现今针对移动端的 UI 的测试的平台,用户进行用例测试的需要先进行测试用例脚本的编写(多种语言的,如 lua、java)。这些脚本用来进行 UI 操作的,编写完成后放到测试平台上运行。
这种方法的缺点是用例需要测试人员自行编写,难度大,成本高。

二、实现效果

         通过屏幕录制,将使用者对手机的操作记录下来,然后自动生成可放在平台上面运行的用例脚本。这种方法可以解决上述的缺点。

         当前我们实现了自动脚本录制并生成 Python 用例脚本。

三、使用介绍

         1.平台支持:http://opentest.360.cn/phonerenter.html

         2.使用前提:打开云真机平台的某台设备进行使用,选择脚本录制

         3.使用步骤:

                (1)上传 APK(选择需要进行测试的 apk 并进行上传)
                (2)查看控件信息(鼠标移到屏幕的手机的控件上,可查看该控件信息)
                (3)录制脚本(记录鼠标在屏幕上的动作;添加操作不可达表示的动作)
                (4)脚本回放(回放脚本,查看脚本可否正常执行;可修改参数)
                (5)保存脚本(脚本能正常执行后可以进行保存至用户的脚本列表中)

四、技术实现

1、上传 APK

         前端上传,节点机器下载

         上传:adb push …
         准备:adb pm clear packagename(清除历史数据)
                    adb pm uninstall packagename(卸载之前的 APK)
         安装:adb pm install –r apkpath
         运行:adb am start –n packagename/activityname

2、查看控件信息

使用可视化的工具: UI Automator Viewer——功能介绍

查看控件信息——功能显示

查看控件信息——技术实现

         第一版实现:

        

         adb shell uiautomator dump
        

         第二版实现:

         由于第一版方式 dump 界面时间比较久(脚本录制功能要求高的实时性),故修改为第二种实现。

         使用 AccessibilityService(获取当前窗口的根节点,然后获取到整个页面的信息并处理为 xml)

AccessibilityService:Google 为了让 Android 系统更实用,为用户提供了无障碍辅助服务。出发点是用来辅助有障碍人士使用手机的,可以模拟一些点击操作等。
拓展:AccessibilityService 运行在后台,并且能够收到由系统发出的一些事件 (AccessibilityEvent, 这些事件表示用户界面一系列的状态变化), 比如焦点改变, 输入内容变化, 按钮被点击了等等, 该种服务能够请求获取当前活动窗口并查找其中的内容。换言之, 界面中产生的任何变化都会产生一个时间, 并由系统通知给 AccessibilityService.这就像监视器监视着界面的一举一动, 一旦界面发生变化, 立刻发出警报.
每个节点的信息包括:md5, index, resource-id,class ,text 等。

         后台服务实现:

         自定义一个服务类 AccessibilitySampleService(这个命名可以随意),继承系统的 AccessibilityService 并覆写 onAccessibilityEvent 和 onInterrupt 方法。编写好服务类之后,在系统配置文件(AndroidManifest.xml)中注册服务。完成前面两个步骤就完成了基本发辅助功能服务注册与配置,具体的功能实现需要在 onAccessibilityEvent 中完成,根据 onAccessibilityEvent 回调方法传递过来的 AccessibilityEvent 对象可以对事件进行过滤,结合 AccessibilitySampleService 本身提供的查找节点与模拟点击相关的接口即可实现权限节点的查找与点击。

         那加入鼠标在网页上滑动或停留一段时间的时候,如何判断区分哪个控件是用户所选择的呢?
        

         通过将 AccessibilityService 得到的 xml-str 数据转为 xml-dom 树,通过鼠标的坐标信息得到对应于该手机的坐标信息,遍历 dom 树,得到包含这个表标点且面积最小的控件。

3、录制脚本

         记录用户在网页上的手机界面操作

         支持 12 个动作:
返回、主界面、菜单
根据 md5 点击、根据 md5 查找、根据文本点击、根据文本查找
滑动、拖拽、发送文本、点击 backspace 键、休眠(人为计算两个操作间的时间)

         遇到的问题:

        (1)区分点击,滑屏,拖拽:鼠标在界面上的操作:down, move, up , leave(边界处理)

         解决:
        

         上图表示三个操作的划分:
         A.根据一定的距离来判断是点击还是(滑屏、拖拽),设置合理阈值(鼠标可能发生小抖动)。
当在一定距离以内,则认为是点击;当超过该段距离,则认为是滑屏或拖拽。
         B.上述已区分是点击还是滑屏、拖拽。滑屏与拖拽的区分点是根据鼠标按下的时间来进行区分。Ps:手机上当你在某个区域点击不放时会唤出某些功能,例如 APK 的卸载功能。
当点击的时间大于设置的阈值时,认为是拖拽行为;小于则任务是滑动行为。
         注:当点击的时候分两种方式点击:如果该控件含有 text,则可认为是通过 text 进行点击;若没有 text,程序内部会根据 xml 树形结构该控件的位置进行计算得出唯一的 md5(类似网页上的 xpath)

        (2)注意手机当前的旋转以及真实屏幕和前端控件的比例(纵横可能是不同的,注意换算)

         解决:后台监控手机是否旋转,若旋转则在坐标处理时先做旋转处理,再做像素转换。

4、脚本回放

根据保存的动作信息去调相应接口执行相应动作

5、保存脚本

保存已经重放成功的脚本,可自动生成 python 脚本,在开测的脚本管理页面看到刚刚保存的脚本,并可以在平台上执行。

五、总结

1、dump 的操作考虑到功能的要求,必须在实时性上进行一定的优化。
2、判断页面上的用户操作要达到一个精准度高的录制,需不断调整阈值至合理水平,满足大多数使用习惯。


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