最近写脚本过程中,碰到树结构控件,查看pywinauto的接口文档发现pywinauto为树控件提供了很多常用的方法,其中,get_item()就能很方便的获取到要选择的节点,但在我们项目中有些树控件却不支持该方法,只能通过其他支持的方法,重新封装新的方法达到get_item()方法的目的。
下面先总结下pywinauto中TreeView支持的常用方法,然后再封装新的方法用于通过节点路径获取节点用于我们项目中不支持get_item()方法的树控件
一、我们先总结一下pywinauto中TreeView、TreeItem支持的常用方法:
1、item_count() :获取树控件中所有的节点数量,只统计显示的节点数量,被折叠隐藏的节点不会统计。如上图,会返回15
2、roots():获取TreeView的根元素,如上图,就会返回"科室模板"、"个人模板"两个节点元素
3、descendants():依次获取TreeView的所有节点元素,已列表形式返回,被折叠隐藏的节点不会被获取
4、children():获取TreeView的根节点,或者树节点(TreeItemWrapper)的子节点元素,这里只能获取子节点不能获取孙子节点及下面层级,且只能获取已显示的节点,隐藏的节点不能获取
5、get_child('节点文字'):获取树节点下文本为'节点文字'的节点名称
6、get_item():通过TreeView的节点路径来获取节点元素,列如:
get_item([0,0,3])就是获取上图"科室模板"-“门诊西药房”-“处方记录”节点元素;
get_item("\\科室模板\\门诊西药房\\处方记录")获取结果与 get_item([0,0,3])一致
7、expand():树节点展开,调用该方法的节点如果是折叠状态就会展开该节点
8、get_expand_state()获取树节点展开状态,1-展开,0未展开
9、select():选择节点
二、针对项目中不支持get_item()方法的树,重新封装了一个方法以达到通过节点路径来获取节点
def select_treeitem_by_path(tree_ele, item_path):
"""
通过节点路径来获取树节点
:param tree_ele: 树控件
:param item_path: 可以通过节点下表路径(下表从0开始)或者文本来获取,
如:[0,1,2]就是获取第2个节点下第2个节点下的第3个节点
"\全部\西药\外购西药"就是获取”全部“-”西药“-”外购西药“节点
:return:返回目标节点元素
"""
if not isinstance(item_path, list) and not isinstance(item_path, str):
raise Exception(f"item_path参数值为{item_path},传参错误,必须为列表或者字符串")
if isinstance(item_path, str) and not item_path.startswith("\\"):
raise Exception(f"item_path参数字符串时,必须以\\开头,传参值{item_path}")
type = 1 if isinstance(item_path, list) else 2
# 获取所有根节点
roots = tree_ele.roots()
if type == 1:
result_item = ''
for index,value in enumerate(item_path):
if index == 0:
result_item = roots[value]
else:
result_item = result_item.children()[value]
else:
item_text_list = item_path.split('\\')[1:]
result_item = ''
for index, item_text in enumerate(item_text_list):
if index == 0:
for root in roots:
if root.texts()[0] == item_text_list[0]:
result_item = root
else:
result_item = result_item.get_child(item_text)
return result_item