Windows GUI自动化控制工具之python uiAutomation

news2024/11/15 15:31:42

对 Windows GUI进行自动化控制的工具有很多,比如pywinauto、pyautogui、pywin32、Autoit、airtest、UIAutomation等,UI Automation API是微软提供的自动化框架,可在支持 Windows Presentation Foundation (WPF) 的所有操作系统上使用,支持的应用类型更多。本文介绍封装了UI Automation API的Python uiautomation 模块的使用方法。

目录

  • 环境准备
    • uiautomation安装
    • 进程查看器
      • inspect.exe
      • Accessibility Insights
  • 控件对象模型
  • uiautomation库示例
    • 控制计算器
  • 参考文档

Python uiautomation 模块由yinkaisheng 开发,封装了微软 UI Automation API,支持自动化Win32,MFC,WPF,Modern UI(Metro UI), Qt, IE, Firefox, Chrome和基于Electron开发的应用程序。

环境准备

uiautomation安装

最新版uiautomation2.0只支持Python 3版本,但不要使用3.7.6和3.8.1这两个版本,因为comtypes包在这两个版本中不能正常工作。

pip安装uiautomation:

$ pip install uiautomation

检查是否安装成功:

$ pip list | findstr uiautomation
uiautomation       2.0.18

安装完成后,在Python的Scripts(我的路径为C:\Program Files\Python37\Scripts)目录中会有一个文件automation.py,是用来枚举控件树结构的一个脚本。

可运行 automation.py -h查看命令帮助:

$ python automation.py -h
UIAutomation 2.0.18 (Python 3.7.2, 64 bit)
usage
-h      show command help
-t      delay time, default 3 seconds, begin to enumerate after Value seconds, this must be an integer
        you can delay a few seconds and make a window active so automation can enumerate the active window
-d      enumerate tree depth, this must be an integer, if it is null, enumerate the whole tree
-r      enumerate from root:Desktop window, if it is null, enumerate from foreground window
-f      enumerate from focused control, if it is null, enumerate from foreground window
-c      enumerate the control under cursor, if depth is < 0, enumerate from its ancestor up to depth
-a      show ancestors of the control under cursor
-n      show control full name, if it is null, show first 30 characters of control's name in console,
        always show full name in log file @AutomationLog.txt
-p      show process id of controls

if UnicodeError or LookupError occurred when printing,
try to change the active code page of console window by using chcp or see the log file @AutomationLog.txt
chcp, get current active code page
chcp 936, set active code page to gbk
chcp 65001, set active code page to utf-8

examples:
automation.py -t3
automation.py -t3 -r -d1 -m -n
automation.py -c -t3

进程查看器

对 Windows GUI进行自动化控制需要使用进程查看器工具对GUI界面元素进行定位,定位工具有很多,这里推荐使用微软提供的inspect.exe 或者 Accessibility Insights 这两款工具。

inspect.exe

inspect.exe 是 Windows SDK 自带的一个进程查看器,可以用来查看系统正在运行的进程信息、模块、线程、堆栈跟踪等详细数据。

Windows SDK下载地址为:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/

建议直接到这里下载inspect.exe:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/tree/master/inspect

64位系统版本的inspect.exe也可以点击这里下载。

Accessibility Insights

Accessibility Insights 是微软开发的一款辅助功能测试工具。它可以帮助开发者测试 web 应用、Windows 桌面应用和 Android 应用的可访问性,确保这些应用程序符合无障碍标准。

Accessibility Insights获取的控件属性信息没有inspect.exe全面,使用起来更加流畅。下载为:https://accessibilityinsights.io/downloads/

控件对象模型

微软 UIAutomation API定义了支持的控件类型和对应的模型(Pattern),所有支持的控件类型可参考:https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-controlpatternmapping

