当前位置:首页 » 《我的小黑屋》 » 正文

PC端windows自动化:pywinauto(三)控件定位方法和控件可用方法

20 人参与  2024年04月12日 17:43  分类 : 《我的小黑屋》  评论

点击全文阅读


操作控件需要以下几个步骤: 

第一步 实例化要操作的进程:得到的app是Application对象。

第二步 选择窗口 :app.window('一个或多个筛选条件') 得到的窗口是WindowSpecification对象

第三步:基于WindowSpecification对象使用其方法再往下查找,定位到具体的控件

第四步:使用控件的方法属性执行我们需要的操作。

WindowSpecification源码中有一些自带的方法可以直接使用,也有注释说到:

      WindowSpecification 说明

该对象中__getattribute__和__getitem__两个魔术方法,隐式地记录一些私有方法

我们可以继续往下一层一层的查找,下面一层一层的控件其实是各种各样的wrapper对象,wrapper有很多种是一系列对象,对象源码都在pywinauto源码的controls目录中

以下总结了常用方法,基本可以满足所有场景的操作,如下:

一、 层级查找控件的方法

window(**kwargs) # 用于窗口的查找child_window(**kwargs) # 可以不管层级的找后代中某个符合条件的元素,最常用parent() # 返回此元素的父元素,没有参数children(**kwargs) # 返回符合条件的子元素列表,支持索引,是BaseWrapper对象(或子类)iter_children(**kwargs) # 返回子元素的迭代器,是BaseWrapper对象(或子类)descendants(**kwargs) # 返回符合条件的所有后代元素列表,是BaseWrapper对象(或子类)iter_children(**kwargs) # 符合条件后代元素迭代器,是BaseWrapper对象(或子类)

二、 kwargs筛选条件

常用的一些筛选条件:

class_name=None, # 类名class_name_re=None, # 正则匹配类名title=None, # 控件的标题文字,对应inspect中Name字段title_re=None, # 正则匹配文字control_type=None, # 控件类型,inspect界面LocalizedControlType字段的英文名best_match=None, # 这个有坑,我不喜欢用,下文有讲解auto_id=None, # 这个也是固定的可以用,inspect界面AutomationId字段,但是很多控件没有这个属性

三、 控件常用的方法属性

3.1、 以下几个只支持窗口模式的控件

dlg.close() # 关闭界面dlg.minimize() # 最小化界面dlg.maximize() # 最大化界面dlg.restore() # 将窗口恢复为正常大小,比如最小化的让他正常显示在桌面dlg.get_show_state() # 正常0,最大化1,最小化2
dlg.exists(timeout=None, retry_interval=None) # 判断是否存在    #timeout:等待时间,一般默认5s    #retry_interval:timeout内重试时间dlg.wait(wait_for, timeout=None, retry_interval=None) # 等待窗口处于特定状态dlg.wait_not(wait_for_not, timeout=None, retry_interval=None) # 等待窗口不处于特定状态,即等待消失    # wait_for/wait_for_not:    # * 'exists' means that the window is a valid handle    # * 'visible' means that the window is not hidden    # * 'enabled' means that the window is not disabled    # * 'ready' means that the window is visible and enabled    # * 'active' means that the window is active    # timeout:等待多久    # retry_interval:timeout内重试时间    # eg: dlg.wait('ready')3.2、常用鼠标键盘操作 =====================================================================================ctrl.click_input() # 左键单击ctrl.right_click_input() # 鼠标单击# 键盘输入,底层还是调用keyboard.send_keysctrl.type_keys(keys, pause = None, with_spaces = False,)    # keys:要输入的文字内容    # pause:每输入一个字符后等待时间,默认0.01就行    # with_spaces:是否保留keys中的所有空格,默认去除0ctrl.double_click_input(button ="left", coords = (None, None)) # 左键双击ctrl.press_mouse_input(coords = (None, None)) # 指定坐标按下左键,不传坐标默认左上角ctrl.release_mouse_input(coords = (None, None)) # 指定坐标释放左键,不传坐标默认左上角ctrl.move_mouse_input(coords=(0, 0)) # 将鼠标移动到指定坐标,不传坐标默认左上角ctrl.drag_mouse_input(dst=(0, 0)) # 将ctrl拖动到dst,是press-move-release操作集合3.2、控件的常用属性
ctrl.children_texts() # 所有子控件的文字列表,对应inspect中Name字段ctrl.window_text() # 控件的标题文字,对应inspect中Name字段ctrl.class_name() # 控件的类名,对应inspect中ClassName字段,有些控件没有类名ctrl.element_info.control_type # 控件类型,inspect界面LocalizedControlType字段的英文名ctrl.is_child(parent) # ctrl是否是parent的子控件ctrl.legacy_properties().get('Value') # 可以获取inspect界面LegacyIAccessible开头的一系列字段,在源码uiawraper.py中找到了这个方法,非常有用
3.3、控件常用操作
ctrl.draw_outline(colour='green') # 空间外围画框,便于查看,支持'red', 'green', 'blue'ctrl.is_dialog # 判断是否为dialog,一个微信是一个dialog,就是窗口ctrl.print_control_identifiers(depth=None, filename=None) # 打印其包含的元素,详见打印元素ctrl.scroll(direction, amount, count=1,) # 滚动direction :"up", "down", "left", "right"/amount:"line" or "page"/count:int 滚动次数ctrl.capture_as_image() # 返回控件的 PIL image对象,可继续使用其方法如下:    eg:ctrl.capture_as_image().save(img_path)ret = ctrl.rectangle() # 控件上下左右坐标,(L430, T177, R1490, B941),可.输出上下左右    eg:ret.top=177/ret.bottom=941/ret.left=430/ret.right=1490

基于pywinauto实现PC端自动化 python操作微信自动化 - 沐雨橙风633 - 博客园

 

 

 


点击全文阅读


本文链接:http://zhangshiyu.com/post/94497.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1