【Pywinauto WindowsAPP UI自动化】

一、pywinauto安装

输入pip -V检查安装的python是否能用,用不了的话去配python的环境变量

1.1、在线安装:pip install -U pywinauto

\-U表示升级安装。安装完成后在Pycharm中输入:from pywinauto.application import Application若没有出现错误提示,则说明该模块安装成功。

1.2、离线安装

搜索pypi的网站,他是python第三方库的管理平台

image.png

image.png

image.png

下载安装包后,解压缩

放到python的安装目录下,切换到终端:运行python setup.py install

安装成功

1.3、工具介绍

1.3.1、Inspect(定位元素工具(uia))

计算机自带的inspect.exe(Windows SDK中的UI自动化检查器),路径为:C:\Program Files (x86)\Windows Kits\10\bin\x86

image.png

点击inspect左上角的下拉列表中切换到UI Automation,如果可以看到树状结构,能解析出来元素,说明该窗口是uia

image.png

学会看打印出的控件,就可以不用这个工具了

二、pywinauto操作使用

2.1、打开/连接应用程序

打开/连接应用程序,首先我们要确定我们应用程序的可访问技术是什么。

应用的可访问技术一共有两种,分别是uia和win32。我们使用下面的代码:

IDE = Application(backend="win32").start(path=app\_path)

如果可以连接并打开应用,说明应用是win32的,反之就是uia的。

pywinauto中backend参数的默认值就是win32,所以win32的应用可以不写,示例如下:
from pywinauto import Application

# 应用程序的路径
app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe'
# 打开应用程序
IDE = Application(backend="win32").start(path=app_path) # 或者IDE = Application().start(path=app_path)
因为我们IDE如果用start()打开的话,会在我们这个python工程路径下打开一个工作空间,数据会保存在python工程路径下,
这并不是我们想要的,所以不用start()来打开IDE,而是用connect()来连接已经打开的应用程序,示例如下:
from pywinauto import Application

# 应用程序的路径
app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe'
# 连接应用程序
IDE = Application(backend="win32").connect(path=app_path) # 或者IDE = Application().connect(path=app_path)
这段代码运行完的效果如下:

image.png

注意:连接应用程序还可以通过进程号、句柄连接,不过他们会随着每次打开窗口而变化,所以一般不使用

2.2、选择窗口

通过窗口标题选择窗口:

窗口对象=应用\["窗口标题"\] 
除了这种方式,还有: 窗口对象=应用(title=“窗口标题”) 窗口对象=应用.窗口标题——中文窗口名不建议用这种方式 窗口对象=应用.window(title=“窗口标题”)
from pywinauto import Application

app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe'      # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path)    # 连接应用程序,或者IDE = Application().connect(path=app_path)

sdrwindow = IDE["SDR集成开发环境"] # sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize()  # 最大化窗口
这段代码运行完的效果:打开sdrIDE,并且窗口是最大化的:

image.png

注意:还可以通过类名选择窗口,通过print_control_ifdentifiers()方法打印出窗口的所有控件,查找类名。等下说这个。

三、窗口的操作方法

除了上面已经做过的最大化窗口,还有几种窗口的操作后面会使用到
序号 作用 方法 备注
1 窗口最大化 窗口.maximize()
2 窗口最小化 窗口.minimize()
3 关闭窗口 窗口.close()
4 获取窗口的显示状态 窗口.get_show_state() 最大化是1,正常是0
5 获取窗口显示的坐标 窗口.rectangle() 返回值是(Lxxx,Txxx,Rxxx,Bxxx)
6 查看当前窗口中的所有控件 窗口.print_control_identifiers()

四、窗口上控件的选择

控件,就是窗口中的元素、内容。

下面是控件的一些分类:
控件 标识 控件 标识
静态内容 Static 编辑框 Edit
按钮 Button 头部内容 Header
单选框 RadioButton 列表框 ListBox
复选框 CheckBox 列表显示控件 ListView
组框 GroupBox 弹出菜单 PopupMenu
组合框 ComboBox 选项卡控件 TabControl
对话框(窗口) Dialog 菜单 Menu
工具栏 Toolbar 工具栏提示 ToolTips
树状视图 Tree View 菜单项 MenuItem
窗格 Pane 状态栏 StatusBar
pywinauto中提供了一个方法可以让我们查看当前窗口中的所有控件:窗口.print\_control\_identifiers()

