前言

- Pywinauto工具简介
   pywinauto 是一个 Python 库,专门用于自动化 Windows GUI。它允许开发者通过编程控制和操作 Windows 应用程序的界面,包括点击按钮、输入文本、获取控件信息等。pywinauto 支持传统的窗口应用(Win32应用)以及现代的桌面应用程序(例如 WPF 或 UWP)。它的核心优势在于简化了自动化测试和操作过程,尤其适用于需要重复操作的 Windows 程序。

- Windows元素定位工具:Inspect
   Inspect 是一个由 Microsoft 提供的工具,专门用于检查 Windows 应用程序的 UI 元素。它可以让开发者查看和获取界面中每个控件的详细信息,包括控件的属性(如名称、类型、状态)及其在界面中的位置。开发者可以利用这些信息,帮助 pywinauto 定位和操作目标控件。Inspect 主要用于辅助开发人员识别元素,特别是在测试和自动化脚本中非常实用。

- Windows元素定位工具:Spy++
   Spy++ 是 Microsoft Visual Studio 附带的工具,用于捕获和显示 Windows 应用程序的消息和元素。它能够实时跟踪应用程序中的窗口和控件,并提供详细的消息传递和元素层次结构。与 Inspect 类似,Spy++ 也帮助开发者分析和调试应用界面,找出元素的 ID、类名等信息。它特别适合于需要深入了解应用程序消息和控件结构的开发者。

- 演示程序:Xshell 6

CSDN下载链接: https://download.csdn.net/download/qq_45664055/90839608

Pywinauto中文文档: https://www.kancloud.cn/gnefnuy/pywinauto_doc/1193035


一、Pywinauto基础

  • 安装指定版本或最新版本:pip3 install pywinauto==0.6.8

1、启动程序方法

from pywinauto.application import Application

# 启动应用程序,并使用 UI 自动化的 UIAutomation(uia)后端
# Application(backend="uia") 通过指定 backend 参数来选择使用哪种后端进行 UI 控件的操作。
# backend 参数可以设置为以下几种方法:
# 1. "win32" - 使用经典的 Win32 后端,适用于传统的 Windows 应用程序
# 2. "uia" - 使用 UIAutomation 后端,适用于支持 UIAutomation 的现代 Windows 应用程序
app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")

2、获取应用程序窗口名称

方法一:获取当前所有打开的应用窗口名称

from time import sleep
from pywinauto.application import Application
from pywinauto import Desktop

app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")

# 等待软件启动
sleep(5)

# 获取当前桌面上的所有窗口
windows = Desktop(backend="uia").windows()
# 打印每个窗口的名称
for window in windows:
    print(window.window_text())

方法二:通过 Inspect 查看
在这里插入图片描述

3、连接到已运行的应用程序

  • 如果应用程序已经在运行中,可以使用 connect() 方法来连接到它
app = Application(backend="uia").connect(title="Xshell 6 (Free for Home/School)")

二、元素定位与控件操作

1、查看程序所有控件参数

from pywinauto.application import Application

app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")

# 获取标题为 "Xshell 6 (Free for Home/School)" 的窗口实例,用于后续操作
window = app.window(title="Xshell 6 (Free for Home/School)")

# 两种方法:
# 打印窗口控件的标识符,并返回控件层级结构
# 参数:
# depth: 控件层级的深度,None 表示无限深度,限制深度可以帮助缩小搜索范围。
# filename: 将控件标识符输出到指定的文件,None 表示不输出到文件,直接打印到控制台。
window.print_control_identifiers(depth=None, filename="control_identifiers.txt")

# 打印窗口控件的树形结构,并返回控件层级信息
window.dump_tree(depth=2, filename=None)

# 总结:print_control_identifiers 侧重于控件的标识符,dump_tree 侧重于控件的层级关系

在这里插入图片描述

2、获取指定控件相关信息

from pywinauto.application import Application

app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")
window = app.window(title="Xshell 6 (Free for Home/School)")
button = window.child_window(title="新建", control_type="Button")
button.click()
edit = window.child_window(title="名称(N):", auto_id="1028", control_type="Edit")

print("控件名称:", edit.element_info.name)
print("控件类名:", edit.element_info.class_name)
print("控件类型:", edit.element_info.control_type)
print("控件自动化ID:", edit.element_info.automation_id)
print("控件是否启用:", edit.is_enabled())
print("控件的父控件:", edit.parent())

3、元素定位

  • 通过 Inspect 和 print_control_identifiers 组合获取控件信息,先通过 Inspect 定位到你想要操作的控件,然后通过 print_control_identifiers 获取所有控件 ,再 control_identifiers.txt 中查找控件

1、启用红框中的按钮,然后鼠标拖到 新建 控件上
在这里插入图片描述

2、通过 print_control_identifiers 获取所有控件,在 control_identifiers.txt 查找 新建 控件(如果有多个 新建 控件,就在 Inspect 中查找相关的参数,去定位到指定位置)
在这里插入图片描述

3、通过child_window(title=“新建”, control_type=“Button”) 定位元素