控件类型必须支持的模型可选模型Does not support
ButtonNoneExpandCollapse, Invoke, Toggle, ValueNone
CalendarGrid, TableScroll, SelectionValue
CheckBoxToggleNoneNone
EditNoneRangeValue, Text, ValueNone
ListNoneGrid, MultipleView, Scroll, SelectionTable
ListItemSelectionItemCustomNavigation, ExpandCollapse, GridItem, Invoke, ScrollItem, Toggle, ValueNone
MenuNoneNoneNone
MenuBarNoneDock, ExpandCollapse, TransformNone
MenuItemNoneExpandCollapse, Invoke, SelectionItem, ToggleNone
RadioButtonSelectionItemNoneToggle
SplitButtonExpandCollapse, InvokeNoneNone
TabSelectionScrollNone
TabItemSelectionItemNoneInvoke
TableGrid, GridItem, Table, TableItemNoneNone
TextNoneGridItem, TableItem, TextValue
TitleBarNoneNoneNone
ToolBarNoneDock, ExpandCollapse, TransformNone

python uiautomation库对UIAutomation API定义的各个Control和Pattern进行了封装。

下面来看使用python uiautomation操作Windows自带计算器的例子。

uiautomation库示例

控制计算器

可以使用inspect.exe来定位计算器元素:

在这里插入图片描述

示例脚本如下:

import os
import uiautomation as auto
import subprocess

class uiautoCalc(Loggers):
    """uiautomation控制计算器
    """
    def __init__(self):
        super().__init__()
        self.logger = Loggers().myLogger()
        auto.uiautomation.DEBUG_SEARCH_TIME =True 
        auto.uiautomation.SetGlobalSearchTimeout(2) # 设置全局搜索超时时间
        self.calcWindow = auto.WindowControl(searchDepth=1, Name='计算器', desc='计算器窗口') # 计算器窗口
        if not self.calcWindow.Exists(0,0):
            subprocess.Popen('calc')# 设置窗口前置
            self.calcWindow = auto.WindowControl(
            searchDepth=1, Name='计算器', desc='计算器窗口')
        self.calcWindow.SetActive() # 激活窗口
        self.calcWindow.SetTopmost(True) # 设置为顶层

    def gotoScientific(self):
        self.calcWindow.ButtonControl(AutomationId='TogglePaneButton', desc='打开导航').Click(waitTime=0.01)        
        self.calcWindow.ListItemControl(AutomationId='Scientific', desc='选择科学计算器').Click(waitTime=0.01)
        clearButton = self.calcWindow.ButtonControl(AutomationId='clearEntryButton', desc='点击CE清空输入')
        if clearButton.Exists(0,0):
            clearButton.Click(waitTime=0)
        else:
            self.calcWindow.ButtonControl(AutomationId='clearButton', desc='点击C清空输入').Click(waitTime=0.01)

    def getKeyControl(self):
        automationId2key ={'num0Button':'0','num1Button':'1','num2Button':'2','num3Button':'3','num4Button':'4','num5Button':'5','num6Button':'6','num7Button':'7','num8Button':'8','num9Button':'9','decimalSeparatorButton':'.','plusButton':'+','minusButton':'-','multiplyButton':'*','divideButton':'/','equalButton':'=','openParenthesisButton':'(','closeParenthesisButton':')'}        
        calckeys = self.calcWindow.GroupControl(ClassName='LandmarkTarget')
        keyControl ={}
        for control, depth in auto.WalkControl(calckeys, maxDepth=3):
            if control.AutomationId in automationId2key:
                self.logger.info(control.AutomationId)
                keyControl[automationId2key[control.AutomationId]]= control
        return keyControl

    def calculate(self, expression, keyControl):
        expression =''.join(expression.split())
        if not expression.endswith('='):
            expression +='='
            for char in expression:
                keyControl[char].Click(waitTime=0)
        self.calcWindow.SendKeys('{Ctrl}c', waitTime=0.1)
        return auto.GetClipboardText()

    def calc_demo(self):
        """计算器示例
        :return : 
        """        
        self.gotoScientific() # 选择科学计算器        
        keyControl = self.getKeyControl() # 获取按键控件
        result     = self.calculate('(1 + 2 - 3) * 4 / 5.6 - 7', keyControl)
        print('(1 + 2 - 3) * 4 / 5.6 - 7 =', result)
        self.calcWindow.CaptureToImage('calc.png', x=7, y=0, width=-14, height=-7) # 截图
        self.calcWindow.GetWindowPattern().Close() # 关闭计算机

if __name__ == "__main__":
    ui = uiautoCalc()
    ui.calc_demo()

