Pywinauto窗口查找: Application模块

3 篇文章 1 订阅
2 篇文章 0 订阅

        在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()。

  

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值