使用uiautomation模块来对基于windows系统的pc中的前端界面进行自动化测试(查找控件,点击控件等)

本文介绍了Python的UIAutomation模块用于Windows自动化测试的方法,包括启动计算器、执行计算操作、查找和点击控件等。通过示例代码展示了如何定位窗口、设置窗口属性、操作窗口控件以及遍历窗口子控件。此外,还提供了查找当前最上层窗口控件的技巧,并演示了如何根据名称或正则表达式查找并点击目标控件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uiautomation模块

uiautomation模块是第三方模块需要先安装

python -m pip install uiautomation

或者可以直接在github上面下载uiautomation,作者yinkaisheng在github上开源开发的uiautomation模块,直接下载也可以研究下他的代码

uiautomation模块github地址: https://github.com/yinkaisheng/Python-UIAutomation-for-Windows
uiautomation模块github地址

uiautomation模块的自动化测试需要配合UISPY.exe或者inspect.exe工具来进行调试大佬的工程里面也有这两个工具
参照博客

网上其他人的代码未深入研究

import os
import subprocess
import uiautomation
import time

#打开计算器进程
subprocess.Popen('calc.exe')
time.sleep(2)

# 四类标签格式
# 程序窗口:WindowControl()
# 按钮:ButtonControl()
# 文件显示:TextControl()
# 输入框:EditControl()

# 元素属性 ClassName、Name、ProcessId、AutomationId

#定位窗口
# # wc=uiautomation.WindowControl(searchDepth=1,Name='计算器')
wc=uiautomation.WindowControl(Name='计算器')

#将程序设置为顶层(页面放到最上面防止被别的程序盖住)
wc.SetTopmost(True)

# DoubleClick() 双击
# Click() 点击;
# RighClik() 右键点击;
# SendKeys() 发送字符;
# SetValue() 传值,一般对EditControl用;

wc.ButtonControl(Name='一').Click()
wc.ButtonControl(Name='二').Click()
wc.ButtonControl(Name='乘以').Click()
wc.ButtonControl(Name='三').Click()
wc.ButtonControl(Name='等于').Click()

# 获取元素某标签的具体标签内容
result=wc.TextControl(AutomationId='CalculatorResults')
print(result.Name)
print(result.ClassName)
print(result.ProcessId)
print(result.AutomationId)
print(result.Culture)
print(result.ControlType)

if result.Name=="显示为 36":
    print("测试成功")
else:
    print("测试失败")

#截图
# wc.CaptureToImage('1222222222222222222222222222222222222.png')

time.sleep(2)
wc.ButtonControl(Name='关闭 计算器').Click()
os.system("taskkill /F /IM calc.exe")
显示为 36

14696
CalculatorResults
2052
50020
测试成功

从当前电脑已经打开的窗口中找寻某一个窗口,并对其操作,且可以再次查找便利这个窗口里面的所有子控件

查找时的参数介绍
searchFromControl = None:从哪个控件开始查找,如果为None,从根控件Desktop开始查找
searchDepth = 0xFFFFFFFF: 搜索深度 在指定的深度范围内(往下数几级)查找
searchInterval = SEARCH_INTERVAL:搜索间隔
foundIndex = 1 :搜索到的满足搜索条件的控件索引,索引从1开始
Name:控件名字
SubName :控件部分名字
RegexName:使用re.match匹配符合正则表达式的名字,Name,SubName,RegexName只能使用一个,不能同时使用
ClassName :类名字
AutomationId: 控件AutomationId
ControlType :控件类型
Depth:控件相对于searchFromControl的精确深度,只在指定的第几级查找
Compare:自定义比较函数function(control: Control, depth: int)->bool

    import uiautomation

    # 查找获取当前电脑上的某个窗口对象(不管当前窗口是最顶层还是被盖住或者最小化到任务栏,只要存在就能找到)
    # window = uiautomation.WindowControl(searchDepth=1, Name='管理员: 命令提示符', AutomationId='Console Window')
    window = uiautomation.WindowControl(searchDepth=1, Name='计算器')

    # 如果存在则打印这个窗口控件的基础属性
    if window.Exists():
        print(window.Name)
        print(window.AutomationId)
        print(window.ClassName)
        print(window.ControlTypeName)

        # 如果存在则枚举便利这个窗口对象中的所有子控件
        for one_control, one_depth in uiautomation.WalkControl(window, True, 99999999999999999):
            print(one_control.Name)
            print(one_control.AutomationId)
            print(one_control.ClassName)
            print(one_control.ControlTypeName)
            print("======================")

        # 窗口操作
        # 窗口置顶
        window.SetTopmost()
        # 窗口最大化
        window.Maximize()
        # 窗口最小化
        window.Minimize()
        # 窗口激活(置顶)
        window.SetActive()

        # # 窗口对象是cmd控制台的话这里可以打印控制台的文本显示内容
        # cmd_text = window.DocumentControl(searchDepth=1).GetTextPattern().DocumentRange.GetText()
        # print(cmd_text)

自动化找寻当前最上层窗口的所有控件并锁定自己需要的控件并点击,(推荐)

    import uiautomation as auto
    import os
    import time
    import re

    def check_now_top_page_all_control_node():
        """
        查找当前最顶层页面的所有元素控件
        :return: 包含每个元素控件信息字典的列表[{}, {}]
        """
        now_page_all_node_info_dict_list = []
        control = auto.GetFocusedControl()
        controlList = []
        while control:
            controlList.insert(0, control)
            control = control.GetParentControl()
        if len(controlList) == 1:
            control = controlList[0]
        else:
            control = controlList[1]
        for one_control, one_depth in auto.WalkControl(control, True, 99999999999999999):
            now_page_all_node_info_dict_list.append({"ControlNodeName" : one_control.Name, "ControlNodeClassName" : one_control.ClassName, "ControlNodeAutomationId" : one_control.AutomationId,
                                            "ControlNodeControlType" : one_control.ControlTypeName,"ControlNodeHandle" : '0x{0:X}({0})'.format(one_control.NativeWindowHandle),
                                            "ControlNodeRect" : one_control.BoundingRectangle,})
        return now_page_all_node_info_dict_list


    def find_target_node_use_name(control_node_name, is_re=False, find_timeout_time=10):
        """
        在当前页面循环寻找目标控件
        :param control_node_name: 控件名字
        :param is_re: 是否正则寻找默认不正则寻找
        :param find_timeout_time: 查找超时时间,默认十秒,超时未找到返回None
        :return: 找到返回控件字典对象,超时未找到返回None
        """
        end_time = start_time = time.time()
        while end_time - start_time <= find_timeout_time:
            ret_list = check_now_top_page_all_control_node()
            for i in ret_list:
                if is_re:
                    if re.findall(control_node_name, i["ControlNodeName"]):
                        return i
                else:
                    if control_node_name == i["ControlNodeName"]:
                        return i
           	end_time = time.time()
    # 打开calc
    os.popen("calc")
    # 查找按钮   八
    ret = find_target_node_use_name("八")
    auto.Click(int(ret["ControlNodeRect"].xcenter()), int(ret["ControlNodeRect"].ycenter()))
    ret = find_target_node_use_name("一")
    auto.Click(int(ret["ControlNodeRect"].xcenter()), int(ret["ControlNodeRect"].ycenter()))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值