脚本执行动图:

在这里插入图片描述

参考文档

  1. https://github.com/pywinauto/pywinauto

  2. https://cloud.tencent.com/developer/article/2213048

  3. https://github.com/yinkaisheng/Python-UIAutomation-for-Windows

  4. Python UIAutomation文档:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/blob/master/readme_cn.md

  5. https://www.cnblogs.com/Yinkaisheng/p/3444132.html

  6. GitHub - jacexh/pyautoit: Python binding for AutoItX3.dll

  7. GitHub - mhammond/pywin32: Python for Windows (pywin32) Extensions

  8. Accessibility tools - Inspect - Win32 apps | Microsoft Learn

  9. Accessibility Insights

--THE END--

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Niagara—— Niagara Editor界面

目录 一&#xff0c;菜单栏 二&#xff0c;工具栏 三&#xff0c;预览面板 四&#xff0c;参数面板 五&#xff0c;系统总览面板 六&#xff0c;暂存区面板 七&#xff0c;选择面板 打开Niagara Editor&#xff1a; 双击Niagara发射器或系统&#xff1b;右击Niagara发射…

Qt--事件分发器

写在前面 在 Qt 中&#xff0c;事件分发器(Event Dispatcher)是一个核心概念&#xff0c;用于处理 GUI 应用程序中的事件。事件分发器负责将事件从一个对象传递到另一个对象&#xff0c;直到事件被处理或被取消。 每个继承自QObject或QObject的类都可以在本类中重写bool even…

基于 Amazon API Gatewy 的跨账号跨网络的私有 API 集成

一、背景介绍 本文主要讨论的问题是在使用 Amazon API Gateway&#xff0c;通过 Private Integration、Private API 来完成私有网络环境下的跨账号或跨网络的 API 集成。API 管理平台会被设计在单独的账号中(亚马逊云科技提供的是多租户的环境)&#xff0c;因为客观上不同业务…

生于零售的亚马逊云科技,如何加速中国跨境电商企业出海?

导读&#xff1a;跨境电商进入精耕细作的新阶段。 作为中国企业出海的重要领域之一&#xff0c;近几年跨境电商行业处在快速发展中。商务部数据显示&#xff0c;2022年中国跨境电商出口达1.55万亿&#xff0c;同比增长11.7%。2023年1-2月&#xff0c;跨境电商进出口总额同比增长…

【wpf】视觉树上找元素的注意事项

前言 我们通过 VisualTreeHelper类 可以在视觉树上找元素&#xff0c;下面提供几个封装好的方法&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; using Sy…

分析| Flutter 3.10版本有哪些变化?

Flutter是Google推出的一款用于构建高性能、高保真度移动应用程序、Web和桌面应用程序的开源UI工具包。Flutter使用自己的渲染引擎绘制UI&#xff0c;为用户提供更快的性能和更好的体验。Flutter还提供了丰富的构建工具、库和插件&#xff0c;使开发人员能够更快地构建应用程序…

从浅入深理解序列化和反序列化

文章目录 什么是java序列化什么情况需要使用 Java 序列化为什么要序列化序列化和反序列化过程如下RPC 框架为什么需要序列化序列化用途序列化机制可以让对象地保存到硬盘上&#xff0c;减轻内存压力的同时&#xff0c;也起了持久化的作用序列化机制让Java对象可以在网络传输 实…

LINUX 提权 脏牛CVE-2016-5195

这里写复现过程&#xff0c;不写原理 Linux内核 > 2.6.22&#xff08;2007年发行&#xff0c;到2016年10月18日才修复&#xff09; 靶场环境是vluhub上的。网卡自己配置好 nmap扫一下 80端口开的&#xff0c;上去 52.136 再扫 1898开放 访问开干 是个cms msf上线找这…

【VictoriaMetrics】VictoriaMetrics单机版批量和单条数据写入(opentsdb格式)

VictoriaMetrics单机版支持以opentsdb格式的数据写入包含linux形式和postman形式,写入支持单条数据写入以及多条数据写入,下面操作演示下如何使用 1、首先需要启动VictoriaMetrics单机版服务 注意,如果支持opentsdb协议需要在启动单机版VictoriaMetrics的时候加上opentsdbH…

