WindowsGUI自动化测试项目实战+辛酸过程+经验分享

WindowsGUI自动化测试项目实战+辛酸过程+经验分享

  • 一、前言
    • ⚜ 起因
    • ⚜ 项目要求
    • ⚜ 预研过程
      • ⚜⚜ 框架选型
      • ⚜⚜ 关于UIaotumation框架
    • ⚜ 预研成果
  • 二、项目介绍
    • 💓 测试对象
    • 💓 技术栈
    • 💓 项目框架说明
  • 三、项目展示
    • 🤣 界面实现效果
    • 🤣 测试报告效果
    • 🤣 用例执行失败效果
    • 🤣 日志效果
    • 🤣 使用场景说明
  • 四、项目经验分享
    • ✨ 技术迁移
    • ✨ 语言基础的重要性
    • ✨ 多写、多练
    • ✨ 分享总结最重要

一、前言

⚜ 起因

  • 做测试的同事,应该都有相同的技术储备,那就是自动化测试。然而一直从事APIwebUI等方面的自动化测试,突然一天领导说让搞WindowsGUI自动化;
  • 说实话,当时还是很抵触的:

一是 这方面的资源不多;
二是 很多像样(我认为的)的工具是付费的;
三是 自己没做过,但是又不得不去尝试;
四是 因为业务的特殊性,涉及到了建模或者模型之类的东西不好做自动化。

  • 但没办公,只能自己上了。

⚜ 项目要求

  • 平台:Windows 11(64位)系统;
  • 主要要求:
    完成WindowsGUI自动化测试框架预言和搭建;
    满足:模型或建模自动化的操作;
    达到:和WebUI类似的框架组织(如Unittest+Python+Selenium+BeautifulReport);
    特质:可以帮助测试人员提升编程技能,而非傻瓜式的操作某个工具;
    时间:一个星期。(想说句:我太难了~,因为当时确实是不会啊。)

⚜ 预研过程

⚜⚜ 框架选型

  • 用例组织框架(Unittest):
    ⭕ 按照领导的要求,必须是和WebUI类似,那好吧,我继续用Unittest
    ⭕ 这里为啥没用Pytest,主要是当时对其还不是很熟悉,在一星期内要加上熟悉Pytest,那真的是时间太紧张了。

  • 编程语言(Python):
    ✔ 为啥选择它,因为当时团队成员基本都是用Python做自动化测试的;
    ✔ 其实这个还与后边的界面控件识别有关系,因为界面识别框架UIaotumation有作者对其进行了二次封装,感觉是不错的选择。

  • WindowsGUI界面识别框架(UIaotumation):
    💦 为啥选择这个呢?详见后边的表格:
    💦 当然也有其他很多工具,但是无非就是这几类:识别控件、坐标操作、图像识别
    💦 经过对比,按照Leader的要求,还是要选择按照识别控件的方式进行,因为其他两个类型对业务不太适合,比如坐标操作,我们的控件变化可能会很大,用这个就很麻烦了;
    💦 最终我们看到了一个作者使用UIaotumation来做Windows桌面端自动化测试,而没有选择一些工具,感觉受益匪浅。

工具简介
pywinauto主要使用到 Application 类,用于应用程序管理(打开与关闭应用等)、窗口管理(最小化、最大化、关闭窗口)
Pywin32包含 win32gui、win32api、win32con 3个子模块,用于窗口管理(定位窗口、显示和关闭窗口、获取窗口位置等)
pyautogui屏幕控制(截屏等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽等)、键盘控制(编辑、按键等)
  • 测试报告的选择,仍然使用BeautifulReport,简单美观使用。
    在这里插入图片描述

⚜⚜ 关于UIaotumation框架

  • 作者信息:
    💞 作者博客;
    💞 Github。
  • 框架使用:
    💥 安装:pip install uiautomation
    💥 使用场景或环境:

UIAutomation实现的自动化支持微软提供的各种界面开发框架,如Win32, MFC, Windows Forms, WPF, Metro App, IE;

另外Qt, Firefox, Chrome实现了UI Automation Provider,也支持UIAutomation;

作者用Python和C++对UIAutomation做了一层封装,方便我自己的使用,可以快速开发自动化脚本;

UIAutomation支持平台包括Windows XP(SP3),Windows Vista, Windows 7, Windows 8、8.1、10;

  • 功能说明:
