请添加图片描述


一、pywinauto常⻅操作

1 打开程序

1.1 打开应⽤程序

start(self, cmd_line......)

部分参数详解:
cmd_line 这是启动应⽤程序的命令⾏字符串。它必须包含应⽤程序的路径和名称,还可以包含启动参数

例如:
"notepad.exe" :启动记事本程序。
"C:\\Windows\\system32\\notepad.exe" :使⽤绝对路径启动记事本程序。
"calc.exe" :启动计算器程序。

1.2 连接已经打开的应⽤程序

connect(self, **kwargs)

部分参数详解:
process :⽬标的进程ID
handle :⽬标的窗⼝句柄
注意:连接到已在运⾏的进程,该动作仅根据⼀个参数执⾏
⽰例1:打开记事本程序

# ⽰例1:打开记事本程序
# 1,启动记事本应用
app = Application(backend="uia").start("notepad.exe")
# (backend="uia" 指定用 Windows UI Automation 接口,适配现代应用)
# 2, 通过进程ID()PID链接
# 方式1:用启动后对象的 process 属性获取PID
app = Application(backend="uia").connect(process=app.processs)
# 方式2: 硬编码PID(写死 31528)
# app = Application(backend="uia").connect(process=36600)
# 3, 通过窗口句柄 连接
# app = Application(backend="uia").connect(handle=36600)
#

在这里插入图片描述

⽰例2:打开sublime_text程序

# ⽰例2:打开sublime_text程序
## 1,打开应用程序
app = Application(backend="uia").start("D:\sublime_text\Sublime Text\sublime_text.exe")

# 连接已经打开的应用程序
# 通过pid连接
# app = Application(backend="uia").connect(process=app.process)
# app = Application(backend="uia").connect(process=21128)

#通过句柄连接
app = Application(backend="uia").connect(handle=21128)

二、定位窗⼝

⽅法⼀:通过⾼级pywinautoAPI提供的window⽅法来定位

app.window(title='',...)
定位方式参数 说明
title 定位文本完全等于指定值的元素
title_re 定位文本匹配指定正则表达式的元素
best_match 定位标题与指定值相似的元素(模糊匹配)
class_name 定位窗口类名完全等于指定值的元素
class_name_re 定位类名匹配指定正则表达式的元素
⽰例:定位sublimeText窗⼝
#start参数换成Sublime Text的目标陆路径
app = Application(backend="uia").start("D:\\sublime_text\\Sublime Text\\sublime_text.exe")

# win = app.window(title_re='.*Sublime Text.*')

#精确匹配
# win = app.window(title="untitled • - Sublime Text (UNREGISTERED)")

# title_re 正则匹配
win = app.window(title_re=".*Sublime.*")

#best_match-模糊匹配
# win = app.window(best_match="untitled • - Sublime Text")

#class_name--精确匹配
win = app.window(class_name=".*PX_WINDOW_CLASS")

#class_name--正则匹配
# win = app.window(class_name_re=".*WINDOW_CLASS.*")

win.print_control_identifiers()

print_control_identifiers() ⽅法⽤于打印窗⼝及其⼦控件的标识符信息,帮助⽤⼾识别控件
输出内容

  • 控件的类名、标题、位置(左、上、右、下边界的坐标值)、控制类型等信息。
  • 每个控件的“bestmatch”名称列表,这些名称可以⽤于引⽤控件。

代码:

# import time
from pywinauto.application import Application

# 1. 启动 Sublime Text(修正路径转义)
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

# 2. 等待窗口加载(根据电脑性能调整等待时间,建议3-5秒)
time.sleep(3)

# 3. 用正确的类名定位窗口(替换为你从 Inspect 中查到的 ClassName)
# 示例:假设查到的类名是 "PX_WINDOW_CLASS"
win = app.window(class_name_re=".*PX_WINDOW_CLASS.*")

# 4. 打印控件信息(验证是否定位成功)
win.print_control_identifiers()
Control Identifiers:

