大连全瓷种植牙齿制作中心 发表于 2025-4-4 03:04:21

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

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

start



[*]有时间pc端电脑,会有一些重复操纵,盼望能够通过代码实现这些操纵。
[*]实行了好几个库,但是辨认正确率很低,在苦苦寻找之后,发现一个非常好用的 python 库 :uiautomation。
[*]今天来记录一下相关知识点。
1. uiautomation 官方说明

官方地址:uiautomation-github
官方介绍:https://i-blog.csdnimg.cn/direct/c23f910fdecc4a27904c007460353ef1.png
2. 前置条件

定位软件或定位组件,需要分析我们的软件。
目前两种方案
2.1 inspect.exe

官网直接下载,即可分析我们的软件和软件中的组件。
# 下载地址
https://github.com/blackrosezy/gui-inspect-tool
https://i-blog.csdnimg.cn/direct/48e065db4c574876b01ff09bcaa7d54b.png
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 匹配属性值


[*] searchFromControl = None:从哪个控件开始查找,如果为None,从根控件Desktop开始查找
[*] searchDepth = 0xFFFFFFFF: 搜索深度
[*] searchInterval = SEARCH_INTERVAL:搜索隔断
[*] foundIndex = 1 :搜索到的满足搜索条件的控件索引,索引从1开始
[*] Name:控件名字
[*] SubName :控件部分名字
[*] RegexName:利用re.match匹配符合正则表达式的名字,Name,SubName,RegexName只能利用一个,不能同时利用
[*] ClassName :类名字
[*] AutomationId: 控件AutomationId
[*] ControlType :控件范例
[*] Depth:控件相对于searchFromControl的精确深度
[*] 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



[*]可以机动的利用匹配字段,然后去获取

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Window脚本自动化uiautomation详解_番茄出品