🏆#常用操作:
1、WindowContrl(searchDepth,ClassName,SubName) # 查找窗口中的程序,如果有中文则需用Unicode;可用window.Exists(maxSearchSeconds)来判断此窗口是否存在;

2、EditControl(searchFromControl) # 查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue(“string”)输入值;

3、Win32API.SendKeys(“string”) # 如果已在编辑位置,则可用此方法来输入值,{Ctrl}为ctrl键,其他类似;{@ 8}格式可输入8个@,对于数字也可实现此功能,但对于字母不能…;

4、MenuItemControl(searchFromControl,Name) # 查找菜单按钮;

5、ComboBoxControl(searchFromControl,AutomationI) # 查找下拉框,然后在此基础上用Select(“name”)方法来选择需要的选项;

6、BottonControl(searchFromControl,Name,SubName) # 查找按钮;

7、automation.FindControl(firefoxWindow, lambda c:(isinstance(c, automation.EditControl) or isinstance(c, automation.ComboBoxControl)) and c.Name == 'Enter your search term') # 按条件搜索handle
🏆#句柄常用操作
Click() # 点击;

RighClik() # 右键点击;

SendKeys() # 发送字符;

SetValue() # 传值,一般对EditControl用;
🏆# windows程序常用操作
subprocess.Popen(‘Name’) # 用进程打开程序;

window.Close() # 关闭窗口;

window.SetActive() # 使用;

window.SetTopMost() # 设置为顶层

window.ShowWindow(uiautomation.ShowWindow.Maximize) # 窗口最大化

window.CaptureToImage(‘Notepad.png’) # 截图

uiautomation.Win32API.PressKey(uiautomation.Keys.VK_CONTROL) # 按住Ctrl键

uiautomation.Win32API.ReleaseKey(uiautomation.Keys.VK_CONTROL) # 释放Ctrl键

automation.GetConsoleWindow() # return console window that runs python,打开控制台

automation.Logger.ColorfulWriteLine(’\nI will open <Color=Green>Notepad and <Color=Yellow>automate it. Please wait for a while.) # 控制台传值(彩色字体),普通传值用WriteLine;

automation.ShowDesktop() # 显示桌面;
🏆# 句柄的抓取
# 直接运行automation模块枚举窗口时,支持下列参数(从doc窗口运行automation.py程序 )
-t intValue 延迟枚举时间,单位秒

-r 从树的根部枚举,如果不指定,从当前窗口枚举

-d intValue 枚举控件树的的深度,如果不指定,枚举整个树

-f 从焦点控件枚举,如果不指定,从当前窗口枚举

-c 从光标下的控件枚举,如果不指定,从当前窗口枚举

-a 获取光标下控件及其所有父控件

-n 显示控件的完整Name, 如果不指定,只显示前30个字符

-m 显示控件更多属性,默认只显示控件的四个属性

⚜ 预研成果

  • 框架:UIAutomation+Python+Unittest+Beautifulreport
  • 示例代码:
# -*- coding:utf-8 -*-

import unittest
import logging
import time
import uiautomation
import os

# @unittest.skip("跳过")
class TestFaultTree(unittest.TestCase):
    def setUp(self) -> None:
        # 初始化
        os.system("calc")  # 打开计算器
        time.sleep(2)
        self.calc = uiautomation.WindowControl(Name="计算器")
        self.calc_list = ["二", "加", "八", "等于"]
        self.result = "10"


    def tearDown(self) -> None:
        time.sleep(1)
        self.calc.ButtonControl(Name="关闭 计算器").Click()


    def test_toolbar(self):

        time.sleep(1)
        for i in range(0, len(self.calc_list)):
            self.calc.ButtonControl(Name=self.calc_list[i]).Click()
            time.sleep(0.5)

        calc_result = self.calc.TextControl(foundIndex=3).Name
        print("计算器运行结果为:", calc_result)
        print("预期结果为:", self.result)
        self.assertIn(self.result, calc_result)

if __name__ == "__main__":
    unittest.main()
  • 运行效果:

在这里插入图片描述

二、项目介绍

💓 测试对象

  • 我们自己的建模软件,如图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 其实简单点说就是模拟用户的真实操作,和WebUI是一样的效果。

💓 技术栈

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

💓 项目框架说明

在这里插入图片描述

三、项目展示