4、常见的 control_type 类型

  • control_type 是 pywinauto 中用来识别和区分 UI 元素类型的属性。每个控件都有一个唯一的 control_type,可以用来帮助你在自动化操作中找到并与特定的 UI 元素进行交互
--------------------------------
Button - 按钮控件
--------------------------------
TextBox - 文本框控件
--------------------------------
ComboBox - 下拉框控件
--------------------------------
Edit - 编辑控件(例如,文本输入框)
--------------------------------
CheckBox - 复选框控件
--------------------------------
RadioButton - 单选按钮控件
--------------------------------
List - 列表控件
--------------------------------
Window - 窗口控件
--------------------------------
Pane - 面板控件
--------------------------------
Image - 图片控件
--------------------------------
Menu - 菜单控件
--------------------------------
MenuItem - 菜单项控件
--------------------------------
Tab - 标签控件
--------------------------------

三、常用操作方法

1、点击操作

from pywinauto.application import Application

app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")
window = app.window(title="Xshell 6 (Free for Home/School)")

# click() 标准的点击方法; click_input() 模拟更为真实的用户点击输入行为,适合处理更复杂的点击场景
button = window.child_window(title="新建", control_type="Button")
button.click()
# 以上点击方法报错时,使用以下方法
# button.click_input()

2、输入操作

edit = window.child_window(title="名称(N):", auto_id="1028", control_type="Edit")
edit.type_keys("软件测试服务器")

3、清空操作

edit_1 = window.child_window(title="名称(N):", auto_id="1028", control_type="Edit")
edit_1.set_text('')

4、关闭应用窗口

app.kill()  # 强制关闭应用

5、下拉框选择(示例一)

from pywinauto.application import Application

app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")
window = app.window(title="Xshell 6 (Free for Home/School)")
button = window.child_window(title="新建", control_type="Button")
button.click()

# 找到 ComboBox 下拉框,下拉框需要点击才会显示下拉列表数据
combo_box = window.child_window(title="协议(P):", auto_id="541", control_type="ComboBox")

# 图片一数据
# window.print_control_identifiers(depth=None, filename="control_identifiers.txt")

# 下拉列表数据不打开是无法获取到的,需要先点击下拉框,然后通过print_control_identifiers获取数据再定位
button_1 = combo_box.child_window(title="打开", auto_id="DropDown", control_type="Button")
button_1.click()

# 图片二数据
# window.print_control_identifiers(depth=None, filename="control_identifiers.txt")

# 定位到名为 "SFTP" 的 ListItem 控件
list_item = window.child_window(title="SFTP", control_type="ListItem")
# 点击该项, 这里点击只支持click_input()方法,click()方法会报错
list_item.click_input()

在这里插入图片描述


在这里插入图片描述

6、下拉框选择(示例二)

# 下拉框示例程序,直接运行或打包成EXE都可以
import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("下拉列表选择框")
root.geometry("300x200+630+80")

# 下拉列表的选项数据
options = ["选项1", "选项2", "选项3", "选项4", "选项5"]

# 创建一个变量来保存选择的值
selected_option = tk.StringVar()
selected_option.set(options[0])  # 默认选中第一个选项

# 创建下拉列表(OptionMenu)
dropdown = tk.OptionMenu(root, selected_option, *options)
dropdown.pack(pady=20)  # 添加到窗口并设置间距

# 启动主循环
root.mainloop()
# 操作下拉框程序
from pywinauto.application import Application
# import subprocess
# import time

# 启动 EXE 文件
# subprocess.Popen(["test1.exe"])
# time.sleep(3)

# 程序标题
app = Application(backend="uia").connect(title="下拉列表选择框")
window = app.window(title="下拉列表选择框")
# 第一次获取控件
# window.print_control_identifiers()
pane2 = window.child_window(best_match="Pane2", control_type="Pane")
pane2.click_input()

# 下拉列表数据窗口标题
list_data = Application(backend="uia").connect(title="上下文").window(title="上下文")
# 第二次获取控件
# list_data.print_control_identifiers()
menu_item = list_data.child_window(auto_id="2", control_type="MenuItem")
menu_item.click_input()

四、等待与同步

1、wait 方法

主要用法:
1. 等待控件可见或可操作
   wait 方法会阻塞代码执行,直到满足给定的条件(如控件可见、可点击等)

2. 常见的等待条件:
   visible: 等待控件变得可见
   exists: 等待控件存在
   enabled: 等待控件可用
   ready: 等待控件处于准备好进行交互的状态

from pywinauto.application import Application


app = Application(backend="uia").start(r"C:\Install\Xshell7\Xshell.exe")
window = app.window(title="Xshell 6 (Free for Home/School)")


button = window.child_window(title="新建", control_type="Button")
button.click()

# 通过这个勾选框模拟输入框是否可用
# check_box = window.child_window(title="连接异常关闭时自动重新连接(A) ", auto_id="1632", control_type="CheckBox")
# check_box.click()

# 处理超时异常
try:
    # 输入框
    edit = window.child_window(title="间隔(V): ", auto_id="1631", control_type="Edit")
    edit.wait('enabled', timeout=5)  # 等待5秒
    edit.type_keys(2)

except Exception as e:
    print(f"错误:{e}")

Logo

一站式 AI 云服务平台

更多推荐