基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架common目录解析

news/2024/9/19 11:05:15/

文章目录

  • 1 框架工具说明
  • 2 技术栈说明
  • 3 框架截图
  • 4 源码解析/common目录
    • 4.1 common/baseinfo.py
    • 4.2 common/creenShot.py
    • 4.3 common/logOut.py
    • 4.4 common/reportOut.py
    • 4.5 common/sendMail.py

注:
1、本文为本站首发,他用请联系作者并注明出处,谢谢!
2、源码解析/common目录


1 框架工具说明

工具说明
使用Unittest框架开源自动化测试框架,直接使用
批量或指定用例运行Unittest框架可支持此功能
log日志使用Python的logging库即可
生成HTML测试报告使用BeautifulReport模块可实现此功能
用例设计和结果分离PO模式
用户登录封装直接把登录功能模块化,使用Unittest框架中的setup,teardown即可
定制测试报告模板使用BeautifulReport模块
报告多语言使用BeautifulReport模块
截图功能使用UIAutomation的CaptureToImage方法

2 技术栈说明

技术版本及说明
PythonV3.x(本文为3.7)===编程语言支撑
UIAutomation控件的识别、定位及操作
BeautifulReport生成Html测试报告
LoggingPython自带===生成log日志
UnittestPython自带===自动化测试框架
SmtplibPython自带===邮件服务
emailPython自带===邮件服务
osPython自带===系统模块
PyCharmCommunity 2020.2汉化版
操作系统Windows10旗舰版64位

3 框架截图

4 源码解析/common目录

4.1 common/baseinfo.py

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17 
# 文件名称:baseInfo.py
# 作用: 封装公用方法-登录模块import time
import os
import uiautomation                                                     # 引入自动化测试工具
import logging                                                          # 引入日志模块
from common.creenShot import save_creenshot                             # 引入截图功能class InitInfor(object):"""封装公用方法-登录模块"""def __init__(self):self.log = logging.getLogger()                                  # 初始化logos.system()# 酷狗音乐Testself.login_name = "xxxx"self.login_password = "yyyy"os.startfile(r"D:\KGMusic\KuGou.exe")                            # 按安装路径打开酷狗音乐self.kugou = uiautomation.WindowControl(Name="酷狗音乐")          # 定位到酷狗音乐窗口time.sleep(2)if self.kugou.ButtonControl(Name="最大化").Exists():              # 最大化窗口self.kugou.ButtonControl(Name="最大化").Click()else:passdef login(self):self.log.info("=======登录模块=======")  # 加入logself.log.info("登录")self.kugou.TextControl(Name="登录").Click()                      # 登录按钮self.kugou.HyperlinkControl(foundIndex=1).Click()               # 点击其它方式登录save_creenshot(self.kugou)self.kugou.ButtonControl(Name="关闭").Click()                    # 关闭登录窗口# 用户名、密码、登录# 同样的方法使用qq、手机号、微信等进行登录即可# 根据自己的项目修改此处的代码进行软件登录即可(后续demo默认不进行登录,只是打开登录窗口然后关闭窗口)def login_out(self):time.sleep(0.5)self.kugou.ButtonControl(Name="关闭").Click()                    # 关闭窗口退出酷狗音乐,前提是设置酷狗音乐关闭按钮为直接退出程序self.log.info("关闭窗口,退出酷狗")if __name__ == "__main__":b = InitInfor()b.login()b.login_out()

4.2 common/creenShot.py

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17 
# 文件名称:creenShot.py
# 作用:封装截图功能并调用import timedef save_creenshot(Windows):now = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))  # 获取当前时间pic_path = "../creenshot/"+now+'_screen.png'                           # 保存截图到指定路径Windows.CaptureToImage(savePath=pic_path)                              # 截图功能

4.3 common/logOut.py

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17 
# 文件名称:logOut.py
# 作用:封装log日志功能import logging                        # 引入日志模块
import timedef log_out(log_dir, name_project):''':log_dir : 日志路径:name_project : 项目名称=>用于日志命名:return:'''now = time.strftime("%Y_%m_%d %H_%M_%S")   # 获取当前时间,格式:年月日时分秒logging.basicConfig(level=logging.INFO,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename=log_dir + now + '-' + name_project + '_test_log.log',filemode='w')"""level: 打印日志的级别,INFO:详细; WARNING:警告;ERROR:错误...format: 为处理程序使用指定的格式字符串;datefmt:使用特定的时间日期格式;filename:log日志的文件名称规则;filemode:文件读写模式。"""

