基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架主入口main解析
文章目录
- 1 main.py主入口
- 2 testcase目录
- 2.1 实例:test\_test\_mymusic.py
- 2.2 实例:test\_toolbar.py
- 3 page目录
- 3.1 page/mymusic.py
- 3.2 page/toolbar.py
注:
1、本文为本站首发,他用请联系作者并注明出处,谢谢!
2、源码解析/mian入口说明、testcase说明、page说明
1 main.py主入口
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17
# 文件名称:main.py
# 作用:框架的主入口函数# coding=utf-8import time
from common.reportOut import report_out
from common.logOut import log_out
from common.sendMail import send_main
import osdef acquire_report_address(reports_address):# 测试报告文件夹中的所有文件加入到列表test_reports_list = os.listdir(reports_address)# 按照升序排序生成新的列表new_test_reports_list = sorted(test_reports_list)# 获取最新的测试报告the_last_report = new_test_reports_list[-1]# 最新的测试报告地址the_last_report_address = os.path.join(reports_address, the_last_report)return the_last_report_addressdef run_case():print("======开始执行!!!======")curpath = os.path.dirname(os.path.realpath(__file__))report_dir = os.path.join(curpath, "report/") # 测试报告存放目录log_dir = os.path.join(curpath, "log/") # 日志存放目录test_dir = os.path.join(curpath, "testcase/") # 测试用例读取目录name_project = "KuGou "log_out(log_dir, name_project)report_out(test_dir, report_dir, name_project)time.sleep(5)# send_main(acquire_report_address(report_dir), mail_to=['werwerwe@qq.com'])print("======执行结束!!!======")if __name__ == '__main__':run_case()
2 testcase目录
2.1 实例:test_test_mymusic.py
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17
# 文件名称:test_mymusic.py
# 作用:遍历我的音乐栏目下的内容import unittest # 引入unittest框架
import time
from page.mymusic import MyMusic # 引入页面元素
import loggingclass TestMyMusic(unittest.TestCase):"""循环点击【我的音乐】栏目下的内容"""@classmethoddef setUpClass(self) -> None:self.mymusic = MyMusic() # 实例化,登录self.kugou = self.mymusic.kugou # 调用同一个窗口self.log = logging.getLogger() # 初始化log@classmethoddef tearDownClass(self) -> None:self.mymusic.a.login_out() # 退出酷狗音乐def test_my_music(self):self.log.info("======酷狗工具栏======") # 加入logtime.sleep(0.5)self.mymusic.func_my_music().Click()self.mymusic.func_my_radio().Click()self.mymusic.func_local_download().Click()self.mymusic.func_recently_played().Click()self.mymusic.func_default_list().Click()print("---------------", self.mymusic.func_default_list().Name)self.assertIn(self.mymusic.func_default_list().Name, self.mymusic.my_music, "用例执行成功")print("用例执行OK!")# 循环点击【我的音乐】栏目下的内容if __name__ == "__main__":unittest.main()
2.2 实例:test_toolbar.py
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17
# 文件名称:test_toolbar.py
# 作用:遍历酷狗音乐工具栏的元素import unittest # 引入unittest框架
import time
from page.toolbar import ToolBar # 引入页面元素
import loggingclass TestToolBar(unittest.TestCase):"""循环点击工具栏中所有按钮"""@classmethoddef setUpClass(self) -> None:self.toolbar = ToolBar() # 实例化,登录self.kugou = self.toolbar.kugou # 调用同一个窗口self.log = logging.getLogger() # 初始化log@classmethoddef tearDownClass(self) -> None:self.toolbar.a.login_out() # 退出酷狗音乐def test_toolbar(self):self.log.info("======酷狗工具栏======") # 加入logtime.sleep(0.5)self.toolbar.func_my_music().Click()self.toolbar.func_find().Click()self.toolbar.func_live().Click()self.toolbar.func_explore().Click()self.toolbar.func_play().Click()print("---------------", self.toolbar.func_play().Name)self.assertIn(self.toolbar.func_my_music().Name, self.toolbar.tool_bar, "用例执行成功")print("用例执行OK!")# 循环点击酷狗音乐工具栏if __name__ == "__main__":unittest.main()
3 page目录
3.1 page/mymusic.py
# -*- coding:utf-8 -*-# 作者:虫无涯
# 日期:2023/2/17
# 文件名称:mymusic.py
# 作用:封装用例中的元素(我的音乐栏目下的控件)
from common.baseInfo import InitInforclass MyMusic(object):def __init__(self):self.a = InitInfor()self.kugou = self.a.kugoudef func_my_music(self):return self.kugou.TableControl(Name="我的音乐")def func_my_radio(self):return self.kugou.ListItemControl(Name="我的电台")def func_local_download(self):return self.kugou.ListItemControl(Name="本地与下载")def func_recently_played(self):return self.kugou.ListItemControl(Name="最近播放")def func_default_list(self):return self.kugou.ListItemControl(Name="默认列表")# 断言my_music = ["我的音乐", "我的电台", "本地与下载", "最近播放", "默认列表"]
3.2 page/toolbar.py
# -*- coding:utf-8 -*-# 作者:虫无涯
# 日期:2023/2/17
# 文件名称:toolbar.py
# 作用:封装用例中的元素(以酷狗音乐的工具栏为主)
from common.baseInfo import InitInforclass ToolBar(object):def __init__(self):self.a = InitInfor()self.kugou = self.a.kugoudef func_my_music(self):return self.kugou.TableControl(Name="我的音乐")def func_find(self):return self.kugou.TableControl(Name="发现")def func_live(self):return self.kugou.TableControl(Name="直播")def func_explore(self):return self.kugou.TableControl(searchDepth=Name="探索")def func_play(self):return self.kugou.TableControl(Name="手机Play")# 断言tool_bar = ["我的音乐", "发现", "直播", "探索", "手机Play"]
相关文章:
基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架主入口main解析
文章目录1 main.py主入口2 testcase目录2.1 实例:test\_test\_mymusic.py2.2 实例:test\_toolbar.py3 page目录3.1 page/mymusic.py3.2 page/toolbar.py注: 1、本文为本站首发,他用请联系作者并注明出处,谢谢ÿ…...
华为OD机试真题Python实现【挑选字符串】真题+解题思路+代码(20222023)
挑选字符串 题目 给定a-z,26 个英文字母小写字符串组成的字符串A和B, 其中A可能存在重复字母,B不会存在重复字母, 现从字符串A中按规则挑选一些字母可以组成字符串B 挑选规则如下: 同一个位置的字母只能挑选一次, 被挑选字母的相对先后顺序不能被改变, 求最多可以同时…...
Orcad放置字符标注、文本框、注释及图片方法教程
实际设计当中,经常需要对一些功能进行文字说明,或者对可选线路进行文字标注。这些文字注释可以大大增强线路的可读性,后期也可以让布线工程充分对所关注的线路进行特别处理。1、放置字符标注 字符标注主要针对的是较短的文字说明。 ÿ…...
秒懂算法 | 子集树模型——0-1背包问题的回溯算法及动态规划改进
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W。一种物品要么全部装入背包,要么全部不装入背包,不允许部分装入。装入背包的物品的总重量不超过背包的容量。问应如何选择装入背包的物品,使得装入背包中的物品总价值最大? 01、问题分析——解空间及搜索…...
koc转化效果评估模型是什么?如何根据模型来进行投放
目前小红书有超2亿月活用户,共有4300万的分享,当之无愧的成为众多年轻用户心中的“消费决策”平台。那怎么将如此巨大的流量切实的转化为效果是一个挑战。今天就来简单分享一下这个挑战的答案。其实可以借助模型来帮助,这就是koc转化效果评估…...
vuejs-datepicker|简单易用的Vue.js日期选择组件
vuejs-datepicker是一个简单易用的Vue.js日期选择组件。它使用了Bootstrap 4的样式,支持多种语言,具有直观的界面,易于配置和扩展。👉 效果演示 👉如果您想使用vuejs-datepicker,首先您需要安装它ÿ…...
【c++】类和对象3—初始化列表、类对象作为类成员、静态成员
文章目录初始化列表类对象作为类成员静态成员初始化列表 作用:c提供了初始化 语法:构造函数():属性1(值1),属性2(值2),…{} #include<iostream> using namespace std;class Person { public://1、传统初始化操作/*Person(int a, int b, int c) …...
【基础算法】数的范围
🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...
FreeRTOS入门(01):基础说明与使用演示
文章目录目的基础说明系统移植基础使用演示数据类型和命名风格总结碎碎念目的 FreeRTOS是一个现在非常流行的实时操作系统(Real Time Operating System)。本文将介绍FreeRTOS入门使用相关内容,这篇是第一篇,主要介绍基础背景方面…...
华为OD机试真题Python实现【交换字符】真题+解题思路+代码(20222023)
交换字符 题目 给定一个字符串S 变化规则: 交换字符串中任意两个不同位置的字符M S都是小写字符组成 1 <= S.length <= 1000 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 一串小写字母组成的字符串 输出 按照要求变换得到…...
Word处理控件Aspose.Words功能演示:使用 Java 在 MS Word 文档中进行邮件合并
Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外,Aspose API支持流行文件格式处理…...
产品未出 百度朋友圈“开演”
ChatGPT这股AI龙卷风刮到国内时,人们齐刷刷望向百度,这家在国内对AI投入最高的公司最终出手了,大模型新项目文心一言(ERNIE Bot)将在3月正式亮相,对标微软投资的ChatGPT。 文心一言产品未出,百…...
emacs 中的键盘宏
emacs 中的键盘宏 宏定义是emacs比较强大的功能,自定义宏然后绑定快捷键之后就更加爽了。 vim 当然也有宏功能,而且用法简单,例如录制宏到a寄存器:qa...q, 执行宏a: a 世界就是由循环和递归构成的. 宏定义就是一个执行体,为了以后的循环做准备的 开启宏记录 C-x ( 或…...
TCP/IP网络编程——关于 I/O 流分离的其他内容
完整版文章请参考: TCP/IP网络编程完整版文章 文章目录第 16 章 关于 I/O 流分离的其他内容16.1 分离 I/O 流16.1.1 2次 I/O 流分离16.1.2 分离「流」的好处16.1.3 「流」分离带来的 EOF 问题16.2 文件描述符的的复制和半关闭16.2.1 终止「流」时无法半关闭原因16.2…...
【BCT认证_组播DNS】 DNS SRV RR
每天遇见几个罕为人知的Bug,醉了 定义 关键字“必须”、“不能”、“应该”、“不应该”和“可以”本文档中使用的术语应按照 [BCP 14] 中的规定进行解释。本文档中使用的其他术语在 DNS 中定义规范,RFC 1034。 适用性声明 一般情况下,预计…...
【验证码的识别】—— 点触式验证码的识别
一、前言 大家好,不知不觉的我来csdn已经又一周年了,在这一年里,我收获了很多东西,我是2022年2月22日入驻CSDN的,一开始只是为了方便浏览文章的,后来,我也有事没事发发文章,创作了1…...
深入浅出C++ ——priority_queue类深度剖析
文章目录一、priority_queue类简介二、priority_queue类常用接口三、priority_queue类的使用四、STL中priority_queue类的模拟实现一、priority_queue类简介 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。…...
117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper)
//1.第一步 导入依赖库和权限: //依赖库: //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0//RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //用到的权限: <!…...
什么是Struts2?有哪些优势
Java中Strutsl是最早的基于MVC模式的轻量级Web框架,它能够合理地划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步,Struts1的局限性也越来越多地暴露出来。为了符合更加灵活、高效的开发需求,Stru…...
Ubuntu22.04 安装Mongodb6.X
Ubuntu22.04 安装Mongodb6.X 1、Mongodb简介 1.1 什么是MongoDB? Mongodb是一个跨平台的面向文档的NoSQL数据库。它使用带有可选模式的类似JSON的BSON来存储数据。应用程序可以以JSON格式检索信息。 1.2 MongoDB的优点 可以快速开发web型应用,因为灵活,…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
