🔥PC端自动化测试实战教程-13-pywinauto操作应用程序窗口的MenuItem菜单项 - 上篇(详细教程)

299 阅读5分钟

1.简介

前边的文章中也介绍过如何操作应用程序窗口的级联菜单,但是有时候我们可能会遇到MenuItem 菜单项以及子菜单项的操作,宏哥觉得差不多,但是有些要注意的地方和差异。今天宏哥就给小伙伴或者童鞋们来讲解和分享一下这个知识点:pywinauto 操作 应用程序窗口的MenuItem 菜单项,以及子菜单项。

2.什么是MenuItem菜单?

2.1MenuItem 菜单的定义与核心特性

  1. ‌基本概念‌
    MenuItem(菜单项)是构成菜单系统的最小交互单元,通常表现为独立的功能入口或命令触发器。它以文本、图标或组合形式呈现,直接绑定点击事件或快捷键以执行特定操作。 

  2. ‌功能特点‌

    • 作为原子组件,不包含子层级。
    • 支持基础交互(如点击)、禁用/启用状态控制。
    • 可扩展为复选框(CheckboxMenuItem)或单选按钮形态,实现状态切换功能。

2.2级联菜单的定义与特征

  1. ‌基本概念‌
    级联菜单(Cascading Menu)通过父子层级关系组织菜单项,允许父菜单项展开包含子菜单项的嵌套结构,常用于分类复杂功能或多层次操作场景。 

  2. ‌功能特点‌

    • 父菜单项右侧通常带有箭头标识,暗示存在子菜单层级。
    • 通过悬停或点击展开子菜单,提供更精细的功能分类。
    • 支持动态增减子项,适应复杂业务场景。

2.3核心区别对比

‌特征‌‌MenuItem‌‌级联菜单‌
‌结构特点‌单一层级,无子菜单多层级嵌套,包含父项和子项
‌交互方式‌直接触发操作(如保存、退出)需展开子菜单进一步选择操作
‌界面标识‌无特殊标识右侧箭头符号(→)表示子菜单存在
‌适用场景‌原子操作(单一功能)功能分类(如“文件→新建→文档”)
‌代码实现‌使用 JMenuItem 类父项使用 JMenu 类,子项由 JMenu 或 JMenuItem 构成

3.操作方法

pywinauto提供了操作‌MenuItem‌菜单的方法:

  • 作为原子组件,不包含子层级。items() 获取子菜单项
  • click_input() 选中菜单
  • item_by_path() 或者item_by_index(n)选择子菜单

4.项目实战

因为宏哥的系统是Windows11,所以这里为了减少不必要的麻烦主要还是通过Windows安装的Notepad++编辑器进行演示和实践。这里宏哥先介绍2种常见的操作‌MenuItem‌菜单的方法。

4.1items()获取menu菜单项

以Notepad++编辑器为例操作,获取menu菜单项。如下图所示:

4.1.1代码设计

4.1.2参考代码

# -*- coding:utf-8 -*-

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-05-28
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-13-pywinauto操作应用程序窗口的MenuItem菜单项(详细教程)
'''

# 3.导入模块
from pywinauto import Application
import time

app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe")
win = app['新文件 1 - Notepad++']
# # win.print_ctrl_ids()
menu = win['应用程序']
# menu.print_ctrl_ids()
# 获取获取menu菜单项
print(menu.items())

4.1.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出:获取到的menu菜单项,如下图所示:

2.运行代码后电脑端的动作(启动Notepad++编辑器,控制台打印menu菜单项)。如下图所示:

4.2items()获取子菜单项

以Notepad++编辑器为例操作,获取文件(F)下的子菜单项。如下图所示:

4.2.1代码设计

4.2.2参考代码

# -*- coding:utf-8 -*-

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-05-28
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-13-pywinauto操作应用程序窗口的MenuItem菜单项(详细教程)
'''

# 3.导入模块
from pywinauto import Application
import time

app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe")
win = app['新文件 1 - Notepad++']
# # win.print_ctrl_ids()
menu = win['应用程序']
# menu.print_ctrl_ids()
# 获取文件下的子菜单
f = win.child_window(title="文件(F)").click_input()
# win.print_ctrl_ids()
menu1 = win['Menu4']
print(menu1.items())
# 关闭运行的窗口
win.close()

4.2.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出:文件(F)下的子菜单项,如下图所示:

2.运行代码后电脑端的动作(启动Notepad++编辑器)。如下图所示:

5.小结

5.1扩展

有些小伙伴或者童鞋们,觉得打印的菜单一行放不下被遮挡或者看不清楚,这个好办啊,直接用循环将菜单打印成一列就可以看清楚了,其实灰常简单,定义一个获取菜单的循环方法,然后调用即可!

5.1.1代码设计

5.1.2参考代码

# -*- coding:utf-8 -*-

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-05-28
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-13-pywinauto操作应用程序窗口的MenuItem菜单项(详细教程)
'''

# 3.导入模块
from pywinauto import Application
import time

def list_menu(menu_item, space):
    '''
     作用:递归法遍历菜单
    '''
    for i in menu_item.items():
        print(i)

app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe")
win = app['新文件 1 - Notepad++']
# # win.print_ctrl_ids()
menu = win['应用程序']
# menu.print_ctrl_ids()
# 调用方法获取获取menu菜单项
list_menu(menu,"")

5.1.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的动作(启动记事本)。如下图所示:

 好了,时间不早了,关于pywinauto操作应用程序窗口的MenuItem菜单项今天宏哥就分享到这里吧!!!感谢您耐心地阅读~