image.png

截取的一部分:

image.png

可以看到,打印出的控件有很多,而且是很有规律的,每部分几乎都是由3行组成。举个例子:

SWT\_Window0 - ''    (L1594, T760, R1919, B1004)

\['SWT\_Window0', 'SWT\_Window00', 'SWT\_Window01'\]

child\_window(class\_name="SWT\_Window0")

1.  第一行SWT\_Window0是控件类型,不过不是一个标准类型的控件,有关控件类型可以看上面列出的窗口控件的分类
    
2.  SWT\_Window0 - ''    (L1594, T760, R1919, B1004) 中,引号中的内容是这个控件的标题,标题为空,但是我们可以
通过第二行中括号里面的某一个标题来唯一标识这个控件
    
3.   (L1594, T760, R1919, B1004) 表示SWT\_Window0 控件在界面中的位置,单位是像素,我们可以通过截图方法,将这个
控件截图,就可以看到这个控件到底是界面中的什么元素了,截图等下说
    
5.  第三行说明这个控件他的子窗口的类名是SWT\_Window0 

五、打印部分控件

5.1、通过控件类型打印

image.png

在欢迎界面,这个代码实现的是,将控件标题为:SDR集成开发环境SWT\_Window013的控件下的所有控件打印出来。

注意:SWT_Window013是中括号中的内容

获取方式可以是.(.只适用于英文),也可以是中括号
from pywinauto import Application

app_path = r'E:\sdrIDE0103\sdrIDE2.7.3\sdrIDE2.7.3.exe'      # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path)    # 连接应用程序,或者app = Application().connect(path=app_path)

sdrwindow = IDE["SDR集成开发环境"]  # 定位窗口。或者sdrwindow = IDE(title="SDR集成开发环境")或者sdrwindow = IDE.SDR集成开发环境 或者sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize()   # 最大化窗口

ck=sdrwindow["SDR集成开发环境SWT_Window013"] # 选择部分控件。或者ck=sdrwindow.SDR集成开发环境SWT_Window013
print(ck.print_control_identifiers())
执行完的效果:
D:\python36\python.exe G:\yongli_Framework\src\testpywinauto.py 
Control Identifiers:

SWT_Window0 - ''    (L536, T319, R1887, B971)
['SWT_Window0']
child_window(class_name="SWT_Window0")
   | 
   | Shell Embedding - ''    (L536, T319, R1887, B971)
   | ['Shell Embedding']
   | child_window(class_name="Shell Embedding")
   |    | 
   |    | Shell DocObject View - ''    (L536, T319, R1887, B971)
   |    | ['Shell DocObject View']
   |    | child_window(class_name="Shell DocObject View")
   |    |    | 
   |    |    | Internet Explorer_Server - ''    (L536, T319, R1887, B971)
   |    |    | ['Internet Explorer_Server']
   |    |    | child_window(class_name="Internet Explorer_Server")
   |    | 
   |    | Internet Explorer_Server - ''    (L536, T319, R1887, B971)
   |    | ['Internet Explorer_Server']
   |    | child_window(class_name="Internet Explorer_Server")
   | 
   | Shell DocObject View - ''    (L536, T319, R1887, B971)
   | ['Shell DocObject View']
   | child_window(class_name="Shell DocObject View")
   |    | 
   |    | Internet Explorer_Server - ''    (L536, T319, R1887, B971)
   |    | ['Internet Explorer_Server']
   |    | child_window(class_name="Internet Explorer_Server")
   | 
   | Internet Explorer_Server - ''    (L536, T319, R1887, B971)
   | ['Internet Explorer_Server']
   | child_window(class_name="Internet Explorer_Server")
None

Process finished with exit code 0
如果还想将里面的子窗口打印出来,直接在后面添加中括号就可以

注意:如果中括号不行,执行完成报错,可以使用child\_window()方法定位控件

下面这个代码实现的是,打印上面打印出的控件中,Shell Embedding控件下的所有控件:
from pywinauto import Application

app_path = r'E:\sdrIDE0108\sdrIDE2.7.3\sdrIDE2.7.3.exe'      # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path)    # 连接应用程序,或者app = Application().connect(path=app_path)