4.4 common/reportOut.py

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17 
# 文件名称:reportOut.py
# 作用:封装测试报告功能import time
import unittest
from BeautifulReport import BeautifulReport as bf     # 引入BeautifulReport报告模板def report_out(test_dir, report_dir, name_project):''':test_dir: 用例路径:report_dir : 报告路径:name_project : 项目名称=>用于报告命名及描述:return:'''now = time.strftime("%Y_%m_%d %H_%M_%S")discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')      # 加载测试用例report_name = now + '-' + name_project + '_test_report.html'          # 报告名称run = bf(discover)run.report(filename=report_name, report_dir=report_dir, description=U"酷狗音乐UI自动化功能回归测试")"""filename:报告名文;report_dir:测试报告存放路径;description:报告描述;"""

4.5 common/sendMail.py

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/2/17
# 文件名称:sendMail.py
# 作用:封装邮件服务模块import time
import smtplib
import getpass
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import email
import osdef send_main(file_path, mail_to='xxx@126.com'):mail_from = 'zzz@126.com'f = open(file_path, 'rb')mail_body = f.read()f.close()# msg = email.MIMEMultipart.MIMEMultipart()msg = MIMEMultipart()# 构造MIMEBase对象做为文件附件内容并附加到根容器contype = 'application/octet-stream'maintype, subtype = contype.split('/', 1)# 读入文件内容并格式化data = open(file_path, 'rb')# file_msg = email.MIMEBase.MIMEBase(maintype, subtype)file_msg = MIMEBase(maintype, subtype)file_msg.set_payload(data.read())data.close()# email.Encoders.encode_base64(file_msg)encoders.encode_base64(file_msg)# 设置附件头basename = os.path.basename(file_path)file_msg.add_header('Content-Disposition', 'attachment', filename=basename)msg.attach(file_msg)print(u'msg 附件添加成功')msg1 = MIMEText(mail_body, "html", 'utf-8')msg.attach(msg1)if isinstance(mail_to, str):msg['To'] = mail_toelse:msg['To'] = ','.join(mail_to)msg['From'] = mail_frommsg['Subject'] = u'酷狗音乐UI自动化功能回归测试'msg['date'] = time.strftime('%Y-%m-%d-%H_%M_%S')print(msg['date'])smtp = smtplib.SMTP()smtp.connect('smtp.126.com')smtp.login('yyyyy@126.com', 'mmmmm')  # 登录账号和密码(密码为之前申请的授权码)smtp.sendmail(mail_from, mail_to, msg.as_string())smtp.quit()print('email has send out !')# if __name__=='__main__':
#     sendmain('../report/2017-08-18-10_18_57_result.html')


http://www.ppmy.cn/news/26773.html

相关文章

Spring基础总结(中)

