【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!

2023-10-28 00:52

本文主要是介绍【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 前言

上一篇推文利用一个在图片范围内实现随机坐标点击的例子,去教会大家如何将自己想要的效果实现出来,受到大家的热情反响,在我们官方讨论群中,还有大佬对我们的示例代码进行优化改进,做了很多合理的函数封装,以及减少了示例脚本内的二次查找等问题;我们也征得大佬同意,将他的代码与大家分享一下~(大佬来自Airtest官方讨论3群-Moty)

2. 代码分享

Moty同学是通过在本地python环境安装Airtest库去进行Airtest自动化脚本编写的,同时该脚本在AirtestIDE上是可以完美适配运行的。所以大家在编写自动化脚本的时候,可以有多重选择;但是AirtestIDE在代码编写上也有很多方便大家的小设计小巧思,大家也可以多多使用我们的AirtestIDE啊~

废话不多说,我们先来看看Moty同学代码的运行情况,可以看到通过生成随机坐标的形式,点击图片上的任意点,这里用计算器去具象化,可以看到每次随机坐标可以点击不同数字或者数字的不同位置,每次运行都可以获得随机的数字序列。

在这里插入图片描述

看起来很厉害的样子,我们应该这么去实现呢,让我们来看看Moty同学的代码吧~

# -*- encoding=utf8 -*-
__author__ = "Moty"from 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,intervalfunc=None):  G.LOGGING.info("Try finding: %s", tpl)start_time = time.time()while True:screen = G.DEVICE.snapshot(filename=None, quality=ST.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, times=1, **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__, logdir=None, devices=["android:///",])# 录制图片tpl = Template(r"tpl1697636105500.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"第 {i+1:02d} 次点击坐标 {p}")sleep(1)

可以看出来,在编写代码的时候,Moty同学将每一个步骤进行函数封装后,可以减少二次查找的次数以及代码冗余,Moty同学的编写思路很值得我们学习~

3.小结

最后,希望同学们在学习以及使用Airtest的时候,可以先学习方法,掌握代码编写技巧后,对自己的脚本可以进行优化再优化,从而实现代码收益最大化。同时,我们也鼓励大家在学习我们的官方教程脚本的时候,进行优化再创作,也可以到我们官方Q群进行投稿噢~

官方Q群:目前1、2、3群已满,大家可以加入4群(117973773)。

这里附上我们官方教程文档的网址,欢迎同学们查阅哦:https://airtest.doc.io.netease.com/。

这篇关于【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/289578

相关文章

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

centos6一键安装vsftpd脚本

centos6一键安装vsftpd脚本 手动安装vsftpd参考教程:Centos下安装Vsftpd的图文教程 vsftpd脚本功能: 1.安装 (命令执行:sh xxx.sh)2.添加ftp用户 (命令执行:sh xxx.sh add)3.卸载vsftpd (命令执行:sh xxx.sh uninstall) 测试环境:centos6 x64 centos6 x86(测试centos7以

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re