ARTICLE · 1252557
PC端自动化测试实战教程-19-pywinauto定位到多个控件如何处理(详细教程)

松柏独在。
草木秋死,

关注北京宏哥,不迷路,提前解锁更多干货
这是我的第495篇原创
作者:北京宏哥
☆☆☆☆☆
感谢您抽出

.

.

阅读本文

1.简介
在日常的工作和学习的过程中,我们通过各种定位方法定位的控件有时候是唯一的,有时候却不仅仅是一个而是一个以上或者更多的控件。想必跟随宏哥一直学习的小伙伴或者童鞋们,从宏哥之前的实践文章中知道,好多报错也是因为找到两个或者两个以上的控件,代码一时间不知道处理谁,而出现发现多个控件的报错。而且宏哥之前就因为这个问题,这种情况一度没有解决方法,被迫断更这一系列的的文章了,但是随着深入的学习和了解,没有想到处理起来是这么的简单......今天宏哥就来讲解和分析一下一下如何处理这种情况。
2.土八路打法
之前宏哥遇到类似的情况,结果代码就会报错,不知道怎么处理,因为刚刚接触学习,所以就想了一种土办法可以暂时解决问题,详细过程,大家可以看一下宏哥的这篇文章:传送门。如下图所示:

3.正规军打法
随着深入的了解和学习,宏哥无意中了解到这种情况可以这么处理,非常简单。也是加一个参数,但是此参数非彼参数。这个参数是指哪打哪。而宏哥上边那种土办法,如果定位到的两个控件的title也一样,就会不灵光,失效了。就会报同样的错误。而这个参数却不受任何影响。就像王毅部长说的一样:他强任他强,清风拂山岗!
3.1用法
pywinauto 在查找到多个相同控件时操作会报错,可以使用found_index 选择其中的一个。在控件信息中如果有多个相同控件时,防止程序可能的报错,可采用found_index,如果确定只有唯一一处时,可省略该参数。
3.2查找到多个相同控件
1.我们来先看一下,如果定位到多个相同的控件,没有参数会不会报错。
3.2.1代码设计

3.2.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-19@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-19-pywinauto定位到多个控件如何处理(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查找MenuBarmenu = win.child_window(control_type="MenuBar")print(menu.window_text())3.2.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出报错(在获取窗口文本menu.window_text() 时会报错,因为不止找到一个),如下图所示:

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

2.加上 found_index 参数,按索引取值,索引下标从0开始,要记住喽。
3.2.4代码设计

3.2.5参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-19@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-19-pywinauto定位到多个控件如何处理(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查找MenuBarmenu = win.child_window(control_type="MenuBar",found_index=0)print(menu.window_text())3.2.6运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,没有报错,如下图所示:

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

4.趁热打铁
既然知道如何处理了,我们不妨将相同类型得控件得文本都打印出来,看一下。
4.1代码设计

4.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-19@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-19-pywinauto定位到多个控件如何处理(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']# 查找MenuBar,并循环打印文本index = 1while(index >= 0): menu = win.child_window(control_type="MenuBar", found_index=index) text = menu.window_text() # print(type(text)) if text is not None: print(menu.window_text()) else: print("MenuBar文本为空") index = index-14.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

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

5.往事回顾
都说往事不堪回顾,但是不回顾不行啊,因为之前那种解决办法虽然能解决问题,但是只能作为临时的或者应急的。还是现在这种方法靠谱一些。宏哥这里就演示一下将前边那个土八路解决得方法修改成正规军的解决方法。
5.1代码设计

5.2参考代码
# -*- coding:utf-8 -*-# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。'''Created on 2026-10-19@author: 北京-宏哥北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)Project: PC端自动化测试实战教程-19-pywinauto定位到多个控件如何处理(详细教程)'''# 3.导入模块from pywinauto import Applicationimport timeapp = Application('uia').start("notepad.exe")time.sleep(3)app = Application('uia').connect(class_name="Notepad")win = app['无标题 - Notepad']win.type_keys("hello宏哥")# win.print_ctrl_ids()# win1 = app['Menu']a = win.child_window(auto_id="MenuBar", control_type="MenuBar",found_index=0)a.item_by_path('文件->另存为').click_input()# 处理保存对话框(不同系统版本弹窗标题可能不同)# 等待另存为窗口出现win.child_window(title="另存为", control_type="Window").wait('ready', timeout=15)# 输入文件名称win.child_window(title="文件名:", control_type="Edit").type_keys("北京宏哥.txt")# select 选择ComboBox 选项win.child_window(title="编码:", control_type="ComboBox").select("UTF-8 BOM")# win.print_ctrl_ids()# 保存win.child_window(title="保存(S)", control_type="Button").click()5.3运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

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

3.好了,到此之前宏哥挖的坑在这里也被填平了,有兴趣的小伙伴可以试一下将索引改成1,然后运行代码就会报错,找不到元素,因为在另一个控件中确实没有那个元素所以定位不到。
6.小结
这一篇主要讲解了遇到在定位控件信息中如果有多个相同控件时,防止程序可能的报错,可采用found_index,如果确定只有唯一一处时,可省略该参数。希望都各位小伙伴或者童鞋们有所帮助和参考。好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。

因工作繁忙,暂时做不到日更
每周一、周五早9:00左右准时更新(特殊情况例外)
如果你喜欢我的文章,记得点赞+关注
更多干货,与你分享

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便心生放弃的话,可以点击下方【阅读原文】加入我们的QQ群:339806057,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。
END

右下角,您点赞和推荐
宏哥工资涨2毛

关注公众号,阅读更多技术干货👇
🧐 点击「推荐」,给宏哥加个鸡腿吧👇















































