一、尚医通微信登录

文章目录 一、登录需求1、登录需求 二、微信登录1、OAuth21.1OAuth2解决什么问题1.1.1 开放系统间授权1.1.2图例1.1.3方式一&#xff1a;用户名密码复制1.1.4方式二&#xff1a;通用开发者key1.1.5方式三&#xff1a;颁发令牌 1.2 OAuth2最简向导1.2.1 OAuth主要角色1.2.2最简向…

就业内推 | 国企招运维、网安,五险一金全额缴,最高15k

01 北京安信创业信息科技发展有限公司 &#x1f537;招聘岗位&#xff1a;网络运维岗 &#x1f537;职责描述&#xff1a; 1、负责北区数据中心、总部数据中心、部本部、21家在京直属事业单位内网网络系统的日常运行维护工作。 2、负责网络故障的应急处置。 3、负责网络系统…

决策树及决策树的划分依据(ID3、C4.5、CART)

一、决策树是什么&#xff1f; 决策树是一种基于树状结构的机器学习算法&#xff0c;用于解决分类和回归问题。它是一种自上而下的递归分割方法&#xff0c;通过对特征空间的递归划分来构建一个树形模型&#xff0c;用于进行预测和决策。在决策树中&#xff0c;每个内部节点表…

Redis概述

前言 为什么要使用Redis? ​ 如果熟悉JVM底层的话&#xff0c;就能了解Java程序的运行大多数都是基于对内存的操作&#xff0c;读取、并更、清理&#xff0c;并同时保证数据的可靠性。即使是数据库&#xff0c;例如MySQL几乎都是基于对缓冲区的操作&#xff0c;只是通过后台…

(常见)数据模型

文章目录 数据模型概述一、数据模型概要1.模型、建模与抽象2.数据模型3.两类数据模型 二、数据库模型的组成要素1.数据结构2.数据操作3.数据的完整性约束 三、概念模型1.概要2.基本概念3.概念模型的表示方法 常用数据模型一、层次模型1.简介2.数据结构3.数据操纵与完整性约束4.…

二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1 示例 2&#xff1a; 输入&am…

List、Set、Map的区别?

List 是一个有序集合&#xff0c;里面可以存储重复的元素Set 是一个不能存储相同元素的集合Map 是一个通过键值对的方式存储元素的&#xff0c;键不能重复 Java 容器分为Collection 和Map 两大类&#xff0c;Collection 集合的子接口有Set、List、Queue 三种子接口。其中&#…

CSDN MD编辑器跳转方法及字体格式

一、点击关键语句跳转指定位置 在CSDN写文章的时候&#xff0c;写的文章过长往往会让读者很难找到自己想看的部分&#xff0c;这时候有个 跳转到指定位置功能 就非常的便利。CSDN在MD编辑器上(富文本编辑器只有一种)就提供了两种跳转到指定位置的方法&#xff1a; 一、目录跳转…

HackTheBox-关卡Fawn

1. 连接靶场&#xff0c;打开FAWN实例场景&#xff0c;检查是否互通 TASK1 3 个字母的首字母缩写词 FTP 代表什么&#xff1f; 答案是&#xff1a;File Transfer Protocol TASK2 问题是&#xff1a;FTP服务通常监听哪个端口&#xff1f; FTP监听的TCP端口号为21,监听的数据端…

【自动化测试】selenium工具

文章目录 为什么要做自动化测试&#xff1f;为什么选用Selenium&#xff1f;Selenium的工作原理SeleniumJava环境搭建Selenium常用API浏览器参数配置定位元素操作测试对象时间等待信息打印对浏览器操作键盘与鼠标操作屏幕截图弹窗处理选择框的处理上传文件 JUnit单元测试注解参…

睡岗识别 TensorFlow

睡岗识别可以通过TensorFlowAI深度学习框架智能分析技术&#xff0c;睡岗识别识别出现场人员是否存在睡岗情况&#xff0c;及时发出预警&#xff0c;避免因操作人员的疏忽而导致的安全事故。TensorFlow 是一个开源的机器学习的框架&#xff0c;我们可以使用 TensorFlow 来快速地…