前言
在之前的基于vision-ml模型训练框架改造以及实际场景应用识别弹窗,我们基于模型训练去处理我们的弹窗,但是呢,在一些界面弹窗是一样的,但是,文字是不一样的,那么我们呢怎么根据文字的不同去处理不同的弹窗呢?本文带你揭秘。
正文
我们的需求是处理文案不同但是弹窗类型相似,很多人都想到来ocr,那么对于ocr来说,有商业化的。但是也有开源的,那么我们基于免费的开源的去改造即可。这里我们选取来美团开源的
https://github.com/Meituan-Dianping/vision-ui,其实它还是基于vision-ml训练出来的模型。我们改造的地方呢,不是模型,我们是把它改造成本地的文本识别。其他的地方不用动。我们就不用了接口。把接口改成本地调用。
代码语言:javascript复制from service.image_text import get_image_text
def get_text_pson(img_path:str,text:str):
resluttext = get_image_text(img_path)
for item in resluttext['roi_text']:
if item['text'] == text:
return item['pos']
return ''
我们把源代码的
和
抽离了出来,然后我们现在就可以给文字和图片然后返回来图片的坐标。
我们传入这样一张图片,然后文字是同意并继续。我们看下最后的结果
我们去执行了
代码语言:javascript复制adb shell input tap 609 372
可以看到设备上可以正常点击。那么我们可以把这个功能封装成我们处理一些安装的时候出现的文本弹窗,把文字统一存储起来。
准备了一些文本。
代码语言:javascript复制同意并使用
确认
确定
同意
允许
去允许
始终允许
总是允许
始终
始终同意
同意并继续
同意并使用
立即安装
安装
完成
安装允许
继续安装
我已知问题严重性。无视风险安装
知道了
验证
继续安装
那么去解析下文本
代码语言:javascript复制def readtext():
allText=[]
with open("text") as f:
reslut=f.readlines()
for i in reslut:
allText.append(i.split("n")[0])
return allText
我们来一个最暴力的,我们认为第一个识别的图片就是我们要点击的。
代码语言:javascript复制def get_posion(img_path:str):
allText =readtext()
resluttext=get_image_text(img_path)
for item in resluttext['roi_text']:
if item['text'] in allText:
return item['pos']
return ''
这样就返回了一个坐标。我们在本地可以同样测试
代码语言:javascript复制result=get_posion("01.png")
print(result)
还是同一个图片,结果正常返回上面的坐标,我们的效果可以实现了。
其实很简单,就是把开源的训练好的模型拓展到实际项目中。这里我们可以做成在我们安装app过程中处理安装权限弹窗和安装过程中的各种文本弹窗去解决我们的实际的问题。但是目前还欠缺的是,有些设备需要输入密码,目前还没有解决输入密码的,但是有一个方案,就是在上面的进行改造。我说下我的思路,
代码语言:javascript复制1.安装过程截图
2.获取截图文字
3.请输入账号存在识别文字中
4.用input输入账号即可。
这里不做实际代码演示。写一个伪代码
代码语言:javascript复制def get_posion(img_path:str):
allText =readtext()
resluttext=get_image_text(img_path)
for item in resluttext['roi_text']:
if str(item['text']).__contains__("请输入"):
#执行输入密码,可以用adb,我们默认请输入的坐标就是密码输入框
pass
if item['text'] in allText :
return item['pand os']
return ''
大概就分享这么多。上面的是伪代码,未进行详细测试。请实际项目中大家自行验证。
基于模型避免了一些手机上按钮的样式会发生改变,使用坐标的方式来处理。后续会把这个的代码放在appium相关的分享中去做展示。我改造的部分的代码已经全部贴上去了。需要原框架的部分代码也已经做了截屏。大家可以快速的在实际项目中尝试使用。