Excle表格样式实现安卓APPUI自动化
概述
该工具通过excle数据(用例)文档+UIautomator2关键字驱动,可以实现类似robotframework一样的表格化的自动化UI测试,作用如下:
1.可以通过打包后,方便不会编程的测试人员通过在excle的sheet表中进行表格化的内容编写,再执行exe文件进行自动化的UI测试。
2.该工具主要用于回归测试,特别是针对那种出现概率较低的案例,可以通过反复的执行UI流程进行问题的复现或者最终的功能确认。
说明文件如下(readme.text):
脚本介绍
tools 目录
u2_tools.py
# 创建者:zhangxuexin
# 创建时间:2022/6/24 20:23
import sys
import uiautomator2 as u2
from tools.read_log import logger
import time
from tools.single_file_packaging import dir_fileclass U2_Tools():'''该类用于封装uiautomator2的各种操作,以作为工具类来使用'''try:d = u2.connect()logger.info("已正确连接设备……")except Exception as e:sys.exit(logger.critical(f"设备连接失败,失败错误原因为:{e}"))# 用于启动所要测试的Appdef start_app(self, text):try:self.d.app_start(text)logger.info(f"测试App已经成功启动!")except Exception as e:sys.exit(logger.critical(f"测试App启动失败,失败错误原因为:{e}"))# 用于关闭所要测试的Appdef stop_app(self, text):try:self.d.app_stop(text)logger.info(f"测试App已经成功关闭!")except Exception as e:sys.exit(logger.critical(f"测试App关闭失败,失败错误原因为:{e}"))# 用于定位App中的元素def loction(self, attribute, value):if attribute == 'resourceId':return self.d(resourceId=value)elif attribute == 'text':return self.d(text=value)# 用于点亮设备屏幕def screen_on(self):try:self.d.screen_on()logger.info('屏幕已经点亮')except Exception as e:logger.error(f'屏幕点亮失败,失败原因{e}')# 用于操作过程中隐式等待def hide_wait(self, text):try:self.d.implicitly_wait(text)logger.info(f"操作过程中进行隐式等待,最高{text}秒")except Exception as e:logger.error("操作过程中进行隐式等待失败")# 用于元素点击操作def click(self, attribute, value):try:self.loction(attribute, value).click()logger.info(f'操作的元素信息为:[{attribute}]-[{value}],点击操作成功')except Exception as e:logger.error(f'错误信息为:{e},操作的元素信息为:[{attribute}]-[{value}],点击操作失败')self.image_save() # 如果点击操作失败,则进行当前页面的截图# 用于输入操作def send_keys(self, attribute, value, text):try:self.loction(attribute, value).send_keys(text)logger.info(f'操作的元素信息为:[{attribute}]-[{value}],输入内容为:{text},输入操作成功')except Exception as e:logger.error(f'错误信息为:{e},操作的元素信息为:[{attribute}]-[{value}],输入内容为:{text},输入操作失败')self.image_save() # 如果输入操作失败,则进行当前页面的截图# 用于图片保存操作def image_save(self):try:img = self.d.screenshot() # 进行截屏logger.info("进行截屏操作")image_name = f'{time.strftime("%Y%m%d-%H%M%S")}.png' # 设置图片名称按照当前时间logger.info(f"截屏成功,截取的图片名称为{image_name}")image_path = dir_file() + f"\\report\\image\\{image_name}" # 设置图片存储路径logger.info(f"将截取的图片保存到{image_path}")img.save(image_path)logger.info("图片保存成功")except Exception as e:logger.error(f"图片保存失败,失败原因{e}")# 用于捕获所定位元素是否存在的验证def assert_text(self, attribute, value):try:assert self.loction(attribute, value).exists(timeout=10)logger.info(f'操作的元素信息为:[{attribute}]-[{value}],验证操作成功')return Trueexcept Exception as e:logger.error(f'错误信息为:{e},操作的元素信息为:[{attribute}]-[{value}],验证操作失败')self.image_save() # 如果验证失败,则进行当前页面的截图time.sleep(2)return False
read_excle.py
# 创建者:zhangxuexin
# 创建时间:2022/6/25 19:00
import openpyxl as op
from tools.read_log import logger
from tools.read_config import cr
from tools.u2_tools import U2_Tools
from tools.single_file_packaging import dir_filedef read_excle():'''同于读取excle并调用方法'''# 读取Excle文件(通过配置文件中的数据地址)wb = op.load_workbook(cr.read_strconfig('Default', 'data_path'))# print(wb)kwargs = {} # 设置一个空字典用于放置遍历出来的单元格信息for ws in wb: # 遍历工作簿中的sheet表# print(ws)for row in ws.iter_rows(min_row=2, min_col=2, values_only='True'): # 只读方式遍历所有行单元格信息# print(row)kwargs['attribute'] = row[1] # 将Excle中的定位属性字段的单元格信息赋值给键名:attributekwargs['value'] = row[2] # 将Excle中的定位值字段的单元格信息赋值给键名:lockwargs['text'] = row[3] # 将Excle中的输入字段的单元格信息赋值给键名:text# print(kwargs)for key in list(kwargs.keys()): # 遍历字典的所有的key并转化成list,不转化成list在删除字典的键值对时会报错# print(key)if kwargs[key] == None: # 当字典的键值对应的None时del kwargs[key] # 删除对应为None的键值对# print(kwargs)logger.info(f"{row[4]}") # 用于确认当前是什么操作u2_key = U2_Tools() #fun = getattr(u2_key, row[0]) # 通过文件中row[0]字段的关键字信息(字符串),反射u2_key这个对象中的方法fun(**kwargs) # 根据反射得到的方法传入对应的参数,参数名称要同其中内容相同wb.save(dir_file() + "\\data\\使用EXCLE设计类表格编程_u2.xlsx")if __name__ == '__main__':read_excle()
read_config.py
# 创建者:zhangxuexin
# 创建时间:2022/6/24 11:21
import configparser as cp
from tools.single_file_packaging import dir_fileclass Config_Read:rc = cp.ConfigParser() # 创建ConfigParser文件配置对象rc.read(dir_file() + "\\config.ini", encoding='utf-8') # 读取配置文件def read_strconfig(self, section, value):"""读取配置文件字符串类型的内容"""return self.rc.get(section, value)def read_intconfig(self, section, value):"""读取配置文件整型类型的内容"""return self.rc.getint(section, value)cr = Config_Read()
if __name__ == '__main__':cr.read_strconfig('Default', 'package')
read_log.py
# 创建者:zhangxuexin
# 创建时间:2022/6/24 10:29
import logging
import timefrom tools.single_file_packaging import dir_fileclass Read_log():'''该类用于logger日志的收集'''# 创建log收集器logger = logging.getLogger(__name__) # 定义一个log收集器logger.setLevel("DEBUG") # 设置log收集器的log等级fmt = logging.Formatter("[%(asctime)s]:[%(filename)s[%(lineno)d]][%(levelname)s]:%(message)s") # 定义log收集器的log格式# 创建log通过控制台进行输出ch = logging.StreamHandler() # 创建控制台log输出对象ch.setLevel('DEBUG') # 设定控制台的log等级ch.setFormatter(fmt) # 设定控制台的log输出格式logger.addHandler(ch) # 将控制台输出方式添加进log收集器# 创建log通过文本进行输出fh = logging.FileHandler(dir_file() + f"\\report\\log\\log[{time.strftime('%Y%m%d-%H%M%S')}].txt", mode="a",encoding="utf-8") # 创建文本log输出对象fh.setLevel('INFO') # 设定文本的log等级fh.setFormatter(fmt) # 设定文本的log输出格式logger.addHandler(fh) # 将文本输出方式添加进log收集器def getlog(self):return self.loggerlogger = Read_log().getlog()if __name__ == '__main__':logger.debug("这是一个debug")logger.info("这是一个info")logger.warning("这是一个warning")logger.error("这是一个error")logger.critical("这是一个critical")logger.info(f"[{time.strftime('%Y-%m-%d')}]")
single_file_packaging.py
# 创建者:zhangxuexin
# 创建时间:2022/6/25 16:59# 配置文件路径
import os
import sysdef dir_file():'''用于配置路径,用于打包单个运行文件时使用'''if getattr(sys, 'frozen', False):Con_DIR = os.path.dirname(sys.executable) # sys.executable返回的是可执行二进制文件(.exe)的绝对路径else:Con_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 返回的是当前文件的上上一层目录return Con_DIR
data目录
数据文件案例
config.ini文件
配置文件
[Default]
# 运行程序包名
package = com.mapbar.navigation.zero# 执行数据地址
data_path =./data/使用EXCLE设计类表格编程_u2.xlsx# 程序循环次数
loop_num = 2
requirements.txt
第三方插件库
openpyxl==3.0.9
Pillow==9.1.0
pycparser==2.21
pyinstaller==5.0.1
uiautomator2==2.16.14
run.py
程序执行入口
# 创建者:zhangxuexin
# 创建时间:2022/6/25 16:09
from tools.read_config import cr
from tools.read_excle import read_excle
from tools.read_log import loggerif __name__ == '__main__':i = 0j = cr.read_intconfig("Default", "loop_num")while i < j:logger.info(f"当前为第[{i+1}]次运行******************************************")read_excle()i = i + 1logger.info(f"运行结束,程序总计运行次数为:[{j}]####################################################")
Excle表格样式实现安卓APPUI自动化相关推荐
- 自动化办公之excel教程(3):数据编辑操作,表格的美化操作,应用表格样式和单元格样式,制作报销汇总单
一.数据编辑操作 1.填充数据 填充数据见上一节 自动化办公之EXCEL教程(2):各种数据的输入,自动填充数据,表格操作小技巧 2.查找和替换数据 第一步:开始选项卡里找到查找 或者Ctil+F 第 ...
- 使用VBA统一word文档表格样式
在多人协作的word文档中,经常会出现同一性质的内容格式不一致的情况.要快速统一同一性质的内容的格式,最佳实践无疑是使用样式功能.但是对于表格而言,对表格样式的编辑无法做到使表格在页面居中,而且对于标 ...
- Springboot整合poi +vue实现导出导入Excle表格数据展示图形
工具: idea 数据库: mysql 框架:Springboot 准备工作: 1.导入主要依赖 (poi) <dependency><groupId>org.apache.p ...
- Android通过POI架包生成Excle表格
前言: 在Java中打印Excel表格的有常用的类库: 1.Java Excel API项目中Jxl包.2.Apache的POI包. 本文,这里介绍Apache的POI架包. 1. POI简介: Mi ...
- 源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-
仿写映客直播(上传者:五仁月饼) 工作之余写的,基于IJKPlayer播放,对内存做了处理.目前已完成直播列表和直播间的搭建,后续还会慢慢完善. 项目地址 publishImageAndVideoAn ...
- java导入excle表格,并且对表格进行相应的修改,并对表格数据进行整理,最后导出本地表格等一系列...
1.首先创建一个java项目 完成效果如下图所示 2.导入以下jar包 3.代码如下 其中行和列的操作是根据需求自动划分的 复制代码 1 public class auto_date { 2 priv ...
- phpexcel_cell 获取表格样式_Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行...
精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:E-iceblue https://www.cnblo ...
- 两两对应成排的 表格 样式
样式需求 这种就不能用原生的表格样式 和 组件的table 来写 只能用盒子去拼写 下面是我写的 html css 样式是行内式 有点 乱 <div *ngIf="item['COMP ...
- Delphi设置表格样式
//设置表格样式 wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderLeft).LineStyle = Word.WdLine ...
最新文章
- C++ map 的使用
- internal compiler error: Killed (program cc1plus)
- 巅峰对决!Spring Boot VS .NET 6
- spring本地化默认英文_Spring3国际化和本地化
- linux编码 form表单,Linux以form表单形式上传文件讲解
- ns2相关学习——TCL脚本编写(2)
- python网络编程项目_python网络编程(1):客户端与网络编程简介
- 查看Linux下端口占用情况的命令
- python 字符串转大写_Python字符串大写()
- RESTful Web Services简单介绍
- oracle 归档模式 ASM,oracle rac启用归档模式
- 语音信号的LPC特征提取
- (附源码)基于springboot平衡膳食小程序 毕业设计 250859
- linux常见通配符的含义,linux通配符含义
- 三阶魔方中心互换_三阶魔方入门
- Dragonfly 应用-如何计算面孔隙率
- RabbitMQ的分发机制
- 如何监测微信群关键词并收集转发到指定的群
- 锐捷服务器显示dns无法上网,上网常见故障排查指引-肇庆学院信息中心 Zhaoqing University Information Center...
- saltstack安装 [一]
热门文章
- 主题:基于混合整数规划方法的微网电池储能容量优化配置
- 信号频谱分析、功率谱分析、倒谱分析、小波分析
- r library car_Stata+R:Stata 与 R 等效命令备忘录
- 接口文档包含哪些内容?怎么才能写好接口文档?十年测试老司机来告诉你
- 代码-JS之小星星评论效果
- 运用了先进计算机技术,运用计算机技术推进化工业优秀工程师培养.doc
- 专业现场媒体编辑工具:QLab Pro
- Mybatis 和 IBatis 的区别
- 供应链管理(SCM)划分为三个主要流程
- 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感