赞
踩
目录
笔者最近也在学习关于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 工具,用于查询记事本中 “编辑” 菜单元素的 UI 自动化属性。
选择此选项后 | 检查 会这样做 |
---|---|
始终位于顶部 (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)
| 显示" 树" 视图。 |
1:Refresh,刷新Tree View(树视图)
2:Copy Text to Clipboard,复制Data View(数据视图)的文本到剪切板
3:Show Settings Dialog,显示Options的Settings
4:剩下的重要按钮在Options中已经讲到,就不再重述了。
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的小案例,敬请期待!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。