背景

开测平台在用例脚本执行过程中,被测 APP 会遇到很多权限弹框,由于用例脚本很多时候依赖 uiautomator 工具,因此平台在执行用例过程中无法启动弹窗助手服务,这些权限弹框需要用例脚本自己做兼容。因为权限弹框(如图 1 所示)很多时候被点击的控件都是 “允许”,平台尝试利用图像识别服务寻找被点控件坐标。

                                                                              图 1 权限弹框图

方案

目前系统权限框处理使用的是模板匹配和 SIFT 特征点匹配两种图像识别算法,依赖的底层库是 python 版的 opencv。首先先简单介绍一些模板匹配和 SIFT 特征点匹配的工作原理。

模板匹配:在目标图像上截取待识别的模板图像,以模板图像大小的矩形框在目标图像上从左到右、从上到下滑动,计算矩形框所在目标图像区域和模板图像的匹配度 (匹配度的计算方法采用的是 TM_CCOEFF_NORMED 方法),得到匹配度图,然后使用 minMaxLoc 方法根据匹配度图得到匹配度最大的坐标,该坐标即模板在目标图像中的左上角坐标,最后根据左上角坐标和模板的宽高换算出模板在目标图像中的中心点坐标。

                                                                         图 2 模板匹配示意图

模板匹配是逐像素点匹配的,因此对模板的要求特别高,需和目标图像尺度、亮度等条件保持一致才能很好的匹配上。这一特性导致了模板匹配没有很好的泛化能力,不同型号手机分辨率的差异导致需要维护多个匹配模板,这无疑降低了用例任务执行过程中弹框处理的速度和稳定性。因此为了避免此类问题的发生,我们引入了 SIFT 特征点匹配方法,SIFT 特征点 对旋转、尺度缩放、亮度变化保持不变性,可以很好的解决模板匹配问题。

SIFT 特征点匹配:对模板图像和目标图像构建各自尺度空间,提取出 SIFT 特征点和相应的 128 维描述子 (结合周围像素点梯度信息生成的 128 维的向量,用于描述该特征点),然后利用 knnMatch 方法对模板图像和目标图像特征点进行匹配,接着对匹配的特征点对做单应性变换,将模板图像映射到目标图像上。最后根据映射的坐标换算出模板在目标图像上的中心坐标。

                                                                        图 3 SIFT 特征点匹配

整个系统权限弹窗处理流程是手机端启动一个可以截图和点击的服务,任务执行端在收到用例任务时,启动权限弹框处理线程,不断的调用截图接口,将截图和模板图传给图像识别接口,图像识别接口返回匹配的中心点坐标,弹框处理线程调用手机端点击服务处理权限弹框。

思考

实际应用过程中,手机上弹框种类繁多,不同手机同一类弹框文案也有差异,例如权限弹框 A 手机弹框文案是禁止、允许,B 手机弹框文案可能是取消、同意,C 手机弹框文案可能是禁止、始终允许……那如何做到真正智能的处理掉未知弹框呢?后续可以尝试的思路是首先利用图像识别等技术找到截图中弹框的位置区域,然后对该位置区域的弹框利用 OCR 文字识别技术,识别出弹框文本和文本的坐标位置,最后结合线上已有的云规则配置信息利用 BERT 等模型预测需要点击的文本信息,将文本的坐标位置返回,调用手机端点击服务点击弹框。


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