Dialog - 'untitled • - Sublime Text (UNREGISTERED)'    (L45, T45, R1268, B1031)
['untitled • - Sublime Text (UNREGISTERED)', 'untitled • - Sublime Text (UNREGISTERED)Dialog', 'Dialog']
child_window(title="untitled • - Sublime Text (UNREGISTERED)", control_type="Window")
   | 
   | ScrollBar - ''    (L56, T20, R156, B30)
   | ['ScrollBar', 'ScrollBar0', 'ScrollBar1']
   |    | 
   |    | Button - '左移一列'    (L0, T0, R0, B0)
   |    | ['左移一列', 'Button', '左移一列Button', 'Button0', 'Button1']
   |    | child_window(title="左移一列", auto_id="UpButton", control_type="Button")
   |    | 
   |    | Thumb - '位置'    (L0, T0, R0, B0)
   |    | ['Thumb', '位置Thumb', '位置', 'Thumb0', 'Thumb1', '位置Thumb0', '位置Thumb1', '位置0', '位置1']
   |    | child_window(title="位置", auto_id="ScrollbarThumb", control_type="Thumb")
   |    | 
   |    | Button - '右移一列'    (L0, T0, R0, B0)
   |    | ['右移一列Button', '右移一列', 'Button2']
   |    | child_window(title="右移一列", auto_id="DownButton", control_type="Button")
   | 
   | ScrollBar - ''    (L-44, T120, R-34, B220)
   | ['ScrollBar2']
   |    | 
   |    | Button - '上一行'    (L0, T0, R0, B0)
   |    | ['上一行', '上一行Button', 'Button3']
   |    | child_window(title="上一行", auto_id="UpButton", control_type="Button")
   |    | 
   |    | Thumb - '位置'    (L0, T0, R0, B0)
   |    | ['Thumb2', '位置Thumb2', '位置2']
   |    | child_window(title="位置", auto_id="ScrollbarThumb", control_type="Thumb")
   |    | 
   |    | Button - '下一行'    (L0, T0, R0, B0)
   |    | ['下一行', '下一行Button', 'Button4']
   |    | child_window(title="下一行", auto_id="DownButton", control_type="Button")
   | 
   | TitleBar - ''    (L80, T48, R1257, B90)
   | ['TitleBar']
   |    | 
   |    | Menu - '系统'    (L56, T56, R89, B89)
   |    | ['系统Menu', '系统', 'Menu', '系统0', '系统1', 'Menu0', 'Menu1']
   |    | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")
   |    |    | 
   |    |    | MenuItem - '系统'    (L56, T56, R89, B89)
   |    |    | ['系统2', 'MenuItem', '系统MenuItem', 'MenuItem0', 'MenuItem1']
   |    |    | child_window(title="系统", control_type="MenuItem")
   |    | 
   |    | Button - '最小化'    (L1046, T46, R1117, B90)
   |    | ['最小化', '最小化Button', 'Button5']
   |    | child_window(title="最小化", control_type="Button")
   |    | 
   |    | Button - '最大化'    (L1117, T46, R1187, B90)
   |    | ['最大化', '最大化Button', 'Button6']
   |    | child_window(title="最大化", control_type="Button")
   |    | 
   |    | Button - '关闭'    (L1187, T46, R1258, B90)
   |    | ['关闭', '关闭Button', 'Button7']
   |    | child_window(title="关闭", control_type="Button")
   | 
   | Menu - '应用程序'    (L56, T90, R1257, B119)
   | ['应用程序', 'Menu2', '应用程序Menu']
   | child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar")
   |    | 
   |    | MenuItem - ''    (L56, T90, R100, B119)
   |    | ['MenuItem2']
   |    | 
   |    | MenuItem - ''    (L100, T90, R148, B119)
   |    | ['MenuItem3']
   |    | 
   |    | MenuItem - ''    (L148, T90, R242, B119)
   |    | ['MenuItem4']
   |    | 
   |    | MenuItem - ''    (L242, T90, R294, B119)
   |    | ['MenuItem5']
   |    | 
   |    | MenuItem - ''    (L294, T90, R350, B119)
   |    | ['MenuItem6']
   |    | 
   |    | MenuItem - ''    (L350, T90, R408, B119)
   |    | ['MenuItem7']
   |    | 
   |    | MenuItem - ''    (L408, T90, R469, B119)
   |    | ['MenuItem8']
   |    | 
   |    | MenuItem - ''    (L469, T90, R544, B119)
   |    | ['MenuItem9']
   |    | 
   |    | MenuItem - ''    (L544, T90, R659, B119)
   |    | ['MenuItem10']
   |    | 
   |    | MenuItem - ''    (L659, T90, R714, B119)
   |    | ['MenuItem11']

进程已结束,退出代码为 0

