windows 桌面GUI自动化-4. pywinauto 操作窗口控件child_window()
前言
桌面应用的操作都是基于控件操作,先找到对应的窗口,基于操控查找框架即可操作了。
查看窗口控件
先学会如何查看窗口框架,可以用inspect.exe 查看窗口的层级结构
以打开的记事本为例
也可以通过print_ctrl_ids()
方法 (另外一个print_control_identifiers()
功能一样)查看当前窗口下的控件
from pywinauto import Application
import time
app = Application('uia').start("notepad.exe")
win = app.window(title_re="无标题 - 记事本")
# 获取当前窗口下控件
print(win.print_ctrl_ids())
结果如下
Dialog - '无标题 - 记事本' (L397, T290, R1906, B1054)
['Dialog', '无标题 - 记事本', '无标题 - 记事本Dialog']
child_window(title="无标题 - 记事本", control_type="Window")
|
| Edit - '文本编辑器' (L405, T341, R1898, B1046)
| ['Edit']
| child_window(title="文本编辑器", auto_id="15", control_type="Edit")
| |
| | ScrollBar - '垂直滚动条' (L1881, T341, R1898, B1029)
| | ['ScrollBar', '垂直滚动条', '垂直滚动条ScrollBar', 'ScrollBar0', 'ScrollBar1']
| | child_window(title="垂直滚动条", auto_id="NonClientVerticalScrollBar", control_type="ScrollBar")
| | |
| | | Button - '上一行' (L1881, T341, R1898, B358)
| | | ['Button', '上一行Button', '上一行', 'Button0', 'Button1']
| | | child_window(title="上一行", auto_id="UpButton", control_type="Button")
| | |
| | | Button - '下一行' (L1881, T1012, R1898, B1029)
| | | ['Button2', '下一行', '下一行Button']
| | | child_window(title="下一行", auto_id="DownButton", control_type="Button")
| |
| | ScrollBar - '水平滚动条' (L405, T1029, R1881, B1046)
| | ['ScrollBar2', '水平滚动条', '水平滚动条ScrollBar']
| | child_window(title="水平滚动条", auto_id="NonClientHorizontalScrollBar", control_type="ScrollBar")
| | |
| | | Button - '左移一列' (L405, T1029, R422, B1046)
| | | ['Button3', '左移一列Button', '左移一列']
| | | child_window(title="左移一列", auto_id="UpButton", control_type="Button")
| | |
| | | Button - '右移一列' (L1864, T1029, R1881, B1046)
| | | ['Button4', '右移一列Button', '右移一列']
| | | child_window(title="右移一列", auto_id="DownButton", control_type="Button")
| |
| | Thumb - '调整框大小' (L1881, T1029, R1898, B1046)
| | ['Thumb', '调整框大小Thumb', '调整框大小']
| | child_window(title="调整框大小", control_type="Thumb")
|
| TitleBar - '' (L421, T293, R1898, B321)
| ['TitleBar']
| |
| | Menu - '系统' (L405, T298, R427, B320)
| | ['系统', '系统Menu', 'Menu', '系统0', '系统1', 'Menu0', 'Menu1']
| | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")
| | |
| | | MenuItem - '系统' (L405, T298, R427, B320)
| | | ['系统2', '系统MenuItem', 'MenuItem', 'MenuItem0', 'MenuItem1']
| | | child_window(title="系统", control_type="MenuItem")
| |
| | Button - '最小化' (L1759, T291, R1806, B321)
| | ['Button5', '最小化Button', '最小化']
| | child_window(title="最小化", control_type="Button")
| |
| | Button - '最大化' (L1806, T291, R1852, B321)
| | ['Button6', '最大化Button', '最大化']
| | child_window(title="最大化", control_type="Button")
| |
| | Button - '关闭' (L1852, T291, R1899, B321)
| | ['Button7', '关闭', '关闭Button']
| | child_window(title="关闭", control_type="Button")
|
| Menu - '应用程序' (L405, T321, R1898, B340)
| ['应用程序', 'Menu2', '应用程序Menu']
| child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar")
| |
| | MenuItem - '文件(F)' (L405, T321, R457, B340)
| | ['文件(F)', 'MenuItem2', '文件(F)MenuItem']
| | child_window(title="文件(F)", control_type="MenuItem")
| |
| | MenuItem - '编辑(E)' (L457, T321, R510, B340)
| | ['编辑(E)MenuItem', '编辑(E)', 'MenuItem3']
| | child_window(title="编辑(E)", control_type="MenuItem")
| |
| | MenuItem - '格式(O)' (L510, T321, R566, B340)
| | ['格式(O)', '格式(O)MenuItem', 'MenuItem4']
| | child_window(title="格式(O)", control_type="MenuItem")
| |
| | MenuItem - '查看(V)' (L566, T321, R620, B340)
| | ['查看(V)MenuItem', 'MenuItem5', '查看(V)']
| | child_window(title="查看(V)", control_type="MenuItem")
| |
| | MenuItem - '帮助(H)' (L620, T321, R675, B340)
| | ['帮助(H)', 'MenuItem6', '帮助(H)MenuItem']
| | child_window(title="帮助(H)", control_type="MenuItem")
None
编辑框输入内容
我们想在编辑器输入内容,可以先查看编辑区的属性
对应我们上面看到win.print_ctrl_ids() 输出的内容
| Edit - '文本编辑器' (L405, T341, R1898, B1046)
| ['Edit']
| child_window(title="文本编辑器", auto_id="15", control_type="Edit")
set_text()在编辑器输入:hello world
from pywinauto import Application
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/
app = Application('uia').start("notepad.exe")
win = app.window(title_re="无标题 - 记事本")
# 获取当前窗口下控件
# print(win.print_ctrl_ids())
# 输入内容
win.child_window(title="文本编辑器").set_text("hello world")
也可以用中括号的方式操作控件
win["Edit"].set_text("hello world")
常用定位控件方法
通过层级查找控件相关方法
- 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, # 模糊匹配类似的title
auto_id=None, # inspect界面AutomationId字段,但是很多控件没有这个属性
parent=None,
process=None, # 这个基本不用,每次启动进程都会变化
top_level_only=True,
visible_only=True,
enabled_only=False,
handle=None,
ctrl_index=None,
found_index=None,
predicate_func=None,
active_only=False,
control_id=None,
framework_id=None,
backend=None,