sdrwindow = IDE["SDR集成开发环境"]  # 定位窗口。或者sdrwindow = IDE(title="SDR集成开发环境")或者sdrwindow = IDE.SDR集成开发环境 或者sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize()   # 最大化窗口

ck=sdrwindow["SDR集成开发环境SWT_Window013"].child_window(class_name="Shell Embedding")# 选择部分控件。或者ck=sdrwindow.SDR集成开发环境SWT_Window013
print(ck.print_control_identifiers())
执行完的效果:
D:\python36\python.exe G:\yongli_Framework\src\testpywinauto.py 
Control Identifiers:

Shell Embedding - ''    (L536, T319, R1887, B971)
['Shell Embedding']
child_window(class_name="Shell Embedding")
   | 
   | Shell DocObject View - ''    (L536, T319, R1887, B971)
   | ['Shell DocObject View']
   | child_window(class_name="Shell DocObject View")
   |    | 
   |    | Internet Explorer_Server - ''    (L536, T319, R1887, B971)
   |    | ['Internet Explorer_Server']
   |    | child_window(class_name="Internet Explorer_Server")
   | 
   | Internet Explorer_Server - ''    (L536, T319, R1887, B971)
   | ['Internet Explorer_Server']
   | child_window(class_name="Internet Explorer_Server")
None

Process finished with exit code 0

六、控件的相关属性获取

序号 作用 方法 备注
1 获取控件类型 wrapper_object()
2 获取该控件支持的方法 print(dir(a.wrapper_object()))
3 控件文本内容的获取 ## texts ()
4 获取控件的子元素 children
5 获取控件类名 class_name
6 获取控件的属性 get_properties

6.1、获取控件类型:wrapper_object()

可以获取控件的类型,控件类型第四节开头总结过

以下代码在上面代码的基础上,打印出窗口的控件类型:

print(ck.wrapper\_object())    #获取ck窗口的控件类型并打印
from pywinauto import Application

app_path = r'E:\sdrIDE0108\sdrIDE2.7.3\sdrIDE2.7.3.exe'      # 应用程序的路径
IDE = Application(backend="win32").connect(path=app_path)    # 连接应用程序,或者app = Application().connect(path=app_path)

sdrwindow = IDE["SDR集成开发环境"]  # 定位窗口。或者sdrwindow = IDE(title="SDR集成开发环境")或者sdrwindow = IDE.SDR集成开发环境 或者sdrwindow = IDE.window(title='SDR集成开发环境')
sdrwindow.maximize()   # 最大化窗口

ck=sdrwindow["SDR集成开发环境SWT_Window013"].child_window(class_name="Shell Embedding")# 选择部分控件。或者ck=sdrwindow.SDR集成开发环境SWT_Window013
print(ck.print_control_identifiers())

print(ck.wrapper_object())    #获取ck窗口的控件类型并打印
执行完的效果:

hwndwrapper.HwndWrapper - '', Shell Embedding
D:\python36\python.exe G:\yongli_Framework\src\testpywinauto.py 
Control Identifiers:

