Airtest实施手机精准截图
Airtest实施手机精准截图
一、接口查找
首先我们需要知道我们应该怎么实现用脚本去进行局部截图,我们可以通过翻阅Airtest的API文档发现,Airtest提供了 crop_image(img, rect) 方法可以帮助我们实现局部截图,在我们往期的推文里也介绍过该接口:
二、简单用例
三、代码实现
__author__ = "AirtestProject"
from airtest.core.api import *
from airtest.aircv import *auto_setup(__file__)from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)#获取屏幕分辨率
android = device()
xy=android.get_current_resolution()screen = G.DEVICE.snapshot()#使用poco去寻找控件
if poco(text="游戏增强器").exists():a=poco(text="游戏增强器").get_position()#获取控件的中心坐标b=poco(text="游戏增强器").get_size()#获取控件的实际长宽#计算左上角坐标,转化成绝对坐标x1=int((a[0]-0.5*b[0])*xy[0])y1=int((a[1]-0.5*b[1])*xy[1])#计算右下角坐标,转化成绝对坐标x2=int((a[0]+0.5*b[0])*xy[0])y2=int((a[1]+0.5*b[1])*xy[1])# 局部截图screen = aircv.crop_image(screen,(x1,y1,x2,y2))# 保存局部截图到log文件夹中try_log_screen(screen)
四、封装函数
4.1. 获取坐标
# 获取坐标
def huoqu_zuobiao(lable):# 获取标签lable_pos= lable.attr("pos")lable_size= lable.attr("size")lable_0x = (lable_pos[0] - lable_size[0]/2)*x_0lable_0y = (lable_pos[1] - lable_size[1]/2)*y_0lable_1x = (lable_pos[0] + lable_size[0]/2)*x_0lable_1y = (lable_pos[1] + lable_size[1]/2)*y_0lable_zuobiao = [lable_0x,lable_0y,lable_1x,lable_1y]# print([zhutu_0x,zhutu_0y,zhutu_1x,zhutu_1y])# print(lable_zuobiao)return(lable_zuobiao)
4.2 、截图
# 截图
def jietu(zuobiao,lujing,s_0):screen = G.DEVICE.snapshot()tu_pian = aircv.crop_image(screen,zuobiao)print("截图中0")# xia_1y = tupian_pos_1y# 保存局部截图到指定文件夹中pil_image = cv2_2_pil(tu_pian)print("截图中1")#filename_0 = (datetime.datetime.fromtimestamp(s_0)).strftime("%Y_%m_%d_%H_%M_%S_%f")# filename_00 = timestamp_to_datetime()# filename_0 = filename_00 filename_0 = timestamp_to_datetime()print("截图中2")a_image = str(filename_0)print(a_image)# 设置单张截图的最大尺寸不超过1200*1200# snapshot(filename="test2.png", msg="test02", quality=90, max_size=1200)# G:\多多买菜项目\西安买菜项目\西安多多买菜项目.air\图片print("截图中3")path = lujing+"/{}.png".format(a_image)print("截图完成{}".format(path))print("截图中4")pil_image.save(path.format(a_image), quality=99, optimize=True)print("截图中5")print("截图完成")return(path)
4.3、截图命名
def timestamp_to_datetime():# 示例时间戳timestamp = time.time()# 将时间戳转换为datetime对象dt_object = datetime.fromtimestamp(timestamp)# 返回格式化的年月日时分秒毫秒# str_m = str(dt_object.strftime('%Y_%m_%d_%H_%M_%S_%f')[:-2])str_m = str(dt_object.strftime('%Y_%m_%d_%H_%M_%S_%f'))print(str_m)print(type(str_m))return(str_m)
五、扩展
5.1、读取文件行数
def read_specific_line(filename, lineno):"""读取文件中的指定行:param filename: 文件名:param lineno: 行号(从1开始计数):return: 指定行的内容,如果行号不存在,返回None"""try:# linecache从1开始计数,所以需要减1line = linecache.getline(filename, lineno)except IOError:print(f"无法打开文件: {filename}")line = Nonereturn line.strip() # 移除行尾的换行符
5.2 字符串转为日期并对比
def duibi_riqi(string):date_00 = "2023/01/01"date_11 = re.findall(r'\d{1,4}[/-]\d{1,2}[/-]\d{1,4}', string)date_11 = date_11[0]print('提取日期{}'.format(date_11))# 使用strptime转换为日期# date = datetime.strptime(date_string, "%Y-%m-%d")date_0 = datetime.strptime(date_00, '%Y/%m/%d')date_1 = datetime.strptime(date_11, '%Y/%m/%d')print('类型',type(date_0),type(date_0))print('提取日期{},{}'.format(date_0,date_1))if date_1 < date_0:jieguo = "小于"elif date_1 > date_0:jieguo = "大于等于"else:jieguo = "大于等于"print(jieguo)return(jieguo)