在上一篇博客中我们系统学习了pywinauto中文本输入、键盘按键模拟的基础用法能够实现桌面软件的基础输入、回车、快捷键操作。而在真实 Windows 软件自动化场景中菜单栏、多级下拉菜单、右键菜单是高频交互控件例如编辑器的「文件 - 保存」、软件的功能配置菜单、嵌套子菜单等。本文将聚焦pywinauto中菜单控件的完整操作体系从基础菜单获取、索引定位、路径定位到多级嵌套菜单实操最后结合Sublime 批量创建文件的真实自动化测试场景完整讲解菜单自动化的核心用法、避坑细节与实战落地带你实现从基础输入到复杂菜单交互的进阶。一、前置基础回顾1.1 环境依赖依旧使用pywinauto库Windows 平台直接安装桌面软件自动化统一使用backenduia后端兼容性适配绝大多数 Windows 软件pip install pywinauto1.2 核心前置逻辑操作菜单前必须先连接程序进程、定位主窗口等待窗口加载完成否则菜单控件无法被识别。Application(backenduia).connect(processPID)连接已打开的软件进程win app.window(title_re.*窗口标题.*)正则匹配主窗口win.wait(visible)等待窗口可见就绪二、菜单控件基础核心方法pywinauto提供了 4 个核心菜单操作 API分别实现获取菜单列表、索引定位、路径定位、一键选择菜单适配不同层级的菜单场景下面逐一拆解。2.1 items ()获取全部菜单项items()用于返回当前菜单栏下所有一级菜单项返回MenuItemWrapper对象列表可查看菜单名称、句柄等信息常用于调试查看菜单结构。语法与实战代码以 Sublime Text 编辑器为例from pywinauto import Application # 1. 连接Sublime Text进程替换为你的软件PID app Application(backenduia).connect(process38544) # 2. 匹配Sublime主窗口 win app.window(title_re.*Sublime Text.*) # 等待窗口加载完成 win.wait(visible, timeout10) # 3. 定位应用程序菜单栏顶部File/Edit等菜单条 menu win[应用程序] # 4. 获取所有一级菜单项打印菜单信息 print(所有一级菜单项, menu.items())运行结果输出 Sublime 顶部菜单栏File、Edit、Selection、Find、View、Goto、Tools...Help全部菜单项对象可清晰查看菜单层级结构。2.2 item_by_index ()通过索引定位菜单项通过数字索引精准定位菜单项索引从0开始适合菜单顺序固定、名称易变动的场景。menu.item_by_index(idx) # idx菜单索引从0开始实战代码from pywinauto import Application app Application(backenduia).connect(process38544) win app.window(title_re.*Sublime Text.*) win.wait(visible) menu win[应用程序] # 定位索引为0的菜单项即Sublime的File菜单 first_menu menu.item_by_index(0) # 点击菜单展开下拉列表 first_menu.click_input()2.3 item_by_path ()通过菜单路径定位最常用通过菜单层级路径定位菜单项格式为父菜单-子菜单-孙菜单适配多级嵌套菜单空格不影响匹配支持模糊 / 精准匹配。menu.item_by_path(path, exactFalse) # path菜单层级路径如File-Save # exact是否精准匹配False模糊匹配True完全匹配实战实现 File - Save 保存操作from pywinauto import Application app Application(backenduia).connect(process38544) win app.window(title_re.*Sublime Text.*) win.wait(visible) menu win[应用程序] # 方式1无空格路径 menu.item_by_path(pathFile-Save).click_input() # 方式2带空格路径效果完全一致 # menu.item_by_path(pathFile - Save).click_input()执行后自动点击 Sublime 的文件-保存菜单触发保存弹窗。2.4 menu_select ()一键选择菜单极简语法menu_select()是简化版菜单选择 API无需手动获取菜单栏直接通过窗口对象调用一键执行菜单路径操作是日常自动化的首选语法。注意区分「系统菜单栏」窗口还原 / 最小化和「应用菜单栏」软件功能菜单绝大多数场景使用应用菜单栏。win.menu_select(path, exactFalse)实战代码from pywinauto import Application app Application(backenduia).connect(process38544) win app.window(title_re.*Sublime Text.*) win.wait(visible) # 一键执行 File - Save 菜单操作 win.menu_select(pathFile - Save)相比item_by_path()代码更简洁无需额外定位菜单栏直接操作。三、进阶多层级嵌套菜单定位实战实际软件中大量存在三级及以上嵌套菜单例如 Sublime 中File - Open Recent - Clear Items普通菜单定位会失效需要分步定位父菜单、子菜单窗口、孙菜单是菜单自动化的重难点。3.1 场景说明Sublime 中点击File→ 展开Open Recent子菜单 → 点击Clear Items清除最近打开记录菜单存在多级嵌套需要分步定位。3.2 完整实战代码from pywinauto import Application from pywinauto.mouse import move, click import time # 1. 连接Sublime进程 app Application(backenduia).connect(process25920) win app.window(title_re.*Sublime Text.*) win.wait(visible) # 2. 定位顶部菜单栏 menu_bar win.child_window(title应用程序, auto_idMenuBar, control_typeMenuBar) # 3. 定位File一级菜单点击展开 file_menu win.child_window(titleFile, control_typeMenuItem) # 打开Open Recent子菜单 menu_bar.item_by_path(File-Open Recent).click_input() # 4. 定位Open Recent弹出的子菜单窗口 openRecent_win file_menu.child_window(titleOpen Recent, control_typeWindow) openRecent_win.wait(visible) # 5. 定位子菜单中的Clear Items选项 # 方法1菜单路径定位部分场景坐标偏移点击失效 # openRecent_menu openRecent_win.child_window(titleOpen Recent, control_typeMenu) # clear_items openRecent_menu.item_by_path(Clear Items) # clear_items.click_input() # 方法2精准控件定位鼠标偏移稳定可靠推荐 clear_items openRecent_win.child_window(titleClear Items, auto_id31, control_typeMenuItem) # 获取控件中心点向下偏移避免菜单遮挡 point clear_items.rectangle().mid_point() move(coords(point.x, point.y30)) time.sleep(0.5) click(coords(point.x, point.y30))核心避坑点多级菜单会弹出独立子菜单窗口必须单独定位子窗口直接点击菜单控件易出现坐标偏移、点击失效推荐使用鼠标偏移精准点击菜单展开存在延迟需添加time.sleep()等待避免定位失败。四、自动化测试落地Sublime 批量创建文件结合菜单操作、文本输入、文件校验实现批量创建文本文件的完整 GUI 自动化包含测试用例设计 完整可运行代码 结果校验贴合企业自动化测试真实流程。4.1 自动化测试用例设计GUI 自动化分为界面测试和功能测试针对 Sublime 创建文件场景界面测试验证主窗口标题、菜单栏「文件」选项正常显示验证点击「文件」后「新建、保存」子菜单正常展示验证保存弹窗布局完整路径输入框、文件名、保存按钮正常验证空文件名、无效路径时弹出对应错误提示。功能测试验证通过菜单 / 快捷键可正常新建空白文件验证输入文本后可通过菜单保存文件验证文件可正确写入指定路径重复文件支持覆盖校验。4.2 完整代码实现验证文件正确写入指定路径from pywinauto import Application import time import os # 1. 启动Sublime Text软件也可使用connect连接已打开的进程 app Application(backenduia).start(rD:\software\Sublime Text 3\sublime_text.exe) # 匹配主窗口 win app.window(title_re.*Sublime Text.*) win.wait(visible, timeout10) # 2. 批量创建2个文件循环执行 for i in range(1, 3): # 2.1 新建文件输入自定义内容 win.type_keys(f创建第{i}个文件内容, with_spacesTrue) time.sleep(0.5) # 2.2 调用菜单File - Save触发保存弹窗 win.menu_select(File - Save As...) save_win win[另存为] save_win.wait(visible) # 2.3 输入保存路径文件名 filename fD:\\file\\GUITest\\test_{i}.txt # 定位文件名输入框输入文件名称 save_win.child_window(title文件名(N):, auto_id1001, control_typeEdit).type_keys(filename) time.sleep(0.5) # 2.4 点击保存按钮 save_win.child_window(title保存(S), auto_id1, control_typeButton).click_input() time.sleep(1) # 3. 结果校验断言文件是否真实创建自动化测试核心校验逻辑 assert os.path.exists(filename), f文件{filename}创建失败 print(f✅ {filename} 创建成功) # 4. 新建空白文件开启下一轮循环 win.type_keys(^n) # CtrlN 快捷键新建文件 time.sleep(0.5)运行结果自动在D:\file\GUITest路径下批量生成test_1.txt、test_2.txt文件文件内包含自定义内容控制台输出创建成功提示。五、总结与拓展5.1 核心方法速查方法作用适用场景items()获取所有一级菜单项调试查看菜单结构item_by_index()索引定位菜单菜单顺序固定、名称易变item_by_path()路径定位菜单多级嵌套菜单灵活匹配menu_select()一键选择菜单常规菜单操作极简代码5.2 避坑核心要点多级菜单必须分步定位子菜单弹窗不能直接用一级菜单操作菜单点击易偏移优先使用鼠标偏移点击提升稳定性菜单展开、弹窗加载存在延迟必须添加wait()或time.sleep()自动化测试必须添加断言校验验证操作结果而非单纯模拟点击。5.3 拓展方向掌握菜单操作后可结合列表控件、鼠标操作、键盘输入拓展实现企业微信、钉钉菜单功能自动化办公软件Word/Excel批量文档处理软件功能全流程自动化回归测试。结合上一篇键盘输入内容至此我们完成了pywinauto基础控件操作的完整学习后续可继续学习列表、复选框、弹窗等控件搭建完整的 Windows 桌面 GUI 自动化测试体系。