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 匹配属性值
-
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
- 可以灵活的使用匹配字段,然后去获取