首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PC端自动化测试实战教程-5-pywinauto 操作PC端应用程序窗口 - 下篇(详细教程)

PC端自动化测试实战教程-5-pywinauto 操作PC端应用程序窗口 - 下篇(详细教程)

作者头像
北京-宏哥
发布于 2025-05-09 00:04:59
发布于 2025-05-09 00:04:59
25700
代码可运行
举报
文章被收录于专栏:北京宏哥北京宏哥
运行总次数:0
代码可运行

1.简介

上一篇宏哥主要讲解和介绍了如何获取PC端应用程序窗口信息和如何连接窗口对其进行操作的常用的几种方法。今天宏哥接着讲解和分享一下窗口的基本操作:最大化、最小化、恢复正常、关闭窗口、获取窗口状态和获取窗口坐标。以及窗口的其他打开方法和选择方法。

2.窗口的基本操作

窗口的一些基本操作方法:

  • 最大化 :w.maximize()
  • 最小化 :w.minimize()
  • 恢复正常 :w.restore()
  • 关闭窗口: w.close()
  • 获取窗口状态: w.get_show_state() 返回1 最大化, 0正常,2最小化
  • 获取窗口坐标: w.rectangle() 返回 (L35, T149, R1544, B913)
2.1代码设计
2.2参考代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-

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

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

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

# 通过窗口打开
app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe")
app = Application('uia').connect(class_name="Notepad++")
# win = app['窗口的标题']
win = app['新文件1 - Notepad++']
win.type_keys("北京-宏哥")
time.sleep(2)
win.maximize()   # 最大化
time.sleep(2)
win.restore()    # 恢复
time.sleep(2)
win.minimize()   # 最小化
# win.close()      # 关闭
2.3运行代码

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

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

3.窗口打开方法

前面是通过窗口的的标题操作打开的窗口,再介绍一个最简单的方法是top_window(),例如:宏哥这里还是演示打开notepad++编辑器。

3.1代码设计
3.2参考代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-

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

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

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

from pywinauto import Application
import time
app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe")
# time.sleep(3)
dlg = app.top_window()
print(dlg)
3.3运行代码

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

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

以上方法将返回具有应用程序顶级窗口的最高顺序的窗口。

注意: 它返回的是是应用程序的顶级窗口,如果窗口有覆盖的情况,那么你可以使用与传递给findwindows.find_windows()相同的参数,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dlg = app.window(title_re="Page Setup", class_name="#32770")

如果对话框的标题很长 - 那么输入的属性访问可能会很长,在这种情况下通常更容易使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.window(title_re=".*部分标题.*") 

获取当前应用全部windows

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dialogs = app.windows() 

这将返回应用程序的所有可见,启用的顶级窗口的列表。

总结:推荐使用 app.window(title_re="xxx") 方法操作指定窗口。

4.小结

 4.1遇到的坑

在演示的过程中,想必细心的小伙伴或者童鞋们已经发现宏哥代码在窗口最小化之后,将窗口关闭的代码注释掉了,这是因为宏哥在演示的时候,直接报错:pywinauto.findbestmatch.MatchError: Could not find '新文件1 - Notepad++' in 'dict_keys([])',本来宏哥觉得最小化之后,加上一段恢复窗口,再关闭就可以了,结果还是报一样的错误。因为一时没有好的解决办法,由于时间的关系,宏哥就将那段关闭窗口的代码注释掉了。如下图所示:

解决办法:经过查找资料和百度还是没有什么好的解决办法,宏哥突然想到之前文章中提到过的访问技术是否正确,uia报错,就换win32。否则就会报错找不到元素。因此宏哥抱着试一下心态,结果成功了。

4.1.1代码设计
4.1.2参考代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-

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

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

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

# 通过窗口打开
app = Application('win32').start("D:/software/Notepad/Notepad++/notepad++.exe")
app = Application('win32').connect(class_name="Notepad++")
# win = app['窗口的标题']
win = app['新文件1 - Notepad++']
win.type_keys("北京-宏哥")
time.sleep(2)
win.maximize()   # 最大化
time.sleep(2)
win.restore()    # 恢复
time.sleep(2)
win.minimize()   # 最小化
win.restore()    # 恢复
win.close()      # 关闭
4.1.3运行代码

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

2.运行代码后电脑端的动作(正常运行,由告警是32位和64位python的告警)。如下图所示:

4.2pywinauto 中的uia是什么意思?

