uiautomation、pytest、schedule实现桌面程序自动化(初级)02

 一:安装uiAutomation

前置条件:安装python、pycharm

命令行安装

Pip install uiautomation==2.0.17       #指定版本           

二:安装辅助工具:inspect.exe和、Accessibility Insights For Windows定位元素工具

辅助工具介绍

步骤中提到了一个工具 --- Inspect.exe」 ,该工具是一个图形用户界面 (GUI) 应用程序,可用于收集用于提供程序和客户端开发和调试的 UI 自动化信息,它包含在 Windows SDK 中。

Inspect(Inspect.exe)是一个基于Windows的工具,允许您选择任何UI元素并查看元素的可访问性数据。您可以查看Microsoft UI自动化属性和控制模式,以及Microsoft活动辅助功能属性。Inspect还允许您测试UI自动化树中自动化元素的导航结构,以及Microsoft活动辅助功能层次结构中的可访问对象。

(1)步骤1:安装windows sdk

Windows SDK - Windows 应用开发 | Microsoft Developer

点击下载安装程序-下载

步骤2:打开

目录:C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64

默认安装路径:

有windows要求,我的是windows10 专业版 不支持

C:\Users\admin>pip install PyTimer

元素定位工具 inspect:

下载:

pip install schedule

schedule任务调度模块

可以按照秒、时、分、日期或者自定义事件执行事件

步骤四:安装定位工具推荐

Accessibility Insights For Windows

下载:Accessibility Insights Downloads

四:实战代码

UIautomation进行简单的桌面程序自动化

  1. 读取excel数据,实现一个方法使用多个数据
  2. from xToolkit import xfileimport yamlclass GetData(object):# pip install xToolkit -i https://mirrors.aliyun.com/pypi/simple/# from xToolkit import xfile# 获取用户数据 20230718补充  最简单 一句代码# 注意:xtoolkit只支持xls,不支持xlsxdef get_data_excel(self, datafile):# 读取excel数据,并将数据转换为exceldataMsg = xfile.read(datafile).excel_to_dict()return dataMsg# 获取修改用户资料页面元素def editinfo_page_element(self):pass# 获取登录页面元素# 读取yaml文件# 1、大小写敏感## 2、使用缩进表示层级关系## 3、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格## 4、不支持Tab键制表符缩进,只使用空格缩进## 5、字符后缩进一个空格,如冒号,逗号,短横杆(-)等## 6、"—“表示YAML格式,一个文件的开始,用于分隔文件间## 7、”  # ”表示注释 (yaml文件只有行注释)def getDateyaml(self, page_file):with open(page_file, 'r', encoding='utf-8') as f:element = yaml.safe_load(f)return element
2、uiautomation、pytest、Schedule定时器的使用

使用代码:

