目录
一、前言
二、具体内容
inspect.exe讲解
Options(选项栏)
Toolbar(工具栏)
uiautomation讲解
三、总结
一、前言
笔者最近也在学习关于uiautomation的相关小项目,不过在做这些自动化之前,需要首先获取你需要操作的元素的相关信息,比如:鼠标点击事件、键盘输入事件,快捷键操作。 目前获取需要操作的元素的相关信息的软件有许多,如UIspy.exe,inspect.exe,Insight.exe等等。下文中以inspect.exe为例。
补充:如果需要Insight.exe,请点这里。
二、具体内容
参考文献:
辅助功能工具 - 检查 - Win32 apps | Microsoft Docs
https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/blob/master/readme_cn.md
inspect.exe讲解
" 检查 "窗口有几个主要部分:
- 标题栏。 显示" 检查 HWND (窗口句柄) 。
- 菜单栏。 提供对 检查功能 的访问权限。
- 工具 栏。 提供对 检查功能 的访问权限。
- 树视图。 将 UI 元素的层次结构呈现为树视图控件,可用于在元素之间导航。
- 数据视图。 显示所选 UI 元素的所有公开辅助功能属性。
菜单栏中提供的命令也可在工具栏中使用。 下图展示了 Inspect 工具,用于查询记事本中 “编辑” 菜单元素的 UI 自动化属性。
Options(选项栏)
选择此选项后 | 检查 会这样做 |
---|---|
始终位于顶部 (Always on Top) |
显示在屏幕上的任何其他窗口的顶部。 |
MSAA 模式 (MSAA Mode) |
显示Microsoft Active Accessibility属性信息。 |
UI 自动化模式 (UI Automation Mode) |
显示UI 自动化属性信息。 |
原始视图 (Raw View) |
在" 树"视图中 UI 自动化树或 MSAA 树的原始视图 。 |
控件视图 (Control View) |
在" 树"视图中 UI 自动化树的 控件 视图。 仅在UI 自动化模式下可用。 |
内容视图 (Content View) |
在" 树"视图中 UI 自动化树 的内容 视图。 仅在UI 自动化模式下可用。 |
活动悬停工具栏 (Active-Hover Toolbar) |
在鼠标悬停时激活工具栏按钮,而无需单击鼠标。 |
出错时发出Epep (Beep on Error) |
在运行或 MSAA 操作期间检测到错误时UI 自动化发出警报。 |
SPI _ SCREENREADER 标志 (SPl_SCREENREADER flag) |
假设存在屏幕阅读器。 此标志指示应用程序应以文本方式(而不是图形方式)提供信息。 不应仅仅因为存在屏幕阅读器而设置此标志。 |
显示突出显示矩形 (Show Highlight Rectangle) |
突出显示具有焦点的元素周围的矩形。 |
显示 Caret 突出显示 (Show Caret Highlight) |
突出显示该点。 仅在 MSAA 模式下可用。 |
显示信息工具提示 (Show Information Tooltip) |
在工具提示中显示属性信息。 |
观看焦点 (Watch Focus)
|
跟随键盘焦点。 选中后,将安装异步焦点事件挂钩,将光标移到具有焦点的元素的左上方。 这将导致 检查 在大约一秒后刷新其属性。 |
监视 Caret (Watch Caret)
|
遵循该点。 仅在 MSAA 模式下可用。 |
监视光标 (Watch Cursor)
|
在光标后。 |
监视工具提示 (Watch Tooltips)
|
遵循工具提示。 |
显示树 (Show Tree)
|
显示" 树" 视图。 |
Toolbar(工具栏)
1:Refresh,刷新Tree View(树视图)
2:Copy Text to Clipboard,复制Data View(数据视图)的文本到剪切板
3:Show Settings Dialog,显示Options的Settings
4:剩下的重要按钮在Options中已经讲到,就不再重述了。
文章来源地址https://www.toymoban.com/news/detail-421697.html
uiautomation讲解
uiautomation根据你提供的控件属性在控件树中从上往下查找控件。
假设控件树如下:
root(Name='Desktop', Depth=0)
window1(Depth=1)
control1-001(Depth=2)
control1-...(Depth=2)
...
control1-100(Depth=2)
window2(Name='window2', Depth=1)
control2-1(Depth=2)
control2-1-001(Depth=3)
control2-1-...(Depth=3)
...
control2-1-100(Depth=3)
control2-2(Depth=2)
control2-3(Depth=2)
control2-4(Name='2-4', Depth=2)
editcontrol(Name='myedit1', Depth=3)
editcontrol(Name='myedit2', Depth=3)
如果你想找到名字为myedit2的EditControl,并在这个EditControl打字,你可以这样写:
uiautomation.EditControl(searchDepth=3, Name='myedit2').SendKeys('hi')
但是这个代码运行效率并不高,因为控件树中有很多控件,你所查找的EditControl在树的末尾, 从树根部搜索整个控件树需要遍历200多次才能找到这个EditControl, 如果用分层查找并指定查找深度,就可以只查找几次,很快就能找到控件。
代码如下:
window2 = uiautomation.WindowControl(searchDepth=1, Name='window2')#search 2 times
sub = window2.Control(searchDepth=1, Name='2-4')# search 4 times
edit = sub.EditControl(searchDepth=1, Name='myedit2')# search 2 times
edit.SendKeys('hi')
先在root的第一层子控件中查找window2,需要查找2次。 再在window2的第一层子控件中查找control2-4,需要查找4次。 最后在control2-4的第一层子控件中查找myedit2,需要查找2次。 总共需要查找8次就能找到控件。
此外,在控件的__init__函数中,有下列参数可以使用:
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
重点如下:
searchDepth和Depth的区别是:
searchDepth: int, max search depth from searchFromControl.searchDepth在指定的深度范围内(包括1~searchDepth层中的所有子孙控件)搜索第一个满足搜索条件的控件
Depth: int, only search controls in relative depth from searchFromControl, ignore controls in depth(0~Depth-1),if set, searchDepth will be set to Depth too.Depth只在Depth所在的深度(如果Depth>1,排除1~searchDepth-1层中的所有子孙控件)搜索第一个满足搜索条件的控件
三、总结
在学习ui自动化的时候,inspect.exe的学习与使用可以大大减少你找你要操作的元素位置的时间。
笔者最近也在学uiautomation的相关知识,要学习后续内容,以上知识的掌握必不可少,笔者也只是将参考文献中重要内容进行提取展示。之后笔者会更新一些关于uiautomation的小案例,敬请期待!文章来源:https://www.toymoban.com/news/detail-421697.html
到了这里,关于初识UI自动化(inspect.exe + uiautomation)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!