潍坊外贸网站制作,企业网站设置费用,如何在wordpress首页显示文章列表,商城网页制作1. 前言 上一篇推文利用一个在图片范围内实现随机坐标点击的例子#xff0c;去教会大家如何将自己想要的效果实现出来#xff0c;受到大家的热情反响#xff0c;在我们官方讨论群中#xff0c;还有大佬对我们的示例代码进行优化改进#xff0c;做了很多合理的函数封装去教会大家如何将自己想要的效果实现出来受到大家的热情反响在我们官方讨论群中还有大佬对我们的示例代码进行优化改进做了很多合理的函数封装以及减少了示例脚本内的二次查找等问题我们也征得大佬同意将他的代码与大家分享一下~大佬来自Airtest官方讨论3群-Moty
2. 代码分享 Moty同学是通过在本地python环境安装Airtest库去进行Airtest自动化脚本编写的同时该脚本在AirtestIDE上是可以完美适配运行的。所以大家在编写自动化脚本的时候可以有多重选择但是AirtestIDE在代码编写上也有很多方便大家的小设计小巧思大家也可以多多使用我们的AirtestIDE啊~ 废话不多说我们先来看看Moty同学代码的运行情况可以看到通过生成随机坐标的形式点击图片上的任意点这里用计算器去具象化可以看到每次随机坐标可以点击不同数字或者数字的不同位置每次运行都可以获得随机的数字序列。 看起来很厉害的样子我们应该这么去实现呢让我们来看看Moty同学的代码吧~
# -*- encodingutf8 -*-
__author__ Motyfrom airtest.core.api import *
from airtest.cli.parser import cli_setup
from airtest.core.error import *
from airtest.core.settings import Settings as ST
import random
获取模板匹配的目标区域的矩形 这一部分实现参考 cv.py 中 loop_find 部分
: param : tpl 模板
: param : intervalfunc 没有合适匹配时的回调函数
: return 最佳匹配的矩形区域(x1,y1,x2,y2)
def rectangle(tpl,intervalfuncNone): G.LOGGING.info(Try finding: %s, tpl)start_time time.time()while True:screen G.DEVICE.snapshot(filenameNone, qualityST.SNAPSHOT_QUALITY)if screen is None:# 如果截图为空则可能是屏幕锁定了G.LOGGING.warning(Screen is None, may be locked)else:match_result tpl._cv_match(screen)if match_result:try_log_screen(screen)# 这里 rect 得到的是 4个坐标点 取出左上右下角 得到(x1,y1,x2,y2) 元组rect match_result.get(rectangle)if rect is not None:return (round(rect[0][0]) , round(rect[0][1]) , round(rect[2][0]) , round(rect[2][1]))if intervalfunc is not None:intervalfunc()# 超时则raise未超时则进行下次循环:if (time.time() - start_time) ST.FIND_TIMEOUT:try_log_screen(screen)# 如果超时则抛出异常raise TargetNotFoundError(Picture %s not found in screen % tpl)else:time.sleep(0.5)
param : rect : 矩形区域 或模板
return : 区域内的随机坐标
# 获取矩形区域内的随机坐标
def random_point(rect):# 如果传入的是图片则获取图片匹配的矩形区域if isinstance(rect, Template):x1, y1, x2, y2 rectangle(rect)else:x1, y1, x2, y2 rect# 在矩形区域内随机生成一个坐标点x random.randint(x1, x2)y random.randint(y1, y2)return x, y
在 矩形范围内 随机点击
param : v : 目标区域 or 模板 or 坐标点兼容touch
param : times : 点击次数
return 最终点击的点的坐标logwrap
def random_touch_in_area(v, times1, **kwargs):if isinstance(v, Template) or (isinstance(v, tuple) and len(v) 4):pos random_point(v)else:try_log_screen()pos v
# 在目标区域内随机点击for _ in range(times): G.DEVICE.touch(pos, **kwargs) time.sleep(0.05) delay_after_operation() return posif __name__ __main__:# 如果没有通过命令行连接设备则使用该连接命令若使用IDE运行则可忽略这段代码不用写上if not cli_setup():auto_setup(__file__, logdirNone, devices[android:///,])# 录制图片tpl Template(rtpl1697636105500.png, record_pos(0.243, -0.165), resolution(1080, 2280))# 获取模板匹配的目标区域的矩形result rectangle(tpl)print(f图片所在矩形区域 {result})# 在目标区域内随机点击for i in range(10):p random_touch_in_area(tpl)print(f第 {i1:02d} 次点击坐标 {p})sleep(1)可以看出来在编写代码的时候Moty同学将每一个步骤进行函数封装后可以减少二次查找的次数以及代码冗余Moty同学的编写思路很值得我们学习~
3.小结
最后希望同学们在学习以及使用Airtest的时候可以先学习方法掌握代码编写技巧后对自己的脚本可以进行优化再优化从而实现代码收益最大化。同时我们也鼓励大家在学习我们的官方教程脚本的时候进行优化再创作也可以到我们官方Q群进行投稿噢~
官方Q群目前1、2、3群已满大家可以加入4群117973773。
这里附上我们官方教程文档的网址欢迎同学们查阅哦https://airtest.doc.io.netease.com/。