Shell Embedding - ''    (L536, T319, R1887, B971)
['Shell Embedding']
child_window(class_name="Shell Embedding")
<think>好的,用户现在的问题是想在Windows系统中使用UIAutomation实现拼多多工作台的自动化操作。之前已经提供过一些方案,比如使用Selenium或PyAutoGUI,但用户现在特别提到UIAutomation,可能是指微软的UI Automation框架。我需要结合之前的回答和用户的新需求,给出具体的实现步骤。 首先,用户之前的回复中引用了RPA、机器学习和网站设计流程的相关内容,但当前的问题更偏向于技术实现。需要确认用户是否需要详细的代码示例,或者更侧重于步骤和工具的选择。 用户提到的是Windows环境,所以可能需要使用专门针对Windows GUI自动化的工具,比如Python的UIAutomation库或者PyWinAuto。之前的回答中提到了Selenium,但那是针对Web的,而拼多多工作台如果是桌面应用的话,可能需要不同的方法。 需要检查之前的引用是否有相关技术,比如引用[1]中的RPA工具如UiPath可能适用,但用户希望自己实现,而不是用现成的RPA平台。因此,可能需要推荐Python库,比如pywinautouiautomation。 另外,用户之前的问题中提到了处理安全校验和验证码,可能需要结合机器学习,如引用[2]中的内容,但当前问题可能更关注基础操作。 需要确保步骤清晰,包括环境搭建、元素定位、操作模拟,以及异常处理。同时,用户可能需要知道如何获取元素信息,比如使用Inspect.exe工具。 还需要考虑权限问题,比如以管理员身份运行脚本,以及可能的反自动化措施,比如拼多多工作台是否有检测自动化的机制,需要如何处理。 最后,生成相关问题时要针对可能遇到的后续问题,比如元素定位困难、验证码处理、提升稳定性等。</think>在Windows系统中使用UIAutomation实现拼多多工作台的自动化操作,可以按照以下技术方案分步实施: --- ### 一、技术选型建议 1. **Python + `uiautomation`库** - 微软原生UI Automation框架的Python封装,支持Windows GUI元素识别[^1] - 示例安装命令: ```python pip install uiautomation ``` 2. **辅助工具** - **Inspect.exe**(Windows SDK自带):定位控件元素属性 - **Accessibility Insights**:可视化分析UI层级结构 --- ### 二、核心实现步骤 #### 步骤1:环境准备 ```python import uiautomation as auto auto.SetGlobalSearchTimeout(15) # 设置全局元素查找超时时间 ``` #### 步骤2:启动应用程序 ```python # 通过进程名启动(需提前获取拼多多工作台exe名称) app = auto.WindowControl(searchDepth=1, Name="拼多多工作台") app.SetActive() # 激活窗口 ``` #### 步骤3:元素定位(以登录为例) ```python # 定位用户名输入框(使用Inspect.exe获取元素属性) username = app.EditControl(Name="账号输入框", AutomationId="tbUsername") username.SendKeys("your_account") # 定位密码输入框 password = app.EditControl(Name="密码输入框", ClassName="Edit") password.SendKeys("your_password{ENTER}") # 输入后自动回车 ``` #### 步骤4:复杂操作示例(订单导出) ```python # 定位订单管理菜单 order_menu = app.MenuItemControl(Name="订单管理") order_menu.Click() # 定位导出按钮(可能需要处理延迟加载) export_btn = auto.WaitForExist(lambda: app.ButtonControl(Name="导出"), timeout=10) export_btn.Click() # 处理文件保存对话框 save_dialog = auto.WindowControl(Name="另存为") save_dialog.EditControl(Name="文件名:").SendKeys("orders_202310.csv") save_dialog.ButtonControl(Name="保存(S)").Click() ``` --- ### 三、关键问题解决方案 1. **动态元素定位** ```python # 使用正则表达式匹配部分名称 dynamic_element = app.PaneControl(searchDepth=3, Name=auto.RegexPattern(".*今日订单.*")) ``` 2. **异步加载等待** ```python auto.WaitForExist(lambda: app.ListItemControl(Name="数据加载完成"), timeout=20) ``` 3. **验证码处理** - 方案一:接入第三方OCR服务(需考虑合规性) ```python captcha_img = app.ImageControl(AutomationId="captchaImage") captcha_img.CaptureToImage("temp.png") code = call_ocr_api("temp.png") # 调用OCR接口 ``` - 方案二:设置手动断点 ```python auto.Logger.WriteLine("请手动输入验证码后继续...") input("按回车继续执行") ``` --- ### 四、优化建议 1. **异常处理增强** ```python try: element.Click() except auto.ElementNotFoundError: auto.Logger.Error("元素定位失败,尝试备用方案") fallback_element.Click() ``` 2. **操作日志记录** ```python auto.Logger.Write("开始执行订单导出流程", consoleColor='green') ``` 3. **权限配置** - 右键使用**管理员身份运行**Python脚本 - 关闭拼多多工作台的DPI缩放适配 --- ### 五、典型代码结构 ```python from uiautomation import * import time def pdd_automation(): try: # 启动应用 app = WindowControl(Name="拼多多工作台") app.SwitchToThisWindow() # 执行核心业务流程 perform_login(app) export_orders(app) except Exception as e: Logger.Error(f"自动化执行失败: {str(e)}") def perform_login(window): window.EditControl(Name="账号输入框").SendKeys("test@example.com") window.EditControl(Name="密码输入框").SendKeys("password123{ENTER}") time.sleep(3) # 等待登录完成 if __name__ == "__main__": pdd_automation() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小黑cx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值