前几天,一个小姐姐私聊我,说每次打开微信,界面上密密麻麻的红点提示让她很难过,一条条消息都要点进去,太赶时间了-消耗和焦虑。本文将使用我之前讲过的UiAutomator2来写一个自动化脚本来帮助小姐姐解决这个问题。在开始实战之前,需要做以下准备工作:1、PC端配置Android开发环境2、安装依赖库和应用其中:uiautomator2负责Automation;weditor负责连接设备并检查应用程序的界面元素。agent应用安装apk服务到手机python-muiautomator2init实战实战前在命令行输入weditor命令,浏览器会自动打开设备管理页面查看手机IP地址电话。通过IP地址连接设备后,界面会显示设备界面当前Element信息1.打开微信App,通过局域网内的IP地址连接设备,然后通过包名打开应用微信Appimportuiautomator2asu2微信App包名PACKAGE_NAME='com.tencent.mm'连接设备自身。device=u2.connect('192.168.0.101')获取屏幕宽高self.width,self.height=self.device.window_size()使用应用包名打开Appself.device.app_start(PACKAGE_NAME,stop=True)2.等待主页加载。由于上面冷启动App是比较耗时的,所以需要等待首页的页面元素加载完成。使用WEditor定位并获取底部Tab的元素ID,然后使用“ID+文本内容”定位Tab控件。通过设置A最大超时时间,等待查询控件成功def__wait_home_appear(self):"""等待首页加载:return:"""self.device(resourceId='com.tencent.mm:id/中央情报局,text='微信').wait(timeout=20)self.device(resourceId='com.tencent.mm:id/cns',text='联系人').wait(timeout=20)self.device(resourceId='com.tencent.mm:id/cns',text='discovery').wait(timeout=20)self.device(resourceId='com.tencent.mm:id/cns',text='discovery').wait(timeout=20)print('首页加载完成')3.判断是否有未处理的消息同上,使用WEditor获取顶部Tab未读消息控件的文本内容如果文本内容不为空,这意味着有未处理的消息;否则直接退出程序def__has_unread_msg(self):"""是否有未读消息:return:"""try:number_unread_msg=self.device(resourceId='com.tencent.mm:id/gik')returnnumber_unread_msg.get_text()!=""除了异常:返回False4。查找未处理的消息并处理它们。在当前界面搜索消息列表,过滤掉头像右上角包含数字的控件。如果搜索到的元素不为空,文本内容为大于0的整数,则模拟点击操作,不处理消息返回主页面controlelement=self.device(resourceId='com.tencent.mm:id/ga3',instance=0)ifelement.existsandself.__is_number(element.get_text()):有未处理的消息element.click()ifnotself.__is_home_page():返回首页self.device.press('back')else:没有未处理的消息pass5,搜索和定位优化有2种方式查找定位所有未读消息,分别是:上下滑动循环当前界面,快速点击bottomTab两次直接跳转到未处理的消息这里消息项推荐后者,因为第二种方式更稳定准确,并支持圆形定位搜索。我们获取底部Tab控件的中心点坐标,使用double_click()指定两次点击时长为0.05s,模拟两次快速点击defclick_twice_quickly(device,element):"""快速阅读点击双击:paramdevice::paramid:控件ID:return:"""bounds=element.bounds()center_x,center_y=((bounds[2]+bounds[0])/2,((bounds[3]+bounds[1])/2))print(center_x,center_y)device.double_click(center_x,center_y,0.05)6.循环操作只需要循环判断是否有未处理的消息即可。如果有,快速点击底部的Tab,定位到未读消息项,进行读取操作,直到没有未处理的消息whileTrue:有未读消息ifself.__has_unread_msg():连续点击两次,快速locateclick_twice_quickly(self.device,element)处理未读消息readmessagepasshasnounreadmessageselse:logger.debug('Thereisnomorereadablemessages,exit!')break最后,通过上面的例子,我们处理完了所有首页消息的未读消息;通讯录、朋友圈、私信提示也可以同理
