概述

该工具通过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自动化相关推荐

  1. 自动化办公之excel教程(3):数据编辑操作,表格的美化操作,应用表格样式和单元格样式,制作报销汇总单

    一.数据编辑操作 1.填充数据 填充数据见上一节 自动化办公之EXCEL教程(2):各种数据的输入,自动填充数据,表格操作小技巧 2.查找和替换数据 第一步:开始选项卡里找到查找 或者Ctil+F 第 ...

  2. 使用VBA统一word文档表格样式

    在多人协作的word文档中,经常会出现同一性质的内容格式不一致的情况.要快速统一同一性质的内容的格式,最佳实践无疑是使用样式功能.但是对于表格而言,对表格样式的编辑无法做到使表格在页面居中,而且对于标 ...

  3. Springboot整合poi +vue实现导出导入Excle表格数据展示图形

    工具: idea 数据库: mysql 框架:Springboot 准备工作: 1.导入主要依赖 (poi) <dependency><groupId>org.apache.p ...

  4. Android通过POI架包生成Excle表格

    前言: 在Java中打印Excel表格的有常用的类库: 1.Java Excel API项目中Jxl包.2.Apache的POI包. 本文,这里介绍Apache的POI架包. 1. POI简介: Mi ...

  5. 源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-

    仿写映客直播(上传者:五仁月饼) 工作之余写的,基于IJKPlayer播放,对内存做了处理.目前已完成直播列表和直播间的搭建,后续还会慢慢完善. 项目地址 publishImageAndVideoAn ...

  6. java导入excle表格,并且对表格进行相应的修改,并对表格数据进行整理,最后导出本地表格等一系列...

    1.首先创建一个java项目 完成效果如下图所示 2.导入以下jar包 3.代码如下 其中行和列的操作是根据需求自动划分的 复制代码 1 public class auto_date { 2 priv ...

  7. phpexcel_cell 获取表格样式_Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行...

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:E-iceblue https://www.cnblo ...

  8. 两两对应成排的 表格 样式

    样式需求 这种就不能用原生的表格样式 和 组件的table 来写 只能用盒子去拼写 下面是我写的 html css 样式是行内式 有点 乱 <div *ngIf="item['COMP ...

  9. Delphi设置表格样式

    //设置表格样式 wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderLeft).LineStyle = Word.WdLine ...

最新文章

  1. C++ map 的使用
  2. internal compiler error: Killed (program cc1plus)
  3. 巅峰对决!Spring Boot VS .NET 6
  4. spring本地化默认英文_Spring3国际化和本地化
  5. linux编码 form表单,Linux以form表单形式上传文件讲解
  6. ns2相关学习——TCL脚本编写(2)
  7. python网络编程项目_python网络编程(1):客户端与网络编程简介
  8. 查看Linux下端口占用情况的命令
  9. python 字符串转大写_Python字符串大写()
  10. RESTful Web Services简单介绍
  11. oracle 归档模式 ASM,oracle rac启用归档模式
  12. 语音信号的LPC特征提取
  13. (附源码)基于springboot平衡膳食小程序 毕业设计 250859
  14. linux常见通配符的含义,linux通配符含义
  15. 三阶魔方中心互换_三阶魔方入门
  16. Dragonfly 应用-如何计算面孔隙率
  17. RabbitMQ的分发机制
  18. 如何监测微信群关键词并收集转发到指定的群
  19. 锐捷服务器显示dns无法上网,上网常见故障排查指引-肇庆学院信息中心 Zhaoqing University Information Center...
  20. saltstack安装 [一]

热门文章

  1. 主题:基于混合整数规划方法的微网电池储能容量优化配置
  2. 信号频谱分析、功率谱分析、倒谱分析、小波分析
  3. r library car_Stata+R:Stata 与 R 等效命令备忘录
  4. 接口文档包含哪些内容?怎么才能写好接口文档?十年测试老司机来告诉你
  5. 代码-JS之小星星评论效果
  6. 运用了先进计算机技术,运用计算机技术推进化工业优秀工程师培养.doc
  7. 专业现场媒体编辑工具:QLab Pro
  8. Mybatis 和 IBatis 的区别
  9. 供应链管理(SCM)划分为三个主要流程
  10. 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感