pywinauto 树控件(TreeView)的操作

       最近写脚本过程中,碰到树结构控件,查看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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值