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

打印 上一主题 下一主题

主题 1394|帖子 1394|积分 4197

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

start



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

官方地址:uiautomation-github
官方介绍

2. 前置条件

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

官网直接下载,即可分析我们的软件和软件中的组件。
  1. # 下载地址
  2. https://github.com/blackrosezy/gui-inspect-tool
复制代码

2.2 automation.py

安装: uiautomation
  1. pip install uiautomation
复制代码
当安装了 uiautomation,在python安装目次下的Scripts目次下得到一个 automation.py 脚本,可以利用它来正确获取目的窗口的控件结构信息。
执行: automation.py
  1. 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 安装

  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 获取软件窗口

  1. notepadWindow = auto.WindowControl(searchDepth=1, ClassName="Notepad")
  2. # 获取深度为1 ,ClassName是Notepad的窗口
  3. # 其实就是获取记事本
复制代码
3.3 获取窗口中的组件

  1. edit = notepadWindow.Control(searchDepth=2, Name="文本编辑器")
  2. # 获取深度为2 ,Name是文本编辑器的窗口
复制代码
3.4 触发键盘或鼠标逻辑

  1. auto.SetClipboardText("WIN98中的“98”是什么意思?")
  2. edit.SendKeys(
  3.     "{Ctrl}v"
  4. )  # 获取文本print("编辑框内容:",edit.GetValuePattern().Value)# 通过标题栏查找名称为关闭的按钮
  5. auto.SendKeys("{Ctrl}s")
  6. auto.SendKeys("2.自己创造的文件")  # 输入文件名,并快捷键点击保存
  7. auto.SendKeys("{ALT}s")  # 如果弹出文件名冲突提示,则确认覆盖
  8. # auto是uiautomation别名
  9. # edit是编辑组件
复制代码
3.5 其他选择器

获取全部的子控件:
  1. control.GetChildren()
复制代码
获取首个子控件:
  1. control.GetFirstChildControl()
复制代码
获取末了一个子控件:
  1. control.GetLastChildControl()
复制代码
获取下一个兄弟控件:
  1. control.GetNextSiblingControl()
复制代码
获取前一个兄弟控件:
  1. control.GetPreviousSiblingControl()
复制代码
获取父控件:
  1. control.GetParentControl()
复制代码
获取顶层窗口控件:
  1. control.GetTopLevelControl()
复制代码
获取满足指定条件的先人控件:
  1. control.GetAncestorControl(func)
复制代码
4. demo案例

2.编写并且修改记事本.py
  1. import subprocess
  2. import uiautomation as auto
  3. auto.uiautomation.SetGlobalSearchTimeout(2)  # 设置全局搜索超时时间为2秒
  4. subprocess.Popen(
  5.     "notepad.exe"
  6. )  # 首先从桌面的第一层子控件中找到记事本程序的窗口WindowControl,再从这个窗口查找子控件
  7. notepadWindow = auto.WindowControl(searchDepth=1, ClassName="Notepad")
  8. print(notepadWindow.Name)  # 设置窗口前置
  9. notepadWindow.SetTopmost(True)  # 输入文本
  10. edit = notepadWindow.Control(searchDepth=2, Name="文本编辑器")
  11. # 文本编辑器
  12. auto.SetClipboardText("WIN98中的“98”是什么意思?")
  13. edit.SendKeys(
  14.     "{Ctrl}v"
  15. )  # 获取文本print("编辑框内容:",edit.GetValuePattern().Value)# 通过标题栏查找名称为关闭的按钮
  16. auto.SendKeys("{Ctrl}s")
  17. auto.SendKeys("2.自己创造的文件")  # 输入文件名,并快捷键点击保存
  18. auto.SendKeys("{ALT}s")  # 如果弹出文件名冲突提示,则确认覆盖
复制代码
5.参考博客



  • Windows桌面步伐自动化控制之uiautomation模块全面讲解
end



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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表