现今针对移动端的 UI 的测试的平台,用户进行用例测试的需要先进行测试用例脚本的编写(多种语言的,如 lua、java)。这些脚本用来进行 UI 操作的,编写完成后放到测试平台上运行。
这种方法的缺点是用例需要测试人员自行编写,难度大,成本高。
当前我们实现了自动脚本录制并生成 Python 用例脚本。
上传:adb push …
准备:adb pm clear packagename(清除历史数据)
adb pm uninstall packagename(卸载之前的 APK)
安装:adb pm install –r apkpath
运行:adb am start –n packagename/activityname
adb shell uiautomator 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 树,得到包含这个表标点且面积最小的控件。
支持 12 个动作:
返回、主界面、菜单
根据 md5 点击、根据 md5 查找、根据文本点击、根据文本查找
滑动、拖拽、发送文本、点击 backspace 键、休眠(人为计算两个操作间的时间)
解决:
上图表示三个操作的划分:
A.根据一定的距离来判断是点击还是(滑屏、拖拽),设置合理阈值(鼠标可能发生小抖动)。
当在一定距离以内,则认为是点击;当超过该段距离,则认为是滑屏或拖拽。
B.上述已区分是点击还是滑屏、拖拽。滑屏与拖拽的区分点是根据鼠标按下的时间来进行区分。Ps:手机上当你在某个区域点击不放时会唤出某些功能,例如 APK 的卸载功能。
当点击的时间大于设置的阈值时,认为是拖拽行为;小于则任务是滑动行为。
注:当点击的时候分两种方式点击:如果该控件含有 text,则可认为是通过 text 进行点击;若没有 text,程序内部会根据 xml 树形结构该控件的位置进行计算得出唯一的 md5(类似网页上的 xpath)
解决:后台监控手机是否旋转,若旋转则在坐标处理时先做旋转处理,再做像素转换。
1、dump 的操作考虑到功能的要求,必须在实时性上进行一定的优化。
2、判断页面上的用户操作要达到一个精准度高的录制,需不断调整阈值至合理水平,满足大多数使用习惯。