🤣 界面实现效果

  • 这里简单录制下自动化执行的效果;
  • 真实场景要比这个复杂的多;
  • 这里就不过多介绍了。

在这里插入图片描述

🤣 测试报告效果

在这里插入图片描述

🤣 用例执行失败效果

在这里插入图片描述

🤣 日志效果

在这里插入图片描述

🤣 使用场景说明

在这里插入图片描述

四、项目经验分享

✨ 技术迁移

  • 其实最终做完了才发现,只是自己知道的太晚了;
  • 框架逻辑和其他自动化是一样的,万变不离其中;
  • 只需要把其他框架的核心工具如AppiumSeleniumReques等换成UIaotumation即可;

那这里我觉得就是平常工作中要多总结、多思考,技术这东西有很多事可以进行迁移的,听不一样非要从0开始。

✨ 语言基础的重要性

  • 作为自动化测试的同事,编程语言是必须要掌握的;
  • 但是语言的基础最为要命;
  • 过程中发现一些简单的操作,其实是自身对编程语言本身的基础掌握不牢靠。

夯实基础,才能走的很深、更远。

✨ 多写、多练

  • 因为平常写的少,看的多,结果实战起来,才发现根本是无从下手;
  • 可以找一些其他的项目进行摸索,多写几遍就熟悉了。

光看不写,等于0.1,为啥是0.1,不是1,因为只保存了点印象,哈哈。

✨ 分享总结最重要

  • 遇到问了赶紧记下来;
  • 遇到花费很长时间才解决的“坑”,一定要记下来;
  • 记录地方最好是下次能以下找到的,CSDN就不错,你说呢(我是不是做了个宣传),哈哈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nuxt3 布局layouts和NuxtLayout的使用

Nuxt3是基于Vue3的一个开发框架&#xff0c;基于服务器端渲染SSR&#xff0c;可以更加方便的用于Vue的SEO优化。 用Nuxt3 SSR模式开发出来的网站&#xff0c;渲染和运行速度非常快&#xff0c;性能也非常高&#xff0c;而且可SEO。 接下来我主要给大家讲解下Nuxt3的layouts布…

半监督目标检测

有监督目标检测&#xff1a; 拥有大规模带标签的数据&#xff0c;包括完整的实例级别的标注&#xff0c;即包含坐标和类别信息&#xff1b;弱监督目标检测&#xff1a; 数据集中的标注仅包含类别信息&#xff0c;不包含坐标信息&#xff0c;如图一 b 所示&#xff1b;弱半监督目…

漫谈大数据 - 数据湖认知篇

导语&#xff1a;数据湖是目前比较热的一个概念&#xff0c;许多企业都在构建或者准备构建自己的数据湖。但是在计划构建数据湖之前&#xff0c;搞清楚什么是数据湖&#xff0c;明确一个数据湖项目的基本组成&#xff0c;进而设计数据湖的基本架构&#xff0c;对于数据湖的构建…

Figma导出源文件的方法,用这个方法快速转换其它格式

市场上设计工具层出不穷&#xff0c;Sketch、AdobeXD、Axure、InVision、Figma、Pixso等都是优秀的设计工具&#xff0c;设计师经常面临如何从设计工具中导出文件的问题。 Figma软件的导出功能非常强大&#xff0c;因为轻量化体验受到很多设计师的喜爱。如何保存导出Figma源文…

【c语言】enum枚举类型的定义格式 | 基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

研读Rust圣经解析——Rust learn-16(高级trait,宏)

研读Rust圣经解析——Rust learn-16&#xff08;高级trait&#xff0c;宏&#xff09; 高级trait关联类型Type为什么不用泛型而是Type 运算符重载&#xff08;重要等级不高&#xff09;重名方法消除歧义never typecontinue 的值是 ! 返回闭包 宏自定义宏&#xff08;声明宏&…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么&#xff1f; new除了新开空间创建初始化对象外&#xff0c;还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new&#xff0c;用了new后父类同名方法将到此为止&#xff0c;后面 继承的…

【Java基础 1】Java 环境搭建

&#x1f34a; 欢迎加入社区&#xff0c;寒冬更应该抱团学习&#xff1a;Java社区 &#x1f4c6; 最近更新&#xff1a;2023年4月22日 文章目录 1 java发展史及特点1.1 发展史1.2 Java 特点1.2.1 可以做什么&#xff1f;1.2.2 特性 2 Java 跨平台原理2.1 两种核心机制2.2 JVM…