⽅法⼆:通过动态解析对象属性定位

#不推荐
 app.“best_match”名称

2.1 ⽰例:定位sublimeText窗⼝

⽅法⼆:通过动态解析对象属性定位

不推荐
app.“best_match”名称

# ⽰例:定位sublimeText窗⼝
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

# win = app.Dialog
# win = app.window(best_match='Dialog')

# win = app["untitled • - Sublime Text (UNREGISTERED)"]
# 相当于
# win = app.window(best_match="untitled • - Sublime Text (UNREGISTERED)")

win = app.top_window() #获取改应用的“顶级窗口”
win.wait("exists") # 等待窗口“存在” (确保窗口加载完成, 避免操作时窗口未就绪)
print(win.print_control_identifiers()) #打印窗口内所有空间的标识符(用于查看控件结构,方便后续操作)

注意:Python通过动态解析对象属性简化了创建窗⼝规范。但是属性名与任何变量名都有相同的限制:没有空格、逗号和其他特殊符号,因此这是不推荐写法。

若存在空格或者其他特殊字符等,可采⽤类似字典的⽅式访问,如:

win = app['untitled • - Sublime Text (UNREGISTERED)']
 #上⾯写法等价于
 win = app.window(best_match="untitled • - Sublime Text (UNREGISTERED)")

最简单的定位窗⼝⽅法是询问top_window() ,例如win = app.top_window()

需要注意,这是⽬前相当未经测试的,所以不确定它会返回正确的窗⼝。它绝对是应⽤程序的顶级窗⼝-它可能不是Z-Order中最⾼的窗⼝,但不⼀定是我们想要的窗⼝

from pywinauto import Application
app = Application(backend="uia").connect(process=10140)
win = app.top_window()
win.wait('exists')
print(win.print_control_identifiers())
  1. 含特殊字符的窗口标题:字典式访问
    当窗口标题包含**空格、特殊符号(如 、括号)**时,直接用“属性式访问”(如 app.untitled •...)会因语法问题失败。此时可采用:
  • 字典式访问app['窗口完整标题']
  • 等价写法:app.window(best_match="窗口完整标题")

示例中,窗口标题是 untitled • - Sublime Text (UNREGISTERED)(含空格、圆点、括号),因此用 app['untitled • - Sublime Text (UNREGISTERED)']app.window(best_match="untitled • - Sublime Text (UNREGISTERED)") 来定位窗口。

  1. top_window():快速获取“顶级窗口”(慎用)
    app.top_window() 的作用是获取应用程序的“顶级窗口”(即应用最上层的窗口)。但文档提示它“相当未经测试”,意味着:
  • 它能拿到应用的顶级窗口实例,但不一定是“用户期望的目标窗口”(比如应用若有多个窗口,或窗口堆叠顺序(Z-Order)复杂时,顶级窗口可能不是真正要操作的窗口)。
  • 因此,top_window() 适合快速调试,但生产环境建议用更精准的定位方式(如标题、类名)。
  1. 完整示例:“连接进程 → 取顶级窗口 → 查看控件”流程
    代码逐行解释:
from pywinauto import Application  # 导入核心类Application
app = Application(backend="uia").connect(process=10140)  # 连接到“进程ID为10140”的已运行程序
                                                        # backend="uia":使用UI Automation后端(适配现代应用)
win = app.top_window()  # 获取该应用的“顶级窗口”
win.wait('exists')  # 等待窗口“存在”(确保窗口加载完成,避免操作时窗口未就绪)
print(win.print_control_identifiers())  # 打印窗口内所有控件的标识符(用于查看控件结构,方便后续操作)

三、 窗⼝操作

方法 说明 返回值/补充说明
restore() 窗口恢复正常大小 无返回值(执行窗口恢复操作)
get_show_state() 获取窗口的显示状态。 返回一个整数值,表示窗口的状态:
0: 正常
1: 最大化
2: 最小化
is_dialog() 检查控件是否是顶级窗口。 返回布尔值:True 表示是顶级窗口,False 表示不是顶级窗口。
is_maximized() 检查窗口是否处于最大化状态。 返回布尔值:True 表示窗口已最大化,False 表示未最大化。
is_minimized() 检查窗口是否处于最小化状态。 返回布尔值:True 表示窗口已最小化,False 表示未最小化。
is_normal() 检查窗口是否处于正常状态(既未最小化也未最大化)。 返回布尔值:True 表示窗口处于正常状态,False 表示未处于正常状态。
#3. 窗⼝操作
import time
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

