PC端自动化测试实战教程-10-pywinauto操作弹出文件选择框 (详细教程)
1.简介
前边在讲解和分享notepad++编辑器的输入内容->文件->另存为...之后弹出文件选择框,就有小伙伴或者童鞋们私信问,为什么不继续操作了呢?不要着急,今天就给大家分享和讲解如何继续操作:主要是修改文件名,然后点击“保存”按钮,操作弹出文件选择框的这个知识点。
2.什么是弹出文件选择框?
弹出文件选择框是一种用户界面组件,允许用户从文件系统中选择一个或多个文件。这种对话框通常包含一个路径框、文件名、文件类型等元素,用户可以通过图形界面方便地浏览文件夹、选择文件。如下图所示(今天主要讲解的是操作:①文件名和②保存按钮):
3.项目实战
因为宏哥的系统是Windows11,所以这里为了减少不必要的麻烦主要还是通过Windows安装的Notepad++编辑器进行演示和实践。
3.1测试场景
大致测试场景:启动电脑安装的Notepad++编辑器,然后在编辑器中输入“北京-宏哥”内容后,点击编辑器的“文件->另存为...”后,弹出文件选择框,修改文件名为:北京宏哥,最后点击“保存”按钮,保存文件。
3.2查看窗口的结构树
1.为了小伙伴或者童鞋们看的清楚,以及方便宏哥演示,宏哥这里还是采用前边两种方法的代码打印,如下图所示:

