Airtest新手升级:一个相对完整的纯.py脚本是怎样子的

news2025/2/26 22:20:19

1. 前言

一直以来,Airtest的教程都倾向于编写 .air 脚本,但本质上,它还是python脚本来的。今天我们就来补上这个缺口,一起来看下一个相对完整的纯 .py 脚本是什么样子的。

2. 例子一:纯py的Airtest脚本

有时候,我们只是想借助Airtest连接设备的功能,然后实现一些小任务,比如简单的装包任务等,而不是截一堆图片做自动化测试。

这种情况下,我们只需要简单编写一个纯py脚本即可:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
from airtest.cli.parser import cli_setup

def get_app_screen_shot(apk_file, package_name):
    """ 
        Connect an android device, automatically complete the app installation, open, screenshot, close, uninstall.
        Finally you will get a screenshot from app in logdir.

        Args:
            apk_file: apk file route in your windows computer.
            package_name: package_name of your app.

        Returns: None
    """

    # 连接设备以及初始化工作 log文件夹默认生成在当面目录下 
    auto_setup(__file__, logdir=True, devices=["Android:///",],)
    # 唤醒手机屏幕
    wake()
    # 通过windows上apk包体下载app到手机上
    install(apk_file)
    # 启动下载好的app
    start_app(package_name)
    # 等待5s app完全启动
    sleep(5)
    # 截图 并保存到logdir路径下
    snapshot("screen_shot.png")
    # 关闭app
    stop_app(package_name)
    # 卸载app
    uninstall(package_name)

if __name__ == '__main__':
    # 设置apk文件路径以及对应包体名称
    APK_FILE = r"C:\Users\AirtestProject\Desktop\NeteaseCloudMusic_Music_official_8.6.50.211229222733_32.apk"
    PACKAGE_NAME = "com.netease.cloudmusic"
    try:
        get_app_screen_shot(APK_FILE, PACKAGE_NAME)
    except Exception as err:
        # 记录报错到logdir下的log.txt文件中,并截图保存发生错误时的手机屏幕
        log(err, desc="Finale Error", snapshot=True)

1)纯py脚本的设备连接

对于纯py脚本,我们需要在脚本里面,明确写明连接设备的脚本 。而.air脚本,如果有使用auto_setup(file),则会自动帮我们连接第一台Android设备。这也是刚从.air脚本刚刚切换成纯py脚本的同学,经常容易忽略的一点。

所以上述示例中,我们在auto_setup接口里面明确连接了Android设备,当然,Airtest连接设备,还有很多种方式,感兴趣的同学可以参考我们官方教程文档中,Airtest连接设备脚本的介绍章节:

https://airtest.doc.io.netease.com/IDEdocs/airtest_framework/2_connect_device/ 。

2)纯py脚本的log保存

类似的还有纯py脚本的log保存,也需要我们在脚本开头时,明确写明。是否保存log,取决于同学们最终想不想生成报告。因为报告的生成,是依赖于脚本运行log的。

如果我们不保存log,则最后我们也就没有办法依赖于log来生成测试报告。

3)airtest的核心api

上述简单的装包测试任务中,涉及到一些Airtest核心API,比如:

  • 唤醒屏幕:wake()
  • 安装应用:install()
  • 启动应用:start_app()
  • 截图:snapshot()
  • 卸载应用:uninstall()

我们可以从Airtest的核心API文档中,来熟悉这部分的内容:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html 。

3. 例子二:纯py的Poco脚本

说完了纯py的Airtest脚本,当然少不了我们纯py的Poco脚本啦。下述示例中,包含了连接设备、初始化Android poco、简单的poco操作、记录报错到log里,最后生成测试报告。

# -*- encoding: utf-8 -*-

from airtest.core.api import *
from airtest.report.report import simple_report
from poco.drivers.android.uiautomation import AndroidUiautomationPoco