在pywinauto库中,uia指的是UI Automation,这是Windows操作系统提供的一种技术框架,用于实现用户界面(UI)的自动化测试和辅助功能访问。UI Automation是微软从Windows Vista开始引入的核心技术,旨在为所有UI元素提供一致的编程接口,无论这些元素是由何种技术(如Win32、WPF、UWP等)实现的。

在pywinauto中,通过指定backend="uia",用户可以选择使用UI Automation作为底层引擎来与应用程序的UI元素进行交互。这为自动化测试提供了更广泛的支持,尤其是在处理现代Windows应用(尤其是使用WPF和UWP技术构建的应用)时更为有效。UI Automation后端相比传统的win32后端,提供了更丰富和高级的元素属性、控制模式(Control Patterns)以及事件支持,使得自动化脚本可以更加灵活和强大。

使用UI Automation后端,开发者可以更容易地定位和操作UI元素,如获取元素的属性、模拟鼠标和键盘操作、监听UI事件等,这对于创建复杂的自动化测试场景尤其有用。

好了,关于 操作PC端应用程序窗口基本操作非常简单,时间不早了今天就分享到这里,感谢你耐心地阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
c# 检测cpu使用率[测试通过]
创建一个控制台应用程序,代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; //引用2命名空间 using System.Diagnostics; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] a
磊哥
2018/04/26
2K0
C#用于对用户输入数据进行校验的类
这个C#类包含了各种常用数据验证的函数,包含验证是否是数字,校验email格式,区分中英文截取字符串,区分中英文计算字符串长度,检测是否包含中文字符,判断是否包含特定字符等
用户7108768
2021/11/02
2.4K0
[C#] 常用工具类——文件操作类
/// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在</para> /// <para> IsImgFilename:判断文件名是否为浏览器可以直接显示的图片文件名</para> /// <para> CopyFiles:复制指定目录的所有文件</para> /// <para> MoveFiles:移动指定目录的所有文件</para> /// <para> D
跟着阿笨一起玩NET
2018/09/19
2.8K0
C#操作json的通用帮助类
using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Reflection; using System.Data.Common; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Runtime.Serialization.Jso
用户7108768
2021/11/02
1.5K0
C#利用SharpZipLib生成压缩包
SharpZipLib是一个开源的C#压缩解压库,应用非常广泛。就像用ADO.NET操作数据库要打开连接、执行命令、关闭连接等多个步骤一样,用SharpZipLib进行压缩和解压也需要多个步骤。SharpZipLib功能比较强大,在很多C#的应用中,都有它的身影,我们可以通过引入SharpZipLib类库文件,在程序中实现自动压缩文件以及解压缩文件的功能,例如一个常见的情景就是用户客户端程序下载更新包,下载完成之后,在本地自动解压文件。
郑子铭
2023/02/12
9550
C#利用SharpZipLib生成压缩包
C#常用工具类——Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> /// <para> CreateConnection:根据Excel文件路径和EXCEL驱动版本生成OleConnection对象实例</para> /// <para> ExecuteDataSet:执行一条SQL语句,返回一个DataSet对象</para> /// <para> ExecuteDa
跟着阿笨一起玩NET
2018/09/19
1.5K0
C#实现Excel模板导出和从Excel导入数据
      午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.
用户1055830
2018/01/18
4.5K0
C#实现Excel模板导出和从Excel导入数据
c#多选下拉框(ComboBox)
代码如下 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Drawing; 5 using System.Data; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Collections; 10 u
冰封一夏
2019/09/11
9K1
基于JQuery EasyUI的WebMVC控件封装(含源码)
  JQuery EasyUI类库,大家不会陌生,出来已经有很多年了。个人感觉还是很好用的,作者更新频率也很快,bug也及时修复。   最近在整理以前的代码,找到了这个组件,它是将EasyUI组件封装成MVC控件,这样我们就可以不用写那些html标签了,我们先看看调用方式 <form id="form1"> @Html.HiddenFor(c => c.ID) @Html.HiddenFor(c => c.EditMode) @Html.HiddenFor(c => c.CodeTy
用户1219352
2018/02/01
1.7K0
基于JQuery EasyUI的WebMVC控件封装(含源码)
[C# 开发技巧]如何防止程序多次运行
最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c03-ab25-d03544f5fcc9, 所以这里就记录下来,希望给遇到同样问题的朋友有所参考的,同时也是对自己的一个积累。在介绍具体实现代码之前,我们必须明确解决这个问题的思路是什么的?下面只要分享我的一个思考的这个问题的方式:
乔达摩@嘿
2020/09/11
2.4K0
[C# 开发技巧]如何防止程序多次运行
C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能
先不说如何实现,先来看看效果图: 读取远程的需要提供下远程的计算用户名和密码即可。 如何实现这个代码功能,请看如下代码部分: #region//获取日志文件 /// <summary>
逸鹏
2018/04/09
1K0
C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能
C#文件安全管理解析
彭泽0902
2018/01/04
1.7K0
C#操作操作类库五(字符串的常用扩展方法)
验证字符串是否由正负号(+-)、数字、小数点构成,并且最多只有一个小数点 验证字符串是否仅由[0-9]构成 验证字符串是否由字母和数字构成 验证是否为空字符串。若无需裁切两端空格,建议直接使用 String.IsNullOrEmpty(string) 裁切字符串(中文按照两个字符计算) 裁切字符串(中文按照两个字符计算,裁切前会先过滤 Html 标签) 过滤HTML标签 获取字符串长度。与string.Length不同的是,该方法将中文作 2 个字符计算。 将形如 10.1MB 格式对用户友好的文件大小字符
跟着阿笨一起玩NET
2018/09/18
8840
.NET常用的扩展方法整理
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; namespace IBO.XJMYQP.Utility { public static class Extens
跟着阿笨一起玩NET
2018/09/19
1.3K0
c# 自定义多选下拉列表2
以下为工作中遇到的,备注一下 先需要几个辅助类 1 #region GripBounds 2 3 using System.Drawing; 4 internal struct GripBounds 5 { 6 private const int GripSize = 6; 7 private const int CornerGripSize = GripSize << 1; 8 9 public GripBounds(Rectangle cl
冰封一夏
2019/09/11
3.1K0
C# 关于进程回收管理的一款工具设计与分享
在使用 COM 模式操作 OFFICE 组件的开发过程中,当操作完相关文档后,在某些情况下仍然无法释放掉 Word 或 EXCEL 等应用进程,因此根据进程活动情况或时间点范围开发了一个强制杀掉指定进程名称的 WinForm 程序,做为一种辅助工具运行在云服务器上,命名为 Craneoffice ProcessGC。
初九之潜龙勿用
2024/06/20
1300
C# 关于进程回收管理的一款工具设计与分享
C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)
2013年搞公司的OA时,为了统一用户登录,将Windows AD的用户和OA的账号对接,OA用户名的规则就是使用Windows AD的用户名,格式举例:Troy.Cui,原理就是先进行域服务器的认证,认证完毕使用自定义的函数根据用户名读取出OA的用户信息,然后读取出用户名和密码信息,最后使用获取到的用户名和密码进行正常的登录。当时的文章:《C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)》,本周打算OA中开发在线培训的功能,也想借此机会升级一下底层的应用DotNet.Business和DotNet.Utilities,第一个要升级的项目就是这个Windows域账号登录。
崔文远TroyCui
2019/02/26
8270
C#设备处理类操作
C#对于处理window操作系统下的设备有天然的优势,对于大多数设备读写等操作来说基本上够了,这里只讨论通过普通的大多数的设备的操作。涉及到两大类SerialPort类,Socket的一些操作。不一定好,但希望分享出去,让更多的人受益。。
FreeTimeWorker
2020/08/31
6920
【愚公系列】2022年11月 .NET CORE工具案例-StackExchange.Redis代码变量方式实现商品秒杀
文章目录 前言 一、StackExchange.Redis执行Lua脚本实现商品秒杀 1.StackExchange.Redis封装 2.秒杀代码 3.效果 ---- 前言 下面是Redis分布式锁常用的概念说明:设置、获取、过期时间、删除。 1、 Setnx 命令:SETNX key value 说明:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简
愚公搬代码
2022/11/28
5770
【愚公系列】2022年11月 .NET CORE工具案例-StackExchange.Redis代码变量方式实现商品秒杀
C#实现文件数据库
本文转载:http://www.cnblogs.com/gaochundong/archive/2013/04/24/csharp_file_database.html#commentform
跟着阿笨一起玩NET
2018/09/19
1.4K0
C#实现文件数据库
推荐阅读
相关推荐
c# 检测cpu使用率[测试通过]
更多 >
LV.5
www.javacn.siteJava布道者
目录
  • 1.简介
  • 2.窗口的基本操作
    • 2.1代码设计
    • 2.2参考代码
    • 2.3运行代码
  • 3.窗口打开方法
    • 3.1代码设计
    • 3.2参考代码
    • 3.3运行代码
  • 4.小结
    •  4.1遇到的坑
      • 4.1.1代码设计
      • 4.1.2参考代码
      • 4.1.3运行代码
    • 4.2pywinauto 中的uia是什么意思?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档