"""
@Time  :2024/3/2811:46@Auth  :@File  :MMAutomation.py
"""
import pytest
import pyautogui
import schedule
from datetime import datetimefrom model.Get_Data import GetData
import os
import subprocess
import uiautomation
import time
from threading import Timeruiautomation.uiautomation.DEBUG_SEARCH_TIME = True
uiautomation.uiautomation.SetGlobalSearchTimeout(20)  # 设置全局搜索超时时间
# 全局变量,用于跟踪任务执行的次数
task_count = 0
max_task_count = 5  # 设置任务最多执行5次class TestProject():def openWindow(self):try:windowName = "MiniTool MovieMaker 7.3.0 - (Ultimate)"self.MMWindow = uiautomation.WindowControl(searchDepth=1, Name=windowName)  # 定位窗体# 判断程序窗口是否存在if self.MMWindow.Exists(maxSearchSeconds=1):print(self.MMWindow)else:print("窗口不存在")path = r"C:\\Program Files\\7.3MiniTool MovieMaker7.3\\bin\\MiniTool MovieMaker.exe"subprocess.Popen(path)time.sleep(10)self.MMWindow = uiautomation.WindowControl(searchDepth=1, Name=windowName)  # 定位窗体# self.MMWindow.MoveToCenter()  # 窗体居中显示self.MMWindow.SetActive()  # 激活窗口# self.MMWindow.SetTopmost(True)  # 程序置顶显示return self.MMWindowexcept Exception as exx:raise (str(exx))bathP = os.path.abspath(os.path.join(os.getcwd(), ".."))filePath = os.path.join(bathP, r"data\ExportData.xls")exportMsg = GetData().get_data_excel(filePath)print(exportMsg)# 导出# 操作步骤 点击导出-输入文件名-输入导出地址-选择格式-选择分辨率-选择帧率-导出@pytest.mark.parametrize("exportMsg", exportMsg)def test_Export(self, exportMsg):# MMWindow=self.MMWindow()self.openWindow()exportButton = self.MMWindow.ButtonControl(AutomationId="btnExport", desc="点击导出")  # 导出print("导出", exportButton)if exportButton.Exists() == True:exportButton.Click(waitTime=0.1)time.sleep(2)self.MMWindow.Refind()exportWindow = self.MMWindow.WindowControl(Name="Export", desc="导出窗口", searchDepth=1)if exportWindow.Exists() == True:print("进入导出界面")else:print("未正确获取导出界面", exportWindow)# 输入导出文件名FileName = exportMsg["FileName"]  # 文件名exportPath = exportMsg["saveToPath"]  # 文件保存路径Format = exportMsg["cboFormat"]  # 选择格式Resolution = exportMsg["cmbResolution"]  # 选择分辩率FameRate = exportMsg["cmbFameRate"]  # 帧率fameRateDesc = exportMsg["fameRateDesc"]  # 帧率描述formatDesc = exportMsg["formatdesc"]  # 格式描述print("导出名字:{} \n 文件保存路径:{},选择格式:{}\n选择分辩率:{}\n帧率描述:{}\n帧率{}" \.format(FileName, exportPath,Resolution,Format,fameRateDesc, FameRate))try:## 获取EditControl支持的ValuePattern,并用Pattern设置控件文本为"输入文件名exportWindow.EditControl(foundIndex=1, desc="name").GetValuePattern().SetValue(FileName)# 输入导出路径# searchDepth 搜索第一个满足条件的控件 foundIndex: exportWindow在导出窗体下editcontrol控件的第二个,fondindex的索引从1exportWindow.EditControl(foundIndex=2, desc="saveTo").GetValuePattern().SetValue(exportPath)except uiautomation.comtypes.COMError as ex:# 如果遇到COMError, 一般是没有以管理员权限运行Python, 或者这个控件没有实现pattern的方法(如果是这种情况,基本没有解决方法)pass# 格式cboFormat = exportWindow.ComboBoxControl(AutomationId="cboFormat", desc="格式", searchDepth=1)formatList = ["MP4"]cboFormat.Click(waitTime=1)cboFormat.ListItemControl(Name=Format, searchDepth=1, desc=formatDesc).Click(waitTime=0.1)# 像素time.sleep(1)cmbResolution = exportWindow.ComboBoxControl(AutomationId="cmbResolution", desc="像素")cmbResolution.Click(waitTime=1)cmbResolution.ListItemControl(Name=Resolution, searchDepth=1).Click(waitTime=0.1)# 帧率cmbFameRate = exportWindow.ComboBoxControl(AutomationId="cmbFameRate", desc="帧率", searchDepth=1)cmbFameRate.Click(waitTime=1)# 选择帧率cmbFameRate.ListItemControl(Name="MovieMaker.ExportModule.ViewModels.FameRateConfig", foundIndex=int(FameRate),desc=fameRateDesc) \.Click(waitTime=1)# 点击导出exportMedia = exportWindow.ButtonControl(AutomationId="btnExport", ClickablePoint="{x:1425 y:750}",desc="导出")exportMedia.Click(waitTime=1)# 正在导出if exportWindow.TextControl(Name="Exporting...", desc="正在导出。。").Exists() == True:print("正在导出中")# ExportResult(self): 关闭导出完成窗口self.ExportResult(exportWindow)# 导出成功后关闭导出def ExportWindowCloseTask(self):global task_counttask_count += 1print('执行次数', task_count)print("现在执行导出的任务")exportResultWindow = self.MMWindow.WindowControl(AutomationId="exportResultWindow", desc="导出完成")if exportResultWindow.Exists() == True:print("导出")exportResultWindow.ButtonControl(AutomationId="buttonClose", desc="关闭导出窗口").Click(waitTime=1)else:e = datetime.now()exportTimeing = e.strftime("%Y-%m-%d %H:%M:%S")print("未导出完成,正在导出,现在时间", exportTimeing)if task_count > max_task_count:print("达到了最大执行次数,停止任务")print("导出超时")self.MMWindow.CaptureToImage("exportImage.png")schedule.clear("ExportWindowCloseTask")def ExportResult(self, exportWindow):# 导出成功后关闭导出窗口,定时执行导出关闭界面任务taskTime = 1  ## CloseTask=schedule.every(taskTime).minutes.do(self.ExportWindowCloseTask)#每隔5分钟定时执行,满足条件后停止任务TaskClose = schedule.every(10).seconds.do(self.ExportWindowCloseTask)  # 间隔5秒执行任务now = datetime.now()startTime = now.strftime("%Y-%m-%d %H:%M:%S")print("开始时间", str(startTime))while True:exportResultWindow = self.MMWindow.ButtonControl(AutomationId="exportResultWindow", desc="导出结果窗口",searchDepth=1)if not exportWindow.Exists() and not exportResultWindow.Exists():EndT = datetime.now()EndTime = EndT.strftime("%Y-%m-%d %H:%M:%S")print("结束时间", EndTime)print('执行时间', (EndT - now).total_seconds())self.MMWindow.CaptureToImage("exportImageOK" + EndTime + ".png")  # 截图# 清空任务,关闭任务schedule.clear()schedule.CancelJob()break# 如导出窗口存在,继续执行schedule.run_pending()time.sleep(1)# 关闭程序,回收对象,释放资源
"""
def __del__(self):
self.MMWindow.ButtonControl(Name="暂停").Click()#例如音乐暂停
self.MMWindow.ButtonControl(Name="关闭").Click()#单击关闭按钮
self.MMWindow.GetWindowPattern().Close()#关闭当前程序
"""if __name__ == '__main__':path = r"C:\Program Files\MiniTool MovieMaker\bin\Launcher.exe"# tp = TestProject()# # tp.testImport()# tp.TestExport()pytest.main(['-vs', 'TestExportHF.py'])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive进阶(4)----MapReduce的计算过程(赋图助君理解)

