用AI能力实现UI自动化测试框架
【背景】
一般移动端APP会有页面元素属性,比如:ID,ClassName,Text等,可以方便定位需要操控的元素控件。而这类的UI控件识别框架的结果输出往往依赖于开发同学在代码中对控件元素进行合理有效的命名,且一旦这些控件元素被混淆后就很难进行有效的元素定位。为了降低每个版本UI元素的层级等变化造成的自动化测试用例元素维护成本,故采用图像界面识别的方式进行UI自动化测试
【目前痛点】
1、自动化框架元素识别能力不足
现在很多应用在PC端目前就没有能识别出元素的自动化框架从而无法进行UI自动化测试,而在移动端市场上常用的一些自动化测试框架,比如python-uiautomator2依赖于开发框架和开发对元素的命名才能识别,对RN页面、H5、小程序等元素的识别支持也不是很好
2、多机型多分辨率兼容
回归测试中需要对多机型进行覆盖测试,因机型分辨率的问题,同一个页面也会因不同的设备展示效果不一样,哪怕同样的元素在不同的设备上展示的大小会不一致
3、多样式元素,半透明元素,无属性元素
在没有合理的控件元素命名的情况下,如果单纯用图片匹配的方式,很难剔除背景色对图片匹配结果的影响
【技术方案】
1、采用yolo进行UI界面非文字元素的目标检测模型训练
2、采用paddleocr进行UI界面文字的识别
3、在测试脚本中增加自动截图,在执行自动化用例时自动收集分析
4、采用yolo+ocr文字识别的模式对界面的各个非文字元素和文字中心位置进行识别确定
5、android可以结合uiautomator2进行坐标点击,iOS结合facebook-wda
【非文字元素目标检测】
【文字元素检测】
【API】
功能 |
语法 |
备注 |
目标识别 连接指定设备 |
AI= AI_Elements('设备序列号') |
|
获取所有识别到的非文字元素的中心点坐标 |
AI.get_all_elements()
|
返回类型为字典类型,key为元素,value为识别到元素的中心坐标点位置 |
判断元素是否存在 |
AI.yolo_exists('元素1','元素2','...') |
yolo_exists(*args:str),根据所要识别的个数自行填写。某个元素不存在直接断言False,都存在返回True |
判断元素是否不存在 |
AI.yolo_not_exists('元素1','元素2','...') |
yolo_not_exists(*args:str),根据所要识别的个数自行填写。某个元素存在直接断言False,都不存在返回True |
对非文字元素进行点击 |
AI.yolo_click('元素') |
yolo_click(key_word:str,number:int=1) 若某个元素在页面出现多次,默认点击识别中心点位置最高的元素,可根据number参数调整点击第几个,若元素不存在,会断言False |
获取识别到的文字内容 |
AI.get_all_ocr()
|
返回类型为列表类型,包含识别内容的四个点坐标,文字信息,以及置信度 |
判读元素是否存在 |
AI.ocr_exists('文字1','文字2','...') |
ocr_exists(*args:str),根据所要识别的个数自行填写。某个文字不存在直接断言False,都存在返回True |
判断元素是否不存在 |
AI.ocr_not_exists('文字1','文字2','...') |
ocr_not_exists(*args:str),根据所要识别的个数自行填写。某个文字存在直接断言False,都不存在返回True |
对文字内容进行点击 |
AI.ocr_click('元素') |
yolo_click(key_word:str,number:int=1) 若某个元素在页面出现多次,默认点击识别坐标位置最高的元素,从上到下,从左到右,可根据number参数调整点击第几个,若元素不存在,会断言False |
播放器严重卡顿检测 |
AI.carton_test() |
carton_test(self,number:int=20) number代表截多少张图验证是否有卡顿 |
分类检测(绿屏、黑屏、模糊) |
AI.anomaly_detection(times=10) |
times指定截取多少张图片,判定是否存在异常,若有异常会断言失败保存异常截图 |
【android实操demo(截图说明)】
'''
第一步启动app
'''
AI.app_start()
'''第二步等待5秒,等待进入首页'''
time.sleep(5)
'''第三步骤,判断是否在首页,以是否有首页的元素,我的日常、搜索、以及feed框架进行判断
'''
AI.yolo_exists(
'搜索', '我的日常', 'feed框架')
'''第四步,点击文字视频的tab,使feed都为视频
'''
AI.ocr_click(
'视频')
'''
第五步,点击feed框架进入视频
'''
AI.yolo_click('feed框架')