time.sleep(3)
# connect 主要用于 “连接已存在的外部进程”
# app = Application(backend='uia').connect(process=app.process)

win = app.window(title_re=".*Sublime Text.*")

# 添加等待
win.wait("exists", timeout=10)

#最小化
win.minimize()
print("is_minimize: ", win.is_minimized())

win.maximize()
print("is_maximize: ", win.is_maximized())

win.restore()
print("is_normal:", win.is_normal())

print("get_show_state:", win.get_show_state())

print("is_dialog:", win.is_dialog())

win.close()

在这里插入图片描述

四、 定位控件

4.1 控件分类

桌⾯应⽤程序客⼾端的控件和层级结构是GUI⾃动化测试的基础。理解控件的分类、特性和层级关系,能够帮助测试⼈员更⾼效地定位和操作控件,实现⾃动化测试。在实际测试中,结合控件的属性和事件,可以编写灵活且可靠的测试脚本。
打开UI对象检查⼯具UISpy,通过ControlType可查看所定位到控件的类型。

打开UI对象检查⼯具UISpy,通过ControlType可查看所定位到控件的类型。
在这里插入图片描述
常⻅控件⽰例:

分类 控件名称 说明
窗口与对话框 对话框 (Dialog) 用于与用户交互,如显示警告、确认操作或输入信息。
输入控件 窗格 (Pane) 通常作为窗口的一部分,用于显示特定内容或功能。
输入控件 按钮 (Button) 用于触发操作,如点击按钮执行某个功能。
输入控件 编辑栏 (Edit) 用于输入或编辑文本,支持多行或单行输入。
输入控件 组合框 (ComboBox) 结合文本框和列表框,用户可以选择预定义选项或输入自定义值。
输入控件 列表框 (ListBox) 用于显示可选择的项目列表,支持单选或多选。
菜单控件 菜单 (Menu) 用于提供功能选项,通常位于窗口顶部。
菜单控件 菜单项 (MenuItem) 菜单中的具体选项,点击后执行对应功能。
菜单控件 弹出菜单 (PopupMenu) 右键单击时弹出的菜单,用于快速访问常用功能。
列表显示控件 列表显示控件 (ListView) 用于以表格形式显示数据,支持多列显示和排序。
容器控件 组框 (GroupBox) 用于对控件进行分组,提高界面的可读性和组织性。
选择控件 复选框 (CheckBox) 用于多选操作,用户可以勾选多个选项。
选择控件 单选框 (RadioButton) 用于互斥选择,用户只能选择一个选项。
显示控件 状态栏 (StatusBar) 通常位于窗口底部,用于显示应用状态或提示信息。
显示控件 静态内容 (Static) 用于显示静态文本或图像,通常不可编辑。
导航控件 树状视图 (Tree View) 用于展示分层数据,如文件夹结构或组织结构。
导航控件 选项卡控件 (TabControl) 用于在有限空间内组织多个页面或选项卡,每个选项卡可以包含不同的内容。
工具控件 工具栏 (Toolbar) 用于放置常用按钮或工具,方便用户快速操作。
工具控件 工具提示 (ToolTips) 当鼠标悬停在控件上时显示提示信息,帮助用户理解控件功能。
头部内容 头部内容 (Header) 通常用于显示标题或表头信息,如表格的列标题。

通过合理的分类和说明,可以更清晰地理解控件的功能和⽤途,便于在GUI⾃动化测试中进⾏操作和定位。

在使⽤pywinauto进⾏⾃动化操作时,程序启动后,⾸先需要定位到⽬标窗⼝。窗⼝是所有控件的容器,只有成功定位到窗⼝,才能进⼀步操作窗⼝内的控件。控件是窗⼝功能的具体体现,包括按钮、⽂本框、列表等,对控件的操作是⾃动化任务的核⼼。然⽽,在对控件进⾏操作之前,必须先完成控件的定位。定位控件是确保操作准确性的关键步骤,也是⾃动化流程的基础。接下来,我们将深⼊学习如何⾼效定位控件。

定位控件,需要借助前⾯学到的 print_control_identifiers() ⽅法,打印窗⼝及其⼦控件的标识符信息,复制到文本方便查看进行查看进行操作

在这里插入图片描述