MapReduce的计算过程 MapReduce是一种编程模型和处理大规模数据集的方法。它通常用于分布式计算环境中,能够将数据处理任务分解成独立的部分,分配给多台计算机进行并行处理。这个模型由Google提出,并在开源领域中得到了广泛的应用和实现。Map…

无法连接到MongoDB Atlas 的Cloud Database

打开Mongodb网页: 选择允许任何地址连接 连接成功

Docker容器嵌入式开发:在Ubuntu上配置RStudio与R语言、可视化操作

目录 一、dirmngr工具二、R环境安装与配置三、验证是否安装成功四、安装Rstudio五、可视化操作参考 以上是在Ubuntu 18.04上安装最新版本的R语言环境的步骤摘要。首先,通过添加CRAN镜像源并安装GPG密钥来配置软件源。然后,更新软件包列表并通过apt安装R语…

Ubuntu22.04.4 - vim - 笔记

一、编辑模式 1、进入 进入编辑模式: i 2、退出 退出编辑模式: Esc 二、命令行模式 1、进入 进入命令行,在退出编辑模式的情况下: : :wq 保存并退出、:q 不保存退出、 :q! 不保存强制退出 2、退出 退出编辑模式: Esc

SQL --索引

索引 INDEX 伪列 伪装起来的列,不容易被看见,要特意查询才能看见 ROWNUM: 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题:查询emp表中,前三个员工 SELECT * FROM * from emp w…

【创建型模式】建造者模式

一、建造者模式概述 建造者模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同得表示。(对象创建型模式)。 建造者模式分析: 1.将客户端与包含多个部件得复杂对象得创建过程分离,客户端无需知道复杂对象…

微软面试高频算法题解析与代码实现(C++)

作为全球顶尖科技公司,微软对人才的招聘要求十分严格,尤其是在算法工程师的选拔上。算法面试是微软招聘流程中不可或缺的一环,考察候选人对算法和数据结构的理解和应用能力。本文将列举微软面试中出现频率较高的 10 道算法题,并使…

【unity】【C#】游戏音乐播放和发布