def demo():
    # 连接设备以及初始化工作 log文件夹默认生成在当面目录下 
    auto_setup(__file__, logdir=True, devices=["Android:///",],)
    # 初始化poco
    poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
    # 执行一些操作 确保手机app已登录并跳转到app初始化界面
    try:
        # 以下操作执行:我的-》我喜欢的音乐-》点击播放
        poco(text="我的").click()
        poco(text="我喜欢的音乐").click()
        # 灵活结合ide提供的poco ui树获取播放按钮name属性值 
        poco(name="com.netease.cloudmusic:id/minPlayBtn").click()
    except Exception as err:
        # 记录报错到logdir下的log.txt文件中,并截图保存发生错误时的手机屏幕
        log(err, desc="Finale Error", snapshot=True)
    # 无论运行是否成功 输出报告
    finally:
        # 默认生成html报告到脚本所在的同级目录下
        simple_report(__file__, logpath=True)

if __name__ == '__main__':
    demo()

1)记录报错到日志中

示例中,采用了try-except-finally的语法,即尝试做一些poco操作之后,不论成功失败,最后都会生成测试报告。

需要注意的是,在except中,我们使用log接口记录了报错到日志里面。这样做的好处是,万一try里面有某个步骤失败了,不会因为报错被try捕捉了,而不在报告里面体现出来。

不使用log接口记录报错:

图片

图片

使用log接口记录报错:

图片

图片

图片

2)纯py脚本生成报告

Airtest支持使用 simple_report 和 LogToHtml 来生成测试报告。在纯py脚本里面,我们特别需要注意,脚本开头时,log内容保存在哪里,生成报告的时候,就要指向去哪里找log内容,避免出现生成不了报告、生成了错误的报告等情况。

4. 小结

今天我们讲解了2个简单的纯py脚本的小例子,希望想从.air脚本,改成纯py脚本的同学,可以多多练习。


资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python-新建-Django项目-调试-显示mysql数据库表内容-HelloWorld

文章目录1.Pycharm-开发编辑器2.HelloWorld程序范例3.代码调试4.连接数据库-mysql4.1.安装好mysql数据库4.2.创建项目4.3.数据库表转模型4.4.前端展示5.总结1.Pycharm-开发编辑器 文件->新建项目->选择Django。接着在控制台输入命令: python -m django --ver…

【C语言】分支语句 循环语句 _训练题型加深理解

1.分支语句 自从学习编程以来每天都在写分支语句,那么什么是分支语句呢? 下面举两个生动的例子来更好的理解分支语句: 比如我们买东西,要么支付现金,要么使用微信或者支付宝。在大学如果你好好学习,校招…

SpringBoot简单使用MongoDB

SpringBoot简单使用MongoDB一、配置步骤1、application.yml2、pom3、entity4、mapper二、案例代码使用1、库前期准备上一篇安装MongoDB地址http://t.csdn.cn/G4oYJ 一、配置步骤 进入mongodb中创建数据库和用户 # (1)授权 # 我的管理员是root&#xf…

umi项目本地开发环境远程打开的问题