4.2 动态解析

基于best_match标题来定位

import time

from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re=".*Sublime Text.*")

win.wait("exists")

print(win.print_control_identifiers())

win.close()

⽰例1:定位sublimeText⼯具的菜单栏

这部分内容围绕 pywinauto 如何定位 Windows 应用窗口 展开,分为「特殊标题窗口的定位方式」「top_window() 方法的使用与限制」「完整示例流程」三部分解释:

4.3 child_window

child_window()和定位窗口的方法window()参数一样,可以通过标题或者类名进行精确匹配、模糊匹配等,在这里额外拓展几个进行控件定位时需要用到的参数:

from pywinauto import Application

# 启动应用
app = Application(backend='uia').start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

# 定位窗口并等待可见
win = app.window(title_re=".*Sublime Text.*")
win.wait('visible', timeout=10)  # 等待窗口可见

# 定位“应用程序”菜单栏(即顶部菜单栏)
menu = win['应用程序']

# 获取所有菜单项(修正:用 items() 而非 item())
menu_items = menu.items()

# print(menu.items())

# for i, item in enumerate(menu_items):
#     print(f"菜单项 {i+1}: {item.window_text()}") # 打印菜单项的标题

print(win.print_control_identifiers())

Tips:
控件之间存在⽗⼦关系,可通过 children() ⽅法获取控件的⼦类,也可通过 parent() ⽅法获取控件的⽗类

 from pywinauto import Application
import time  # 导入time模块,用于主动等待

# 1. 启动应用
app = Application(backend='uia').start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

# 2. 主动等待3秒(让应用有足够时间启动窗口)
time.sleep(3)

# 3. 定位窗口并等待“可见”,延长超时时间到10秒
win = app.window(title_re=".*Sublime Text.*")
win.wait('visible', timeout=10)  # 超时时间改为10秒,确保窗口有足够时间加载

# 4. 定位菜单栏并打印菜单项
menu = win.child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")
print(menu.items())

若存在多个控件auto_id 相同,可通过添加索引参数来定位
from pywinauto import application, Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re=".*Sublime Text.*")

win.wait('visible', timeout=10)

menu = win.child_window(auto_id="MenuBar",control_type="MenuBar", found_index=1)
print(menu.texts())

五、等待

5.1 控件分类

案例:没有添加等待导致引发的错误

from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re='.*Sublime Text.*')

#添加等待
# win.wait('exists')

#最小化
win.minimize()
print("is_minimized:", win.is_minimized())

win.maximize()
print("is_maximized:", win.is_maximized())

win.close()

在这里插入图片描述
GUI应⽤程序⾏为通常不稳定,脚本需要等待,直到出现新窗⼝或关闭/隐藏现有窗⼝。pywinauto可以隐式地(默认超时)灵活地等待对话框初始化,或者明确地使⽤专⽤⽅法/函数来帮助您使代码更容易和更可靠。

5.2 控件分类

wait(self, wait_for, timeout=None, retry_interval=None)
wait_not(self, wait_for_not, timeout=None, retry_interval=None)

参数说明:

wait_not与wait() 类似,wait是等待处于某种状态,而wait_not是等待不处于某种状态,这里以wait为例说明
使⽤⽰例:
“exists” 和"visible"

from pywinauto.application import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re=".*Sublime Text.*")

# 检查窗口是否为有效的句柄
win.wait('exists')
#检查窗口是否是课间
win.wait('visible')
#检查窗口是否被禁用
win.wait('enabled')
#检查窗口是否准备就绪
win.wait('ready')

窗⼝被最⼩化之后,在桌⾯就不可⻅了,因此最⼩化时需要将等待状态改为"exists",应⽤程序界⾯在桌⾯可⻅时等待状态可以设置为"visible"

“enabled”

在这里插入图片描述

#打开计算器

from pywinauto.application import Application

app = Application(backend="uia").connect(process=24196)
win = app.window(title="计算器")
win.wait("visible")

# print(win.print_control_identifiers())
#启动的按钮
enable_btn = win.child_window(title="记忆减法",auto_id="MemMinus", control_type="Button")
#未启用的按钮
disabled_btn = win.child_window(title="消除所有记忆", auto_id="ClearMemoryButton",control_type="Button")

enable_btn.wait("enabled") #代码执行通过
disabled_btn.wait_not("enabled") #代码执行通过

