在Pywinauto中pywinauto.application模块是最常用的模块之一,它含有两个非常重要的类,一个是Application类,另一个是WindowsSpecification类。
Application类
前面一篇我们已经知道,要自动操作应用程序需要借助实例化的Application类,并让它与应用程序关联。今天我们再来看看Application中除了start()和connect()之外的其他方法:
1. top_window()
返回关连应用的最上层窗口的WindowSpecification,我们可以借此来进行该窗口的自动化操作。关于WindowSpecification,会在本文的后面介绍。
2. active()
返回关联应用的一个激活窗口的WindowSpecification,如果没有激活的窗口则会报错。
3. window(**kwargs)
利用一组关键词参数来针对关联应用创建一个WindowSpecification
4. windows(**kwargs)
返回属于本应用的符合条件的窗口或控件的Wrapper数组。
5. kill(soft=False)
杀死应用进程,类似于在任务管理器中结束进程。
6. 其他与进程状态有关的方法,从名字上可以知道其功能
cpu_usage()
is64bit()
is_process_running()
wait_cpu_usage_lower()
wait_for_proecess_exit()
WindowSpecification类
Pywinauto对于窗口的操作,一般需要借助WindowSpecification,接下来我们就来看看Application模块里面第二个重要的类WindowSepcification。
类声明:
class pywinauto.application.WindowSpecification(search_criteria,
allow_magic_lookup=True)
WindowSpecification类的对象用于记录一组搜索条件,通过这些条件来查找窗口或控件。一个WindowSpec对象会在每次执行操作时根据条件匹配对应的Wrapper Object再进行操作。
Magic_Loopup是Pywinauto进行匹配的模式,通过它可以最大限度地根据指定的条件匹配到窗口和控件,大多数时候并不需要精确的条件就可以匹配到想要的目标。
所以当你指定的搜索条件不能匹配到合适的窗口时,程序并不会立刻报错,只有当需要利用WindowSpec去操作窗口时,错误才会发生。
窗口的树形结构
程序窗口及其子窗口和控件,形成了一个树形结构,我们往往需要对不同层级的窗口和控件进行操作。WindowSpecification类给我们提供了一系列的方法去获取树形结构中的各级元素。
1. dump_tree(depth=None, filename=None)
a. 打印当前WindowSpec所匹配元素为根节点的所有子节点及其详细信息。
b. 为每个节点提供了child_window()的调用方法示例。
c. 为每个节点提供了使用"[ ]"调用的定位信息
例如,下图是app关联了Notepad后,app.top_window().dump_tree()的部分打印结果:
Dialog - '无标题 - 记事本' (L43, T53, R743, B616)
['无标题 - 记事本', '无标题 - 记事本Dialog', 'Dialog']
child_window(title="无标题 - 记事本", control_type="Window")
|
| Edit - '文本编辑器' (L52, T116, R734, B578)
| ['Edit']
| child_window(title="文本编辑器", auto_id="15", control_type="Edit")
| |
| 。。。
| StatusBar - '状态栏' (L52, T578, R734, B607)
| ['状态栏StatusBar', '状态栏', 'StatusBar']
| child_window(title="状态栏", auto_id="1025", control_type="StatusBar")
| |
| 。。。
| Menu - '应用程序' (L52, T91, R734, B115)
| ['Menu2', '应用程序Menu', '应用程序']
| child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar")
| |
| 。。。
如果要操作主窗口下一级的Edit - ‘文本编辑器’,可以通过如下语句获得该控件的WindowSpec.
app.top_window()['Edit']
#或者
app.top_window().child_window(title="文本编辑器", auto_id="15", control_type="Edit")
dump_tree()方法等同于print_control_identifiers()和print_ctrl_ids()方法。
2. child_window(**criteria)
用于生成当前窗口下,符合criteria规则的子节点的WindowSpec对象。该方法参数的设置,可以参考dump_tree()方法的打印结果。
3. wrapper_object()
用于获取该WindowSpec对象所匹配的具体窗口/控件的Wrapper Object。Wrapper Object的类型由匹配到的具体控件决定,例如ToolbarWrapper, ButtonWrapper, ListViewWrapper等等。对具体控件的操作,也由相应Wrapper Object的方法调用来实现。
Pywinauto需要获得相应Wrapper Object才能操作控件,但是Pywinauto常常可以隐藏对wrapper_object()的调用,从而用较精简的代码实现操作。如下两个语句实现相同的功能:
#常规调用方法
dlg_spec.wrapper_object().minimize()
#相同的效果,不显式调用wrapper_object()
dlg_spec.minimize()
4. exists(timeout=None, retry_interval=None)
检查WindowSpec所匹配窗口/控件是否存在,存在则返回True。
5. wait(wait_for, timeout=None, retry_interval=None)
等待窗口进入特定的状态,状态可以是如下一种或几种的组合:'exists', 'visible', 'enabled', 'ready', 'active'。与之对应的,功能相反的方法为wait_not()。