2.打印内容,如下:
D:\Python\python.exe D:/Demo/test.py Control Identifiers: Dialog - '*新文件 1 - Notepad++' (L-9, T-9, R1929, B1029) ['Dialog', '*新文件 1 - Notepad++', '*新文件 1 - Notepad++Dialog', 'Dialog0', 'Dialog1'] child_window(title="*新文件 1 - Notepad++", control_type="Window") | | Dialog - '另存为' (L745, T135, R1705, B735) | ['Dialog2', '另存为', '另存为Dialog'] | child_window(title="另存为", control_type="Window") | | | | Pane - '' (L754, T238, R1696, B649) | | ['文件名:Pane', 'Pane', 'Pane0', 'Pane1'] | | | | | | Toolbar - '命令模块' (L754, T238, R1696, B277) | | | ['命令模块', '命令模块Toolbar', 'Toolbar', 'Toolbar0', 'Toolbar1'] | | | child_window(title="命令模块", auto_id="FolderBandModuleInner", control_type="ToolBar") | | | | | | | | Button - '帮助(&H)' (L1649, T241, R1685, B273) | | | | ['帮助(&H)Button', 'Button', '帮助(&H)', 'Button0', 'Button1'] | | | | child_window(title="帮助(&H)", auto_id="HelpButton", control_type="Button") | | | | | | | | SplitButton - '详细信息' (L1571, T241, R1639, B273) | | | | ['详细信息', 'SplitButton', '详细信息SplitButton', 'SplitButton0', 'SplitButton1'] | | | | child_window(title="详细信息", auto_id="ViewControl", control_type="SplitButton") | | | | | | | | | | Button - '视图滑块' (L1606, T241, R1626, B273) | | | | | ['视图滑块', 'Button2', '视图滑块Button'] | | | | | child_window(title="视图滑块", auto_id="SplitMenuButton", control_type="Button") | | | | | | | | Button - '组织' (L758, T241, R838, B273) | | | | ['组织\u200b\u200bButton', 'Button3', '组织\u200b\u200b'] | | | | child_window(title="组织", auto_id="{7DDC1264-7E4D-4F74-BBC0-D191987C8D0F}", control_type="Button") | | | | | | | | Button - '新建文件夹' (L838, T241, R949, B273) | | | | ['新建\u200b\u200b文件夹\u200b\u200b', 'Button4', '新建\u200b\u200b文件夹\u200b\u200bButton'] | | | | child_window(title="新建文件夹", auto_id="{E44616AD-6DF1-4B94-85A4-E465AE8A19DB}", control_type="Button") | | | | | | Pane - '控制项宿主' (L757, T277, R949, B524) | | | ['控制项宿主', 'Pane2', '控制项宿主Pane'] | | | child_window(title="控制项宿主", auto_id="ProperTreeHost", control_type="Pane") | | | | | | | | TreeView - '导航窗格' (L757, T277, R949, B524) | | | | ['导航窗格', 'TreeView', '导航窗格TreeView', 'TreeView0', 'TreeView1'] | | | | child_window(title="导航窗格", auto_id="100", control_type="Tree") | | | | | | | | | | ScrollBar - '垂直滚动条' (L928, T277, R949, B524) | | | | | ['垂直滚动条', '垂直滚动条ScrollBar', 'ScrollBar', 'ScrollBar0', 'ScrollBar1'] | | | | | child_window(title="垂直滚动条", auto_id="NonClientVerticalScrollBar", control_type="ScrollBar") | | | | | | | | | | | | Button - '上一行' (L928, T277, R949, B298) | | | | | | ['上一行', '上一行Button', 'Button5', '上一行0', '上一行1', '上一行Button0', '上一行Button1'] | | | | | | child_window(title="上一行", auto_id="UpButton", control_type="Button") | | | | | | | | | | | | Button - '向上翻页' (L928, T298, R949, B438) | | | | | | ['向上翻页', '向上翻页Button', 'Button6'] | | | | | | child_window(title="向上翻页", auto_id="UpPageButton", control_type="Button") | | | | | | | | | | | | Thumb - '位置' (L928, T438, R949, B492) | | | | | | ['位置Thumb', 'Thumb', '位置', '位置Thumb0', '位置Thumb1', 'Thumb0', 'Thumb1', '位置0', '位置1'] | | | | | | child_window(title="位置", auto_id="ScrollbarThumb", control_type="Thumb") | | | | | | | | | | | | Button - '向下翻页' (L928, T492, R949, B503) | | | | | | ['向下翻页', 'Button7', '向下翻页Button', '向下翻页0', '向下翻页1', '向下翻页Button0', '向下翻页Button1'] | | | | | | child_window(title="向下翻页", auto_id="DownPageButton", control_type="Button") | | | | | | | | | | | | Button - '下一行' (L928, T503, R949, B524) | | | | | | ['下一行', 'Button8', '下一行Button', '下一行0', '下一行1', '下一行Button0', '下一行Button1'] | | | | | | child_window(title="下一行", auto_id="DownButton", control_type="Button") | | | | | | | | | | TreeItem - '桌面' (L0, T0, R0, B0) | | | | | ['桌面TreeItem', '桌面', 'TreeItem', 'TreeItem0', 'TreeItem1'] | | | | | child_window(title="桌面", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '主文件夹' (L0, T0, R0, B0) | | | | | | ['主文件夹TreeItem', '主文件夹', 'TreeItem2'] | | | | | | child_window(title="主文件夹", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '图库' (L0, T0, R0, B0) | | | | | | ['图库', '图库TreeItem', 'TreeItem3'] | | | | | | child_window(title="图库", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '快速访问开始 - 桌面 (已固定)' (L0, T0, R0, B0) | | | | | | ['快速访问开始 - 桌面 (已固定)', 'TreeItem4', '快速访问开始 - 桌面 (已固定)TreeItem'] | | | | | | child_window(title="快速访问开始 - 桌面 (已固定)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '下载 (已固定)' (L0, T0, R0, B0) | | | | | | ['下载 (已固定)TreeItem', 'TreeItem5', '下载 (已固定)'] | | | | | | child_window(title="下载 (已固定)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '文档 (已固定)' (L0, T0, R0, B0) | | | | | | ['文档 (已固定)TreeItem', '文档 (已固定)', 'TreeItem6'] | | | | | | child_window(title="文档 (已固定)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '图片 (已固定)' (L0, T0, R0, B0) | | | | | | ['图片 (已固定)TreeItem', '图片 (已固定)', 'TreeItem7'] | | | | | | child_window(title="图片 (已固定)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '音乐 (已固定)' (L0, T0, R0, B0) | | | | | | ['音乐 (已固定)', '音乐 (已固定)TreeItem', 'TreeItem8'] | | | | | | child_window(title="音乐 (已固定)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '视频 (已固定)' (L0, T0, R0, B0) | | | | | | ['视频 (已固定)', '视频 (已固定)TreeItem', 'TreeItem9'] | | | | | | child_window(title="视频 (已固定)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '算法测试数据' (L0, T0, R0, B0) | | | | | | ['算法测试数据', '算法测试数据TreeItem', 'TreeItem10'] | | | | | | child_window(title="算法测试数据", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '福田' (L0, T0, R0, B0) | | | | | | ['福田', '福田TreeItem', 'TreeItem11'] | | | | | | child_window(title="福田", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '恩龙' (L0, T0, R0, B0) | | | | | | ['TreeItem12', '恩龙TreeItem', '恩龙'] | | | | | | child_window(title="恩龙", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '快速访问结束 - Demo' (L0, T0, R0, B0) | | | | | | ['快速访问结束 - Demo', '快速访问结束 - DemoTreeItem', 'TreeItem13'] | | | | | | child_window(title="快速访问结束 - Demo", control_type="TreeItem") | | | | | | | | | | | | TreeItem - 'WPS云盘' (L820, T317, R887, B357) | | | | | | ['WPS云盘TreeItem', 'WPS云盘', 'TreeItem14'] | | | | | | child_window(title="WPS云盘", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '此电脑' (L820, T357, R869, B397) | | | | | | ['此电脑', '此电脑TreeItem', 'TreeItem15', '此电脑0', '此电脑1'] | | | | | | child_window(title="此电脑", control_type="TreeItem") | | | | | | | | | | | | | | TreeItem - 'Windows (C:)' (L830, T397, R928, B437) | | | | | | | ['TreeItem16', 'Windows (C:)TreeItem', 'Windows (C:)'] | | | | | | | child_window(title="Windows (C:)", control_type="TreeItem") | | | | | | | | | | | | | | TreeItem - 'Data (D:)' (L830, T437, R896, B477) | | | | | | | ['Data (D:)TreeItem', 'Data (D:)', 'TreeItem17', 'Data (D:)0', 'Data (D:)1'] | | | | | | | child_window(title="Data (D:)", control_type="TreeItem") | | | | | | | | | | | | TreeItem - '网络' (L820, T477, R854, B517) | | | | | | ['网络', '网络TreeItem', 'TreeItem18'] | | | | | | child_window(title="网络", control_type="TreeItem") | | | | | | Pane - 'Shell 文件夹视图' (L954, T277, R1696, B524) | | | ['Shell 文件夹视图', 'Shell 文件夹视图Pane', 'Pane3'] | | | child_window(title="Shell 文件夹视图", auto_id="listview", control_type="Pane") | | | | | | | | ListBox - '项目视图' (L954, T277, R1696, B524) | | | | ['ListBox', '项目视图ListBox', '项目视图'] | | | | child_window(title="项目视图", control_type="List") | | | | | | | | | | ScrollBar - '水平' (L954, T503, R1675, B524) | | | | | ['水平', 'ScrollBar2', '水平ScrollBar'] | | | | | child_window(title="水平", auto_id="HorizontalScrollBar", control_type="ScrollBar") | | | | | | | | | | | | Button - '左移一列' (L954, T503, R975, B524) | | | | | | ['Button9', '左移一列Button', '左移一列'] | | | | | | child_window(title="左移一列", auto_id="UpButton", control_type="Button") | | | | | | | | | | | | Thumb - '位置' (L975, T503, R1600, B524) | | | | | | ['位置Thumb2', 'Thumb2', '位置2'] | | | | | | child_window(title="位置", auto_id="ScrollbarThumb", control_type="Thumb") | | | | | | | | | | | | Button - '向右翻页' (L1600, T503, R1654, B524) | | | | | | ['向右翻页', '向右翻页Button', 'Button10'] | | | | | | child_window(title="向右翻页", auto_id="DownPageButton", control_type="Button") | | | | | | | | | | | | Button - '右移一列' (L1654, T503, R1675, B524) | | | | | | ['右移一列Button', 'Button11', '右移一列'] | | | | | | child_window(title="右移一列", auto_id="DownButton", control_type="Button") | | | | | | | | | | ScrollBar - '垂直' (L1675, T277, R1696, B503) | | | | | ['垂直', '垂直ScrollBar', 'ScrollBar3'] | | | | | child_window(title="垂直", auto_id="VerticalScrollBar", control_type="ScrollBar") | | | | | | | | | | | | Button - '上一行' (L1675, T277, R1696, B298) | | | | | | ['上一行2', '上一行Button2', 'Button12'] | | | | | | child_window(title="上一行", auto_id="UpButton", control_type="Button") | | | | | | | | | | | | Thumb - '位置' (L1675, T298, R1696, B365) | | | | | | ['位置Thumb3', 'Thumb3', '位置3'] | | | | | | child_window(title="位置", auto_id="ScrollbarThumb", control_type="Thumb") | | | | | | | | | | | | Button - '向下翻页' (L1675, T365, R1696, B482) | | | | | | ['向下翻页2', 'Button13', '向下翻页Button2'] | | | | | | child_window(title="向下翻页", auto_id="DownPageButton", control_type="Button") | | | | | | | | | | | | Button - '下一行' (L1675, T482, R1696, B503) | | | | | | ['下一行2', 'Button14', '下一行Button2'] | | | | | | child_window(title="下一行", auto_id="DownButton", control_type="Button") | | | | | | | | | | Header - '标题' (L954, T277, R1737, B309) | | | | | ['标题', 'Header', '标题Header'] | | | | | child_window(title="标题", control_type="Header") | | | | | | | | | | | | SplitButton - '名称' (L954, T277, R1294, B309) | | | | | | ['名称', '名称SplitButton', 'SplitButton2'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="SplitButton") | | | | | | | | | | | | | | Button - '筛选器下拉列表' (L1274, T277, R1293, B309) | | | | | | | ['筛选器下拉列表Button', 'Button15', '筛选器下拉列表', '筛选器下拉列表Button0', '筛选器下拉列表Button1', '筛选器下拉列表0', '筛选器下拉列表1'] | | | | | | | child_window(title="筛选器下拉列表", auto_id="DropDown", control_type="Button") | | | | | | | | | | | | SplitButton - '修改日期' (L1294, T277, R1474, B309) | | | | | | ['修改日期', 'SplitButton3', '修改日期SplitButton'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="SplitButton") | | | | | | | | | | | | | | Button - '筛选器下拉列表' (L1454, T277, R1473, B309) | | | | | | | ['筛选器下拉列表Button2', 'Button16', '筛选器下拉列表2'] | | | | | | | child_window(title="筛选器下拉列表", auto_id="DropDown", control_type="Button") | | | | | | | | | | | | SplitButton - '类型' (L1474, T277, R1624, B309) | | | | | | ['类型SplitButton', '类型', 'SplitButton4'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="SplitButton") | | | | | | | | | | | | | | Button - '筛选器下拉列表' (L1604, T277, R1623, B309) | | | | | | | ['筛选器下拉列表Button3', 'Button17', '筛选器下拉列表3'] | | | | | | | child_window(title="筛选器下拉列表", auto_id="DropDown", control_type="Button") | | | | | | | | | | | | SplitButton - '大小' (L1624, T277, R1724, B309) | | | | | | ['SplitButton5', '大小SplitButton', '大小'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="SplitButton") | | | | | | | | | | | | | | Button - '筛选器下拉列表' (L1704, T277, R1723, B309) | | | | | | | ['筛选器下拉列表Button4', 'Button18', '筛选器下拉列表4'] | | | | | | | child_window(title="筛选器下拉列表", auto_id="DropDown", control_type="Button") | | | | | | | | | | ListItem - '.idea' (L972, T317, R1719, B348) | | | | | ['ListItem', '.idea', '.ideaListItem', 'ListItem0', 'ListItem1'] | | | | | child_window(title=".idea", auto_id="0", control_type="ListItem") | | | | | | | | | | | | Edit - '名称' (L1000, T321, R1294, B345) | | | | | | ['Edit', 'Edit0', 'Edit1'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="Edit") | | | | | | | | | | | | Edit - '修改日期' (L1294, T321, R1474, B345) | | | | | | ['Edit2'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="Edit") | | | | | | | | | | | | Edit - '类型' (L1474, T321, R1624, B345) | | | | | | ['Edit3'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="Edit") | | | | | | | | | | | | Edit - '大小' (L1624, T321, R1724, B345) | | | | | | ['Edit4'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="Edit") | | | | | | | | | | ListItem - '.lingma' (L972, T354, R1719, B385) | | | | | ['.lingma', 'ListItem2', '.lingmaListItem'] | | | | | child_window(title=".lingma", auto_id="1", control_type="ListItem") | | | | | | | | | | | | Edit - '名称' (L1000, T358, R1294, B382) | | | | | | ['Edit5'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="Edit") | | | | | | | | | | | | Edit - '修改日期' (L1294, T358, R1474, B382) | | | | | | ['Edit6'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="Edit") | | | | | | | | | | | | Edit - '类型' (L1474, T358, R1624, B382) | | | | | | ['Edit7'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="Edit") | | | | | | | | | | | | Edit - '大小' (L1624, T358, R1724, B382) | | | | | | ['Edit8'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="Edit") | | | | | | | | | | ListItem - '__pycache__' (L972, T391, R1719, B422) | | | | | ['ListItem3', '__pycache__ListItem', '__pycache__'] | | | | | child_window(title="__pycache__", auto_id="2", control_type="ListItem") | | | | | | | | | | | | Edit - '名称' (L1000, T395, R1294, B419) | | | | | | ['Edit9'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="Edit") | | | | | | | | | | | | Edit - '修改日期' (L1294, T395, R1474, B419) | | | | | | ['Edit10'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="Edit") | | | | | | | | | | | | Edit - '类型' (L1474, T395, R1624, B419) | | | | | | ['Edit11'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="Edit") | | | | | | | | | | | | Edit - '大小' (L1624, T395, R1724, B419) | | | | | | ['Edit12'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="Edit") | | | | | | | | | | ListItem - 'config' (L972, T428, R1719, B459) | | | | | ['ListItem4', 'configListItem', 'config'] | | | | | child_window(title="config", auto_id="3", control_type="ListItem") | | | | | | | | | | | | Edit - '名称' (L1000, T432, R1294, B456) | | | | | | ['Edit13'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="Edit") | | | | | | | | | | | | Edit - '修改日期' (L1294, T432, R1474, B456) | | | | | | ['Edit14'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="Edit") | | | | | | | | | | | | Edit - '类型' (L1474, T432, R1624, B456) | | | | | | ['Edit15'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="Edit") | | | | | | | | | | | | Edit - '大小' (L1624, T432, R1724, B456) | | | | | | ['Edit16'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="Edit") | | | | | | | | | | ListItem - 'framework' (L972, T465, R1719, B496) | | | | | ['ListItem5', 'frameworkListItem', 'framework'] | | | | | child_window(title="framework", auto_id="4", control_type="ListItem") | | | | | | | | | | | | Edit - '名称' (L1000, T469, R1294, B493) | | | | | | ['Edit17'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="Edit") | | | | | | | | | | | | Edit - '修改日期' (L1294, T469, R1474, B493) | | | | | | ['Edit18'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="Edit") | | | | | | | | | | | | Edit - '类型' (L1474, T469, R1624, B493) | | | | | | ['Edit19'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="Edit") | | | | | | | | | | | | Edit - '大小' (L1624, T469, R1724, B493) | | | | | | ['Edit20'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="Edit") | | | | | | | | | | ListItem - 'games' (L972, T502, R1719, B533) | | | | | ['gamesListItem', 'ListItem6', 'games'] | | | | | child_window(title="games", auto_id="5", control_type="ListItem") | | | | | | | | | | | | Edit - '名称' (L1000, T506, R1294, B530) | | | | | | ['Edit21'] | | | | | | child_window(title="名称", auto_id="System.ItemNameDisplay", control_type="Edit") | | | | | | | | | | | | Edit - '修改日期' (L1294, T506, R1474, B530) | | | | | | ['Edit22'] | | | | | | child_window(title="修改日期", auto_id="System.DateModified", control_type="Edit") | | | | | | | | | | | | Edit - '类型' (L1474, T506, R1624, B530) | | | | | | ['Edit23'] | | | | | | child_window(title="类型", auto_id="System.ItemTypeText", control_type="Edit") | | | | | | | | | | | | Edit - '大小' (L1624, T506, R1724, B530) | | | | | | ['Edit24'] | | | | | | child_window(title="大小", auto_id="System.Size", control_type="Edit") | | | | | | Static - '文件名:' (L767, T537, R911, B565) | | | ['Static', '文件名:Static', '文件名:', '文件名:0', '文件名:1', 'Static0', 'Static1'] | | | child_window(title="文件名:", auto_id="SaveDialogLabel", control_type="Text") | | | | | | ComboBox - '文件名:' (L911, T537, R1690, B565) | | | ['文件名:2', 'ComboBox', '文件名:ComboBox', 'ComboBox0', 'ComboBox1'] | | | child_window(title="文件名:", auto_id="FileNameControlHost", control_type="ComboBox") | | | | | | | | Edit - '文件名:' (L914, T540, R1666, B562) | | | | ['Edit25', '文件名:Edit'] | | | | child_window(title="文件名:", auto_id="1001", control_type="Edit") | | | | | | | | Button - '打开' (L1670, T538, R1689, B564) | | | | ['打开Button', 'Button19', '打开', '打开Button0', '打开Button1', '打开0', '打开1'] | | | | child_window(title="打开", auto_id="DropDown", control_type="Button") | | | | | | Static - '保存类型:' (L767, T568, R911, B596) | | | ['Static2', '保存类型:Static', '保存类型:', '保存类型:0', '保存类型:1'] | | | child_window(title="保存类型:", auto_id="SaveDialogLabel", control_type="Text") | | | | | | ComboBox - '保存类型:' (L911, T568, R1690, B596) | | | ['保存类型:ComboBox', '保存类型:2', 'ComboBox2'] | | | child_window(title="保存类型:", auto_id="FileTypeControlHost", control_type="ComboBox") | | | | | | | | Static - '' (L3, T3, R755, B25) | | | | ['Static3'] | | | | | | | | Button - '打开' (L1670, T569, R1689, B595) | | | | ['打开Button2', 'Button20', '打开2'] | | | | child_window(title="打开", auto_id="DropDown", control_type="Button") | | | | | | TreeView - '保存字段' (L767, T604, R1683, B643) | | | ['保存字段', '保存字段TreeView', 'TreeView2'] | | | child_window(title="保存字段", auto_id="SaveDialogPreviewMetadataInner", control_type="Tree") | | | | | | TreeView - '应用程序控件' (L0, T0, R0, B0) | | | ['应用程序控件TreeView', '应用程序控件', 'TreeView3'] | | | child_window(title="应用程序控件", auto_id="AppControlsModuleInner", control_type="Tree") | | | | Toolbar - '' (L764, T679, R879, B705) | | ['保存类型:Toolbar', 'Toolbar2'] | | | | | | Button - '隐藏文件夹' (L764, T679, R867, B705) | | | ['隐藏文件夹Button', 'Button21', '隐藏文件夹'] | | | child_window(title="隐藏文件夹", control_type="Button") | | | | CheckBox - '追加扩展名' (L1235, T677, R1423, B700) | | ['追加扩展名CheckBox', 'CheckBox', '追加扩展名'] | | child_window(title="追加扩展名", control_type="CheckBox") | | | | Button - '保存(S)' (L1438, T672, R1548, B705) | | ['保存(S)', '保存(S)Button', 'Button22'] | | child_window(title="保存(S)", auto_id="1", control_type="Button") | | | | Button - '取消' (L1563, T672, R1673, B705) | | ['取消Button', '取消', 'Button23'] | | child_window(title="取消", auto_id="2", control_type="Button") | | | | Thumb - '' (L1675, T705, R1696, B726) | | ['Thumb4', '保存类型:Thumb'] | | | | Pane - '' (L754, T173, R1696, B238) | | ['Pane4'] | | child_window(auto_id="40965", control_type="Pane") | | | | | | Pane - '' (L754, T182, R880, B226) | | | ['Pane5'] | | | | | | | | Toolbar - '导航按钮' (L759, T185, R880, B226) | | | | ['导航按钮', '导航按钮Toolbar', 'Toolbar3'] | | | | child_window(title="导航按钮", control_type="ToolBar") | | | | | | | | | | Button - '后退 (Alt + 向左键)' (L759, T185, R803, B226) | | | | | ['后退 (Alt + 向左键)Button', '后退 (Alt + 向左键)', 'Button24'] | | | | | child_window(title="后退 (Alt + 向左键)", control_type="Button") | | | | | | | | | | Button - '前进 (Alt + 向右键)' (L803, T185, R847, B226) | | | | | ['前进 (Alt + 向右键)Button', 'Button25', '前进 (Alt + 向右键)'] | | | | | child_window(title="前进 (Alt + 向右键)", control_type="Button") | | | | | | | | | | Button - '最近浏览的位置' (L847, T185, R873, B226) | | | | | ['最近浏览的位置Button', '最近浏览的位置', 'Button26'] | | | | | child_window(title="最近浏览的位置", control_type="Button") | | | | | | Pane - '' (L880, T181, R925, B226) | | | ['Pane6'] | | | | | | | | Toolbar - '上区段' (L880, T185, R925, B230) | | | | ['上区段', 'Toolbar4', '上区段Toolbar'] | | | | child_window(title="上区段", control_type="ToolBar") | | | | | | | | | | Button - '上移到“Data (D:)”(Alt + 向上键)' (L880, T185, R921, B226) | | | | | ['上移到“Data (D:)”(Alt + 向上键)', '上移到“Data (D:)”(Alt + 向上键)Button', 'Button27'] | | | | | child_window(title="上移到“Data (D:)”(Alt + 向上键)", control_type="Button") | | | | | | Pane - '' (L925, T173, R1420, B235) | | | ['Pane7'] | | | child_window(auto_id="41477", control_type="Pane") | | | | | | | | Progress - '正在加载' (L927, T183, R1418, B227) | | | | ['正在加载', 'Progress', '正在加载Progress'] | | | | child_window(title="正在加载", control_type="ProgressBar") | | | | | | | | | | Pane - '' (L927, T183, R1324, B227) | | | | | ['Pane8'] | | | | | | | | | | | | Toolbar - '地址: D:\Demo' (L935, T183, R1324, B227) | | | | | | ['地址: D:\\Demo', 'Toolbar5', '地址: D:\\DemoToolbar'] | | | | | | child_window(title="地址: D:\Demo", auto_id="1001", control_type="ToolBar") | | | | | | | | | | | | | | SplitButton - '所有位置' (L935, T183, R978, B226) | | | | | | | ['所有位置SplitButton', 'SplitButton6', '所有位置'] | | | | | | | child_window(title="所有位置", control_type="SplitButton") | | | | | | | | | | | | | | SplitButton - '此电脑' (L978, T183, R1050, B226) | | | | | | | ['此电脑2', '此电脑SplitButton', 'SplitButton7'] | | | | | | | child_window(title="此电脑", control_type="SplitButton") | | | | | | | | | | | | | | SplitButton - 'Data (D:)' (L1050, T183, R1139, B226) | | | | | | | ['SplitButton8', 'Data (D:)SplitButton', 'Data (D:)2'] | | | | | | | child_window(title="Data (D:)", control_type="SplitButton") | | | | | | | | | | | | | | SplitButton - 'Demo' (L1139, T183, R1210, B226) | | | | | | | ['\u200eDemoSplitButton', 'SplitButton9', '\u200eDemo'] | | | | | | | child_window(title="Demo", control_type="SplitButton") | | | | | | | | | | Toolbar - '地址区段' (L1324, T183, R1418, B227) | | | | | ['地址区段Toolbar', '地址区段', 'Toolbar6'] | | | | | child_window(title="地址区段", control_type="ToolBar") | | | | | | | | | | | | Button - '上一个位置' (L1324, T183, R1371, B230) | | | | | | ['上一个位置Button', 'Button28', '上一个位置'] | | | | | | child_window(title="上一个位置", control_type="Button") | | | | | | | | | | | | Button - '刷新“Demo”(F5)' (L1371, T183, R1418, B230) | | | | | | ['刷新“Demo”(F5)', 'Button29', '刷新“Demo”(F5)Button'] | | | | | | child_window(title="刷新“Demo”(F5)", control_type="Button") | | | | | | Pane - '' (L1424, T203, R1430, B204) | | | ['Pane9'] | | | | | | Pane - '' (L1430, T179, R1685, B229) | | | ['Pane10'] | | | | | | | | Pane - '' (L1430, T182, R1685, B228) | | | | ['Pane11'] | | | | | | | | | | Pane - '' (L1435, T182, R1680, B228) | | | | | ['Pane12'] | | | | | | | | | | | | Edit - '\r' (L1437, T195, R1635, B215) | | | | | | ['Edit26'] | | | | | | child_window(title="\r", auto_id="SearchEditBox", control_type="Edit") | | | | | | | | | | | | Button - '搜索' (L1639, T182, R1677, B228) | | | | | | ['Button30', '搜索', '搜索Button'] | | | | | | child_window(title="搜索", auto_id="SearchBoxSearchButton", control_type="Button") | | | | | | Pane - '' (L1689, T203, R1696, B204) | | | ['Pane13'] | | | | TitleBar - '' (L774, T138, R1696, B173) | | ['TitleBar', 'TitleBar0', 'TitleBar1'] | | | | | | Menu - '系统' (L603, T115, R625, B137) | | | ['Menu', '系统', '系统Menu', '系统0', '系统1', 'Menu0', 'Menu1', '系统Menu0', '系统Menu1'] | | | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar") | | | | | | | | MenuItem - '系统' (L603, T115, R625, B137) | | | | ['系统2', '系统MenuItem', 'MenuItem', '系统MenuItem0', '系统MenuItem1', 'MenuItem0', 'MenuItem1'] | | | | child_window(title="系统", control_type="MenuItem") | | | | | | Button - '关闭' (L1653, T136, R1697, B173) | | | ['关闭Button', '关闭', 'Button31', '关闭Button0', '关闭Button1', '关闭0', '关闭1'] | | | child_window(title="关闭", control_type="Button") | | Pane - '北京-宏哥' (L2, T115, R1918, B989) | ['北京-宏哥Pane', '北京-宏哥', 'Pane14'] | child_window(title="北京-宏哥", control_type="Pane") | | TabControl - 'Tab' (L0, T83, R1920, B991) | ['TabControl', 'TabTabControl', 'Tab'] | child_window(title="Tab", control_type="Tab") | | | | TabItem - '新文件 1' (L2, T85, R112, B113) | | ['新文件 1', 'TabItem', '新文件 1TabItem'] | | child_window(title="新文件 1", control_type="TabItem") | | StatusBar - '' (L0, T991, R1920, B1020) | ['Normal text fileStatusBar', 'StatusBar'] | | | | Static - 'Normal text file' (L0, T993, R974, B1020) | | ['Static4', 'Normal text file', 'Normal text fileStatic'] | | child_window(title="Normal text file", control_type="Text") | | | | Static - 'length : 13 lines : 1' (L976, T993, R1249, B1020) | | ['length : 13 lines : 1Static', 'Static5', 'length : 13 lines : 1'] | | child_window(title="length : 13 lines : 1", control_type="Text") | | | | Static - 'Ln : 1 Col : 6 Pos : 14' (L1251, T993, R1574, B1020) | | ['Static6', 'Ln : 1 Col : 6 Pos : 14Static', 'Ln : 1 Col : 6 Pos : 14'] | | child_window(title="Ln : 1 Col : 6 Pos : 14", control_type="Text") | | | | Static - 'Windows (CR LF)' (L1576, T993, R1712, B1020) | | ['Static7', 'Windows (CR LF)Static', 'Windows (CR LF)'] | | child_window(title="Windows (CR LF)", control_type="Text") | | | | Static - 'UTF-8' (L1714, T993, R1862, B1020) | | ['Static8', 'UTF-8', 'UTF-8Static'] | | child_window(title="UTF-8", control_type="Text") | | | | Static - 'INS' (L1864, T993, R1900, B1020) | | ['Static9', 'INSStatic', 'INS'] | | child_window(title="INS", control_type="Text") | | Pane - '' (L0, T54, R1920, B83) | ['Pane15'] | | | | Toolbar - '' (L2, T54, R1920, B83) | | ['Toolbar7'] | | | | | | Button - '' (L2, T54, R29, B80) | | | ['Button32'] | | | | | | Button - '' (L29, T54, R56, B80) | | | ['Button33'] | | | | | | Button - '' (L56, T54, R83, B80) | | | ['Button34'] | | | | | | Button - '' (L83, T54, R110, B80) | | | ['Button35'] | | | | | | Button - '' (L110, T54, R137, B80) | | | ['Button36'] | | | | | | Button - '' (L137, T54, R164, B80) | | | ['Button37'] | | | | | | Button - '' (L164, T54, R191, B80) | | | ['Button38'] | | | | | | Button - '' (L199, T54, R226, B80) | | | ['Button39'] | | | | | | Button - '' (L226, T54, R253, B80) | | | ['Button40'] | | | | | | Button - '' (L253, T54, R280, B80) | | | ['Button41'] | | | | | | Button - '' (L288, T54, R315, B80) | | | ['Button42'] | | | | | | Button - '' (L315, T54, R342, B80) | | | ['Button43'] | | | | | | Button - '' (L350, T54, R377, B80) | | | ['Button44'] | | | | | | Button - '' (L377, T54, R404, B80) | | | ['Button45'] | | | | | | Button - '' (L412, T54, R439, B80) | | | ['Button46'] | | | | | | Button - '' (L439, T54, R466, B80) | | | ['Button47'] | | | | | | Button - '' (L474, T54, R501, B80) | | | ['Button48'] | | | | | | Button - '' (L501, T54, R528, B80) | | | ['Button49'] | | | | | | Button - '' (L536, T54, R563, B80) | | | ['Button50'] | | | | | | Button - '' (L563, T54, R590, B80) | | | ['Button51'] | | | | | | Button - '' (L590, T54, R617, B80) | | | ['Button52'] | | | | | | Button - '' (L617, T54, R644, B80) | | | ['Button53'] | | | | | | Button - '' (L644, T54, R671, B80) | | | ['Button54'] | | | | | | Button - '' (L671, T54, R698, B80) | | | ['Button55'] | | | | | | Button - '' (L698, T54, R725, B80) | | | ['Button56'] | | | | | | Button - '' (L725, T54, R752, B80) | | | ['Button57'] | | | | | | Button - '' (L752, T54, R779, B80) | | | ['Button58'] | | | | | | Button - '' (L787, T54, R814, B80) | | | ['Button59'] | | | | | | Button - '' (L814, T54, R841, B80) | | | ['Button60'] | | | | | | Button - '' (L841, T54, R868, B80) | | | ['Button61'] | | | | | | Button - '' (L868, T54, R895, B80) | | | ['Button62'] | | | | | | Button - '' (L895, T54, R922, B80) | | | ['Button63'] | | | | | | Button - '' (L930, T54, R957, B80) | | | ['Button64'] | | | | | | Button - '' (L957, T54, R984, B80) | | | ['Button65'] | | | | | | Button - '' (L984, T54, R1011, B80) | | | ['Button66'] | | | | | | Button - '' (L1011, T54, R1038, B80) | | | ['Button67'] | | | | | | Button - '' (L1038, T54, R1065, B80) | | | ['Button68'] | | | | | | Button - '' (L1065, T54, R1092, B80) | | | ['Button69'] | | | | | | Button - '' (L1092, T54, R1119, B80) | | | ['Button70'] | | | | | | Button - '' (L1119, T54, R1146, B80) | | | ['Button71'] | | TitleBar - '' (L20, T-6, R1920, B29) | ['TitleBar2'] | | | | Menu - '系统' (L0, T0, R22, B22) | | ['Menu2', '系统3', '系统Menu2'] | | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar") | | | | | | MenuItem - '系统' (L0, T0, R22, B22) | | | ['系统4', '系统MenuItem2', 'MenuItem2'] | | | child_window(title="系统", control_type="MenuItem") | | | | Button - '最小化' (L1740, T0, R1800, B28) | | ['Button72', '最小化', '最小化Button'] | | child_window(title="最小化", control_type="Button") | | | | Button - '还原' (L1800, T0, R1859, B28) | | ['还原', 'Button73', '还原Button'] | | child_window(title="还原", control_type="Button") | | | | Button - '关闭' (L1859, T0, R1920, B28) | | ['关闭Button2', '关闭2', 'Button74'] | | child_window(title="关闭", control_type="Button") | | Menu - '应用程序' (L0, T23, R1536, B42) | ['Menu3', '应用程序', '应用程序Menu'] | child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar") | | | | MenuItem - '文件(F)' (L0, T23, R53, B42) | | ['MenuItem3', '文件(F)MenuItem', '文件(F)'] | | child_window(title="文件(F)", control_type="MenuItem") | | | | MenuItem - '编辑(E)' (L53, T23, R106, B42) | | ['编辑(E)', '编辑(E)MenuItem', 'MenuItem4'] | | child_window(title="编辑(E)", control_type="MenuItem") | | | | MenuItem - '搜索(S)' (L106, T23, R160, B42) | | ['搜索(S)MenuItem', 'MenuItem5', '搜索(S)'] | | child_window(title="搜索(S)", control_type="MenuItem") | | | | MenuItem - '视图(V)' (L159, T23, R213, B42) | | ['视图(V)MenuItem', '视图(V)', 'MenuItem6'] | | child_window(title="视图(V)", control_type="MenuItem") | | | | MenuItem - '编码(N)' (L214, T23, R270, B42) | | ['编码(N)MenuItem', '编码(N)', 'MenuItem7'] | | child_window(title="编码(N)", control_type="MenuItem") | | | | MenuItem - '语言(L)' (L270, T23, R323, B42) | | ['语言(L)', '语言(L)MenuItem', 'MenuItem8'] | | child_window(title="语言(L)", control_type="MenuItem") | | | | MenuItem - '设置(T)' (L322, T23, R376, B42) | | ['设置(T)MenuItem', '设置(T)', 'MenuItem9'] | | child_window(title="设置(T)", control_type="MenuItem") | | | | MenuItem - '工具(O)' (L376, T23, R432, B42) | | ['工具(O)MenuItem', '工具(O)', 'MenuItem10'] | | child_window(title="工具(O)", control_type="MenuItem") | | | | MenuItem - '宏(M)' (L432, T23, R478, B42) | | ['宏(M)', '宏(M)MenuItem', 'MenuItem11'] | | child_window(title="宏(M)", control_type="MenuItem") | | | | MenuItem - '运行(R)' (L478, T23, R532, B42) | | ['运行(R)MenuItem', '运行(R)', 'MenuItem12'] | | child_window(title="运行(R)", control_type="MenuItem") | | | | MenuItem - '插件(P)' (L533, T23, R587, B42) | | ['插件(P)MenuItem', '插件(P)', 'MenuItem13'] | | child_window(title="插件(P)", control_type="MenuItem") | | | | MenuItem - '窗口(W)' (L586, T23, R644, B42) | | ['窗口(W)', '窗口(W)MenuItem', 'MenuItem14'] | | child_window(title="窗口(W)", control_type="MenuItem") | | | | MenuItem - '?' (L645, T23, R665, B42) | | ['?MenuItem', '?', 'MenuItem15'] | | child_window(title="?", control_type="MenuItem") | | | | MenuItem - 'X' (L1514, T23, R1536, B42) | | ['X', 'MenuItem16', 'XMenuItem'] | | child_window(title="X", control_type="MenuItem") Process finished with exit code 0
从上边的内容中,找到【文件名】和【保存】备用。
3.3代码设计

3.4参考代码
# -*- coding:utf-8 -*- # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 # 2.注释:包括记录创建时间,创建人,项目名称。 ''' Created on 2025-05-06 @author: 北京-宏哥 北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!) Project: PC端自动化测试实战教程-10-pywinauto操作弹出文件选择框 (详细教程) ''' # 3.导入模块 from pywinauto import Application import time app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe") win = app['新文件 1 - Notepad++'] win.type_keys("北京-宏哥") win.child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar") # # 文件-另存为 win.menu_select('文件(F) -> 另存为(A)...') # 等待另存为窗口出现 win.child_window(title="另存为", control_type="Window").wait('ready', timeout=5) # # 输入文件名称 win.child_window(title="文件名:", control_type="Edit").type_keys("北京宏哥.txt") win.print_ctrl_ids() # # 保存 win.child_window(title="保存(S)", control_type="Button").click()
3.5运行代码
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的动作(与测试场景一致)。如下图所示:

3.文件会默认保存到代码项目的根目录,查看如下图所示:

4.小结
4.1常见问题与优化
-
控件定位失败
- 使用
print_control_identifiers()输出所有控件信息辅助调试。 - 调整
backend参数("win32"或"uia")适配不同应用。
- 使用
-
异步弹窗延迟
添加显式等待逻辑:save_dialog.wait("visible", timeout=10) -
跨系统版本兼容性
不同 Windows 版本可能调整弹窗控件结构,需针对性测试。
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角 “推荐” 按钮,您的
本文版权归作者和博客园共有,来源网址: https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
公众号(关注宏哥)                               微信群(扫码进群)                                       客服微信

浙公网安备 33010602011771号