13. 实现 AOP 的方式 通过 ProxyFactory 实现,注意这和 Proxy 不同,如下的 User 类不需要实现接口 ProxyFactory proxyFactory new ProxyFactory(); proxyFactory.setTarget(new CService());proxyFactory.addAdvice(new MethodInterceptor() {public…

深度学习在视频多目标跟踪中的应用综述

文章目录摘要1、简介2、MOT:算法、指标和数据集2.1、MOT算法简介2.2、指标经典的指标完整的MOT指标ID 分数2.3、基准数据集3、MOT中的深度学习3.1、深度学习中的检测步骤3.1.1、Faster R-CNN3.1.2、SSD3.1.3、Other detectors3.1.4、cnn在检测步骤中的其他用途3.2、深度学习在特…

【MySQL】MySQL表的增删改查(进阶)

✨个人主页:bit me👇 ✨当前专栏:MySQL数据库👇 ✨算法专栏:算法基础👇 ✨每日一语:悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。 目 录🎄一. 数…

七大排序经典排序算法

吾日三省吾身:高否?富否?帅否?答曰:否。滚去学习!!!(看完这篇文章先)目前只有C和C的功底,暂时还未开启新语言的学习,但是大同小异,语法都差不多。目录:一.排序定义二.排序…

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 TNS是Oracle Net…

【单目标优化算法】烟花优化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

如何锁定Word文档部分文字不被修改

我们知道,想要保护Word文档的内容无法随意更改,可以设置“限制编辑”的保护模式。 那如果实际工作中,只需要固定的一部分内容不能编辑,可以实现吗?答案是肯定的,今天就来说说如何设置Word文档部分文字可修…

VS Code Spring 全新功能来了!

大家好,欢迎来到我们 2023 年的第一篇博客!我们想与您分享几个与 Spring 插件、代码编辑和性能相关的激动人心的更新,让我们开始吧! Spring 插件包的新入门演练 演练(Walkthrough) 是一种多步骤、向导式的体…

【软件测试】自动化测试该如何做?项目?技术团队?你真的会自动化吗......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 对于自动化测试&…

接入网关和隔离网关

文章目录1. 什么是网关?2. 网关的作用是什么?3. 接入网关和隔离网关1. 什么是网关? 网关(Gateway)是一种网络设备,通常用于将不同网络之间的流量进行转发和路由,将一个网络连接到另一个网络&…

第十三届蓝桥杯省赛 C++ A 组 F 题、Java A 组 G题、C组 H 题、Python C 组 I 题——青蛙过河(AC)

目录1.青蛙过河1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路Ac_code1.C2.Java1.青蛙过河 1.题目描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃…

双因素方差分析

一、案例与数据 一家大型商业银行在多地区设有分行,其业务主要是进行基础设施建设,国家重点项目建设,固定资产投资等项目的贷款。近年来,该银行的贷款额平稳增长,但不良贷款额也有较大比例的提高,这给银行…

C语言实现动态管理通讯录信息系统(静态通讯录plus版)

文章目录前言:一.动态管理思想1.通讯录结构体声明发生变化2.通讯录结构体初始化发生变化3.通讯录能够动态增容4.通讯录销毁数据二.优化通讯录可持续读写信息1.保存通讯录中的信息到文件中2.加载文件信息到通讯录中三.源码1.text.c2.contact.c3.contact.h前言&#x…

数据结构与算法系列之kmp算法

什么是kmp算法 1.kmp算法是一种改进的字符串算法,其核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数已达到快速匹配的目的。 它主要实现作用的是 在 (主串)中找到 (匹配)字符串。 例 BF算法与k…

华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 分糖果 小明从糖果…

HTTP安全与HTTPS协议

目录 Http协议的安全问题 常见的加密方式 防止窃听 单向散列函数 单向散列值的特点 加密与解密 对称加密与非对称加密 对称加密的密钥配送问题 密钥配送问题的解决 非对称加密 前言: 公钥与私钥 非对称加密过程 混合密码系统 前言: 混合…

各类热门免费API合集

1、数据智能 身份证识别OCR:传入身份证照片,识别照片文字信息并返回,包括姓名、身份证号码、性别、民族、出生年月日、地址、签发机关及有效期。 通用文字识别OCR:多场景、多语种、高精度的整图文字检测和识别服务,多…

万物皆可集成资源包!低代码集成系列一网打尽

如何花最短的时间、用最少的成本解决客户的企业级应用定制问题? 如何满足数据库集成、Web API集成、第三方软件集成等需求,在如今万物皆可盘的当下,低代码如何用积木大玩具的方式快速构建各种应用,实现“万物皆可集成”&#xff…

react源码中的fiber架构

先看一下FiberNode在源码中的样子 FiberNode // packages/react-reconciler/src/ReactFiber.old.js function FiberNode(tag: WorkTag, pendingProps: mixed, key: null | string, mode: TypeOfMode, ) {// Instancethis.tag tag;this.key key;this.elementType null;t…

【LeetCode每日一题】【2023/2/9】2341. 数组能形成多少数对

文章目录2341. 数组能形成多少数对方法1:哈希表2341. 数组能形成多少数对 LeetCode: 2341. 数组能形成多少数对 简单\color{#00AF9B}{简单}简单 给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤: 从 nums 选出 两个…