在这里插入图片描述
在这里插入图片描述

5.2 控件分类

from pywinauto.application import Application
import time

# 1. 先关闭所有已运行的计算器(避免多窗口干扰)
import os
os.system("taskkill /f /im Calculator.exe")  # 强制关闭计算器进程
time.sleep(2)  # 等待进程关闭

# 2. 直接启动计算器(无需 PID,系统自带命令 calc.exe)
app = Application(backend="uia").start("calc.exe")
time.sleep(3)  # 等待计算器完全启动

# 3. 定位主窗口(用模糊标题匹配,兼容所有标题变体)
win = app.window(title_re=".*计算器.*")  # 匹配含“计算器”的所有标题
win.wait("ready", timeout=15)  # 延长超时到15秒,确保窗口就绪
print("计算器主窗口已就绪")

is_visible()用于检查元素是否可见,除此之外,is_enabled()用于检查元素是否启用
‘active’
需要注意,'active’状态指的是窗口是否处于活动状态,需要先操作应用程序使得焦点设置在该窗口上或者配合set_focus 来使用:
在这里插入图片描述

# 需要注意,'active'状态指的是窗口是否处于活动状态,需要先操作应用程序使得焦点设置在该窗口上或者配合set_focus来使用:
from pywinauto.application import Application

sublime_app = Application(backend="uia").connect(process=24196)
sublime_win = sublime_app.window(title_re=".*Sublime Text.*")

app = Application(backend="uia").connect(process=24196)
win = app.window(title="计算器")
win.set_focus()
win.child_window(title="一", auto_id="num1Button", control_type="Button").click_input()
win.wait("active") #等待成功
sublime_win.wait("active")

在这里插入图片描述

5.2 wait_until

等待满足某个条件

wait_until(timeout,
retry_interval,func , value=True, op=operator.eq, *args,**kwargs)

部分参数说明:

Timeout :超时时间
retry_interval:重试时间

func:执行的函数
value : 比较的值

i=0
def work():
    global i
    i += 1
    print("当前i的值为", i)
    return i
# 等待work返回的结果为5,继续往下执行
wait_until(10, 1, work, 5)
print("等待通过")

在这里插入图片描述

from pywinauto.application import Application
from pywinauto.timings import wait_until


def get_window():
    # 1. 切换到 win32 后端(提升兼容性)
    app = Application(backend="win32").connect(process=37288)

    # 2. 打印进程内所有窗口标题(调试:确认目标窗口是否存在)
    all_windows = app.windows()
    print("进程内的所有窗口标题:")
    for w in all_windows:
        print(f"  - {w.window_text()}")

    # 3. 用「类名」定位窗口(更稳定,避免标题特殊字符干扰)
    # 从 UI Spy 可知,Sublime Text 的 ClassName 是 "PX_WINDOW_CLASS"
    win = app.window(class_name="PX_WINDOW_CLASS")

    # 4. 先检查窗口是否「存在」,再检查「可见性」
    if win.exists():
        return win.is_visible()
    return False


def test_wait():
    try:
        # 延长超时到 15 秒,确保窗口加载
        wait_until(15, 2, get_window, True)
        print("等待通过:Sublime Text 窗口已可见")
    except Exception as e:
        print(f"等待失败:{str(e)}")


test_wait()
from pywinauto.application import Application

from pywinauto.timings import wait_until

app = Application(backend='uia').start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
# app = Application(backend='uia').connect(process=2392)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
print(file.texts())

在pywinauto中,提供了灵活多样的等待机制,⽤于处理⾃动化过程中常⻅的控件状态变化、窗⼝加载等问题。这些等待机制能够确保⾃动化脚本在执⾏时能够准确地识别⽬标控件或窗⼝,并在合适的时间点进⾏操作。虽然pywinauto提供了多种等待机制,本⽂重点介绍⼏种在实际应⽤中最为常⽤的等待⽅法,帮助⼤家快速掌握核⼼技巧,确保⾃动化流程的稳定性和可靠性。探索更多等待内容:

pywinauto


🚩总结

请添加图片描述

GUI应⽤程序⾏为通常不稳定,脚本需要等待,直到出现新窗⼝或关闭/隐藏现有窗⼝。pywinauto可以隐式地(默认超时)灵活地等待对话框初始化,或者明确地使⽤专⽤⽅法/函数来帮助您使代码更容易和更可靠。

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