0


初识UI自动化(inspect.exe + 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中已经讲到,就不再重述了。


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的小案例,敬请期待!**


标签: python 自动化

本文转载自: https://blog.csdn.net/knighthood2001/article/details/124297008
版权归原作者 knighthood2001 所有, 如有侵权,请联系我们删除。

“初识UI自动化(inspect.exe + uiautomation)”的评论:

还没有评论