qiankun主应用加载子应用时,url指定了localhost const getEntry (base: string, port: number) > {const host: string location.hostnamereturn process.env.NODE_ENV development? http://${host}:${port}${base}: ${base}/index.html }而getEntry是用于q…

Cloud Keys Delphi Edition安全地存储

Cloud Keys Delphi Edition安全地存储 使用流行的基于云的密钥管理服务安全地管理密钥和机密。 云密钥可以轻松地将基于云的密钥和秘密管理与任何支持的平台或开发技术集成。这些易于使用的组件可用于与流行的云密钥管理提供商(如Amazon KMS、Amazon AWS Secrets、Azure key Va…

初识 Node.js 与内置模块:初识 Node.js及Node.js 环境的安装

回顾与思考 1. 已经掌握了哪些技术 2. 浏览器中的 JavaScript 的组成部分 3. 思考:为什么 JavaScript 可以在浏览器中被执行 4. 思考:为什么 JavaScript 可以操作 DOM 和 BOM 每个浏览器都内置了 DOM、BOM 这样的 API 函数,因此,…

【云原生之k8s】k8s资源限制以及探针检查

文章目录一、资源限制1、资源限制的使用2、reuqest资源(请求)和limit资源(约束)3、Pod和容器的资源请求和限制4、官方文档示例5、资源限制实操5.1 编写yaml资源配置清单5.2 释放内存(node节点,以node01为例…

Moonbeam Illuminate/22线上生态盛会|Derek开场演讲

TL;DR Derek:Moonbeam是我认为最佳的实现Web3梦想的平台。一年中近300个项目已经部署在了Moonbeam生态,发展显著优于行业平均。Moonbeam正在构建被成为“Connected Contracts”的原生跨链方案。Moonbeam基金会新设立Moonbeam加速器,帮助Moon…

时间序列预测之为何舍弃LSTM而选择Informer?(Informer模型解读)

LSTM的劣势 Figure 1: (a) LSTF can cover an extended period than the short sequence predictions, making vital distinction in policy-planning and investment-protecting. (b) The prediction capacity of existing methods limits LSTF’s performance. E.g., startin…

Nginx快速入门及配置文件结构

Nginx快速入门教程Nginx 简介Nginx 特性Nginx 架构Nginx 相比Apache的优点Nginx 的安装启动、停止和重新加载 Nginx 配置Nginx 配置文件结构Nginx 工作流程总结后言Nginx 简介 Nginx是 HTTP 和反向代理服务器,邮件代理服务器,以及 Igor Sysoev 最初编写…

传统防火墙与Web应用程序防火墙(WAF)的区别

前言 由于WEB应用防火墙(WAF)的名字中有“防火墙”三个字,因此很多人都会将它与传统防火墙混淆。实际上,二者之间的有着很大的差别。传统防火墙专注在网络层面,提供IP、端口防护。而WAF是专门为保护基于Web的应用程序…

学生用白炽灯好还是led灯好?2022最专业学生护眼灯推荐

现阶段的学生视力都普遍出现近视低龄化,所以在护眼方面,家长都非常重视的,有人问:学生用白炽灯好还是led灯好? 我的回答是LED灯更适合现在家庭使用,给大家分析一下。 白炽灯是由灯丝发热产生光亮&#xff…

多层串联拼接网络

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

Pytorch ——特征图的可视化

文章目录前言一、torchvision.models._utils.IntermediateLayerGetter*注意:torcvision的最新版本0.13,已经取消了pretrainedTrue这个参数,并且打算在0.15版正式移除,如果用pretrained这个参数会出现warring警告。现在加载与训练权…

【项目实战】springboot+vue舞蹈课程在线学习系统-java舞蹈课程学习打卡系统的设计与实现

注意:该项目只展示部分功能,如需了解,评论区咨询即可。 本文目录1.开发环境2 系统设计2.1 背景意义2.2 技术路线2.3 主要研究内容3 系统页面展示3.1 学生3.2 教师页面3.3 管理员页面4 更多推荐5 部分功能代码5.1 查看学生打卡5.2 文件上传下载…

天翼云实时云渲染,助力打造世界VR产业大会云上之城

2022年11月12日,2022世界VR产业大会于江西南昌开幕。11月13日,以“共建元宇宙生态,点亮新数智未来”为主题的中国电信生态论坛召开。由天翼云携手新国脉数字文化股份有限公司(简称“国脉文化”)打造的元宇宙家园国脉大…

【力扣刷题】只出现一次的数字

🔗 题目链接 题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 …

java类的练习 -- 声明一个接口(Calculability),接口中

java类的练习 – 声明一个接口(Calculability),接口中… 题目 编写一个应用程序,实现以下功能: ①声明一个接口(Calculability),接口中包含一个方法area()。 ②声明一个三角形类实现该接口,类名为Triangle&#xf…

React源码分析2-深入理解fiber

react16 版本之后引入了 fiber,整个架构层面的 调度、协调、diff 算法以及渲染等都与 fiber 密切相关。所以为了更好地讲解后面的内容,需要对 fiber 有个比较清晰的认知。本章将介绍以下内容: 为什么需要 fiberfiber 节点结构中的属性fiber 树…

AR眼镜新秀雷鸟创新,究竟能飞多远?

时隔近十年之后,消费级AR眼镜又重新高调回归大众视野。 自去年10月开始,以OPPO、小米为代表的国内大厂纷纷推出试验性AR眼镜,谷歌第二代AR眼镜更是作为压轴在I/O大会上重新回归,苹果多年来不断提及但始终“难产”的AR产品&#x…