阳光开朗孔乙己,会否奔向大泽乡

前言 &#x1f525;学历对职业关系到底有什么影响呢&#xff1f;&#x1f525;学历给我们带来了优势吗&#xff1f;&#x1f525;到底是什么造成了"孔乙己的长衫"&#xff1f; 孔乙己是中国清代作家鲁迅创作的一篇短篇小说&#xff0c;发表于1919年。这部作品被认为是…

跌倒检测和识别2:YOLOv5实现跌倒检测(含跌倒检测数据集和训练代码)

跌倒检测和识别2&#xff1a;YOLOv5实现跌倒检测(含跌倒检测数据集和训练代码) 目录 跌倒检测和识别2&#xff1a;YOLOv5实现跌倒检测(含跌倒检测数据集和训练代码) 1. 前言 2. 跌倒检测数据集说明 &#xff08;1&#xff09;跌倒检测数据集 &#xff08;2&#xff09;自定…

初学Python来用它制作一个简单的界面

前言 很多刚开始学习python的宝子&#xff0c;就想着自己开始琢磨一些界面&#xff0c;但是吧很多都是有点难度的&#xff0c;自己又琢磨不透&#xff0c;只能把代码复制粘贴运行 现在就带你们来了解一个制作简单界面的代码 ttkbootstrap 是一个基于 tkinter 的界面美化库&am…

Spring RabbitMQ 实现消息队列延迟

1.概述 要实现RabbitMQ的消息队列延迟功能&#xff0c;一般采用官方提供的 rabbitmq_delayed_message_exchange插件。但RabbitMQ版本必须是3.5.8以上才支持该插件&#xff0c;否则得用其死信队列功能。 2.安装RabbitMQ延迟插件 检查插件 使用rabbitmq-plugins list命令用于查看…

workerman开发者必须知道的几个问题

1、windows环境限制 windows系统下workerman单个进程仅支持200个连接。 windows系统下无法使用count参数设置多进程。 windows系统下无法使用status、stop、reload、restart等命令。 windows系统下无法守护进程&#xff0c;cmd窗口关掉后服务即停止。 windows系统下无法在一个…

appuploader 常规使用登录方法

转载&#xff1a;登录appuploader 登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录&#xff0c;弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号&#xff0c;只是普通的apple账号&#xff0c;请勾选上未支付688…

本地运行 minigpt-4

1.环境部署 参考官方自带的README.MD&#xff0c;如果不想看官方的&#xff0c;也可参考MiniGPT-4&#xff5c;开源免费可本地进行图像对话交互的国产高级大语言增强视觉语言理解模型安装部署教程 - openAI 当然&#xff0c;所有的都要按照作者说明来&#xff0c;特别是版本号…

什么是3D渲染,3D渲染在CG项目中为何如此重要?

随着科技的发展&#xff0c;现如今任何人都可以使用免费软件在个人计算机上创作 3D 图像&#xff0c;当然也有人对于专业 3D 艺术的创作方式及其相关工作流程存在一些误解&#xff0c;认为创建一个模型后&#xff0c;在上面放上材料和纹理&#xff0c;就可以立马得到一个漂亮的…

SpringCloud源码之OpenFeign

OpenFeign 基于 OpenFeign 2.2.6.RELEASE版本进行源码阅读 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version> </dependen…

【细读Spring Boot源码】监听器合集-持续更新中

前言 监听器汇总 归属监听器名称作用cloudBootstrapApplicationListenercloudLoggingSystemShutdownListenercloudRestartListenercloudLoggingSystemShutdownListenerspringbootEnvironmentPostProcessorApplicationListener用于触发在spring.factories文件中注册的Environm…

市级大数据中心大数据资源平台概要设计方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 大数据管理中心发展背景 为建设卓越全球城市&#xff0c;实现政府治理能力现代化目标&#xff0c;由市大数据中心牵头&#xff0c;在政务公共数据管理和互联网政务服务方面…

numpy的下载、数据类型、属性、数组创建

下载numpy 因为numpy不依赖于任何一个包所以numpy可以直接使用pip命令直接下载 下载命令&#xff1a; pip install numpy # 默认从https://pypi.org/simple 下载 pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 从清华大学资源站点下载 pip install nump…