今天我们来认识一下有关 unity 音乐的一些知识 我们先创建 AudioClips 文件夹,这个文件夹通常就是 unity 中存放音乐的文件夹,然后拖进音乐文件进去 这里为大家提供了两个音乐,有需要可以自取 百度网盘:https://pan.baidu.com/s…

RIP最短路实验(华为)

思科设备参考:RIP最短路实验(思科) 一,技术简介 RIP(Routing Information Protocol,路由信息协议)是一种基于距离矢量的内部网关协议,工作原理是每个路由器周期性地向邻居路由器发…

React Ant Design 简单实现如何选中图片

效果: 代码: 定义的初始值和方法 const [selected, setSelected] useState(0); // 表示当前选中的图片索引const handleClick (index) > {if (selected index) {setSelected(null); // 如果点击的是已选中的图片,则取消选中状态} else…

tcp inflight 守恒算法(tcp_ccr)

最初的算法: 在 winmax 中追踪 alpha rounds 的 bw / rtt,将其 bw 记为 b;在 winmin 中追踪 k*alpha rounds 的 rtt,记为 minrtt;保持 inflight b * minrtt beta。 后来我给 beta 增加了一个 rtt 缩放系数&#xf…

JVM虚拟机(十)Java内存泄漏的排查思路

目录 一、可能产生内存泄露的地方二、复现堆内存泄漏三、如何排查堆内存问题?3.1 获取对内存快照 dump3.2 使用 Visual VM 去分析 dump 文件3.3 定位内存溢出问题 一、可能产生内存泄露的地方 在进行排查 Java 的内存泄漏问题之前,首先我们要知道哪里可…

ISO Swift高德导航开发指南

开发环境 xode:12.0 模拟器:iphone 14 plus cocoapods:1.15.2 swift:5.7.1 ios:16.1(20B72) IOS包管理工具cocoapods 官网地址:https://cocoapods.org/ 方式1:安装指…

Avalonia 捕获全局异常(UI线程 和 非UI线程),增加客户端的稳定性

在 App.axaml.cs 中,App类添加下列事件; 1.重写 OnFrameworkInitializationCompleted ,会在程序初始化完成后触发 2. 绑定AppDomain中当前域的事件 AppDomain.CurrentDomain.UnhandledException HandleGlobalException; //UI线程 …

【任务调度】Apache DolphinScheduler快速入门

Apache DolphinScheduler基本概念 概念:分布式、去中心化、易扩展的可视化DAG工作流任务调度系统。 作用:解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。Apache DolphinScheduler是一款开源的调度工具&#xff…

windows下python opencv ffmpeg读取摄像头实现rtsp推流 拉流

windows下python opencv ffmpeg读取摄像头实现rtsp推流 拉流 整体流程1.下载所需文件1. 1下载rtsp推流服务器1.2 下载ffmpeg2. 开启RTSP服务器3. opencv 读取摄像头并调用ffmpeg进行推流4. opencv进行拉流整体流程 1.下载所需文件 1. 1下载rtsp推流服务器 下载 RTSP服务器 下…

jenkins 部署 vue 项目

jenkins 部署 vue 项目 环境 系统:CentOS7.9 Jenkins:最新LTS版本 nginx: 1.24.x gitLab: 打包机:jenkins所在服务器 目标机器:nginx所在服务器 jenkins部署配置 关键脚本 #node -v #已经安装node_module就无需执行install安…

[旅游] 景区排队上厕所

人有三急,急中最急是上个厕所要排队,而且人还不少!这样就需要做一个提前量的预测,万一提前量的预测,搞得不当,非得憋出膀光炎,或者尿裤子。尤其是女厕所太少!另外一点是儿童根本就没…

python装饰器系列教程(4)

上一篇的教材可查看https://blog.csdn.net/qq_45812220/article/details/137812983?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22137812983%22%2C%22source%22%3A%22qq_45812220%22%7D 本篇在上一篇的基础上,探究…

Chatgpt系列(二) 如何写prompt提词

prompt提词是gpt工程的一个核心, 一个prompt多一个空格少一个空格就可能会出现两种结果.这里介绍一些实战中的经验. 根据场景设置temperature和top_k temperature越大,top_k越小返回的结果就越稳定, 对于信息提取,意图识别, 意图判断这种非创造性的可以调整这两个值,降低幻觉…