当前位置: 首页 > article >正文

Window脚本自动化uiautomation详解_番茄出品

Window脚本自动化uiautomation详解_番茄出品

start

  • 有时候pc端电脑,会有一些重复操作,希望能够通过代码实现这些操作。
  • 尝试了好几个库,但是识别准确率很低,在苦苦寻找之后,发现一个非常好用的 python 库 :uiautomation
  • 今天来记录一下相关知识点。

1. uiautomation 官方说明

官方地址:uiautomation-github

官方介绍在这里插入图片描述

2. 前置条件

定位软件或定位组件,需要分析我们的软件。

目前两种方案

2.1 inspect.exe

官网直接下载,即可分析我们的软件和软件中的组件。

# 下载地址
https://github.com/blackrosezy/gui-inspect-tool

在这里插入图片描述

2.2 automation.py

安装: uiautomation

pip install uiautomation

当安装了 uiautomation,在python安装目录下的Scripts目录下得到一个 automation.py 脚本,可以使用它来准确获取目标窗口的控件结构信息。

执行: automation.py

python automation.py -t1 -d1

automation.py 的逻辑可以看帮助指令,或者另行百度。算是用命令行的形式去分析窗口,建议是使用 inspect.exe。 特殊情况 inspect.exe 识别不精准的时候,以 automation.py 为准。

3. 快速上手(常用方法)

想对这个库,有全面了解,可以参考 参考博客。我这里说下如何快速上手。

3.0 重点

uiautomation 之所以识别精度高,是因为他有一个很独特的查询参数,那就是可以定义查询窗口/空间的深度

  • searchDepth = 0xFFFFFFFF: 搜索深度;
  • Depth:控件相对于searchFromControl的精确深度;

searchDepth在指定的深度范围内(包括1~searchDepth层中的所有子孙控件)搜索第一个满足搜索条件的控件。
Depth只在Depth所在的深度,搜索第一个满足搜索条件的控件。

比如我已知我控件在第四层,结合其他参数,很容易定位到具体的内容参数。当然配合它的一些 兄弟父子选择器,很容易选择到一些特征很相似的组件。

3.1 安装

pip install uiautomation

3.2 匹配属性值

  1. searchFromControl = None:从哪个控件开始查找,如果为None,从根控件Desktop开始查找

  2. searchDepth = 0xFFFFFFFF: 搜索深度

  3. searchInterval = SEARCH_INTERVAL:搜索间隔

  4. foundIndex = 1 :搜索到的满足搜索条件的控件索引,索引从1开始

  5. Name:控件名字

  6. SubName :控件部分名字

  7. RegexName:使用re.match匹配符合正则表达式的名字,Name,SubName,RegexName只能使用一个,不能同时使用

  8. ClassName :类名字

  9. AutomationId: 控件AutomationId

  10. ControlType :控件类型

  11. Depth:控件相对于searchFromControl的精确深度

  12. Compare:自定义比较函数function(control: Control, depth: int)->bool

3.2 获取软件窗口

notepadWindow = auto.WindowControl(searchDepth=1, ClassName="Notepad")
# 获取深度为1 ,ClassName是Notepad的窗口 
# 其实就是获取记事本

3.3 获取窗口中的组件

edit = notepadWindow.Control(searchDepth=2, Name="文本编辑器")
# 获取深度为2 ,Name是文本编辑器的窗口 

3.4 触发键盘或鼠标逻辑

auto.SetClipboardText("WIN98中的“98”是什么意思?")
edit.SendKeys(
    "{Ctrl}v"
)  # 获取文本print("编辑框内容:",edit.GetValuePattern().Value)# 通过标题栏查找名称为关闭的按钮
auto.SendKeys("{Ctrl}s")

auto.SendKeys("2.自己创造的文件")  # 输入文件名,并快捷键点击保存
auto.SendKeys("{ALT}s")  # 如果弹出文件名冲突提示,则确认覆盖

# auto是uiautomation别名
# edit是编辑组件

3.5 其他选择器

获取所有的子控件:

control.GetChildren()

获取首个子控件:

control.GetFirstChildControl()

获取最后一个子控件:

control.GetLastChildControl()

获取下一个兄弟控件:

control.GetNextSiblingControl()

获取前一个兄弟控件:

control.GetPreviousSiblingControl()

获取父控件:

control.GetParentControl()

获取顶层窗口控件:

control.GetTopLevelControl()

获取满足指定条件的祖先控件:

control.GetAncestorControl(func)

4. demo案例

2.编写并且修改记事本.py

import subprocess
import uiautomation as auto

auto.uiautomation.SetGlobalSearchTimeout(2)  # 设置全局搜索超时时间为2秒

subprocess.Popen(
    "notepad.exe"
)  # 首先从桌面的第一层子控件中找到记事本程序的窗口WindowControl,再从这个窗口查找子控件
notepadWindow = auto.WindowControl(searchDepth=1, ClassName="Notepad")
print(notepadWindow.Name)  # 设置窗口前置
notepadWindow.SetTopmost(True)  # 输入文本
edit = notepadWindow.Control(searchDepth=2, Name="文本编辑器")
# 文本编辑器

auto.SetClipboardText("WIN98中的“98”是什么意思?")
edit.SendKeys(
    "{Ctrl}v"
)  # 获取文本print("编辑框内容:",edit.GetValuePattern().Value)# 通过标题栏查找名称为关闭的按钮
auto.SendKeys("{Ctrl}s")

auto.SendKeys("2.自己创造的文件")  # 输入文件名,并快捷键点击保存
auto.SendKeys("{ALT}s")  # 如果弹出文件名冲突提示,则确认覆盖

5.参考博客

  • Windows桌面程序自动化控制之uiautomation模块全面讲解

end

  • 可以灵活的使用匹配字段,然后去获取

http://www.kler.cn/a/406988.html

相关文章:

  • 二维绘图,地图(Openlayers/Leafletjs)
  • Web3.0安全开发实践:Clarity最佳实践总结
  • 浅析解析 3D NMS 算法及实现
  • IDEA2023 SpringBoot整合MyBatis(三)
  • 【虚幻引擎】UE5数字人开发实战教程
  • 0基础跟德姆(dom)一起学AI NLP自然语言处理01-自然语言处理入门
  • 【C++】继承(inheritance)
  • 【优先算法】专题——双指针
  • RSA算法
  • 4-测试viper读取配置文件数据 --开源项目obtain_data测试
  • el-table vue3统计计算数字
  • 深入理解Rust的模式匹配
  • qt 发布简单项目
  • 【项目日记】仿mudou的高并发服务器 --- 实现缓冲区模块,通用类型Any模块,套接字模块
  • IDEA中Spring Initializr jdk1.8 没有Java8选项问题处理办法
  • JavaScript的类型转换
  • 第二十六章 TCP 客户端 服务器通信 - $ZB 和 READ 命令
  • goframe开发一个企业网站 MongoDB 完整工具包19
  • c#:winform调用bartender实现打印(学习整理笔记)
  • 使用IDEA构建springboot项目+整合Mybatis
  • Redis相关面试题汇总
  • HARCT 2025 新增分论坛7:机器人和自动化的新趋势
  • CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下
  • 常见LLM大模型概览与详解
  • 【AI日记】24.11.23 学习谷歌数据分析初级课程-第4课
  • linux通过手工删除文件卸载oracle 11g rac的具体步骤