1.简介

前几篇通过宏哥的讲解和分享,已经知道如何将PC端的应用程序启动,以及如何连接已启动的应用程序,那么启动和连接上之后呢?不用说当然是操作应用程序了,怎么操作呢?请听宏哥给你娓娓道来,所以今天主要是讲解和分享一下如何操作PC端应用程序的窗口。

2.什么是窗口

窗口就是应用软件上面的工具栏,操作栏,弹出菜单,对话框等,这些基本上为windows软件应用比较多的地方。它通常具有带有标题栏、 最小化和最大化按钮以及其他标准 UI 元素的框架。 有兴趣的可以看一下这里有详细的介绍:什么是窗口 - Win32 apps | Microsoft Learn

3.如何获取窗口信息

宏哥这里介绍和分享两种方法:一种是通过工具获取,另一种是通过代码获取。

3.1方法1-工具

1.直接通过inspect工具进行获取窗口信息,启动记事本,可以通过inspect.exe 查看窗口信息。如下图所示:

2.主要看2个属性,窗口的标题,也就是左上角我们看到的还有一个是查看的class属性,只能通过工具查看。如下图所示:

3.2方法2-代码

通过print_control_identifiers()方法,print_control_identifiers()方法进行获取该应用下的所以窗口或组件内容(宏哥这里由于是Windows11系统用这个方法打开获取记事本窗口信息会报错)。查了好多资料以及去pywinauto社区查找都没找到解决办法,而且网上好多人都遇到了这个问题,因此宏哥这里用notepad++这款编辑器给小伙伴或者童鞋们来演示一下。其实用notepad++这款编辑器按照Windows10系统代码的写法也会报错:pywinauto.findwindows.ElementNotFoundError: {'class_name': 'Notepad', 'visible_only': True, 'backend': 'uia'} 。但是宏哥自己想了一种解决办法:手动调用connect()给予额外的时间缓冲,可能恰好让UI准备就绪。然后就可以了,宏哥试过记事本了,仍然不行。后边宏哥如想到解决办法,会写文章告知的,要是没有解决方法,就不写相关文章,或者后期微软或者pywinauto社区会更新版本修复这一问题。

3.2.1代码设计

1.Windows10系统

2.Windows11系统

3.2.2参考代码

1.Windows10系统

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

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

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-01-29
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-4-pywinauto 操作PC端应用程序窗口(详细教程)
''' # 3.导入模块
from pywinauto import Application
import time # 通过窗口打开
app = Application('uia').start("D:/software/Notepad/Notepad++/notepad++.exe")
win = app['新文件 1 - Notepad++']
print(win)
print(app.process)
win.print_control_identifiers()

2.Windows11系统

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

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

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-01-29
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-4-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['新文件 1 - Notepad++']
print(win)
print(app.process)
win.print_control_identifiers()
3.3.3运行代码

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

2.运行代码后电脑端的动作(启动notepad++,宏哥这里是Windows11系统)。如下图所示:

4.如何选择窗口?

启动PC端的软件后,会出现软件的窗口界面,首先获取到窗口的信息,然后我们需要根据获取到的窗口信息连接到窗口,然后选择我们要测试的窗口,只有选择到要测试的窗口后,我们才能进行操作。如果你都无法选择到要测试窗口,何谈下一步的操作和自动化测试呢?因此接着宏哥介绍几种选择窗口的方法,其实之前的文章中已经或多或少的宏哥已经提及到,因为比较重要,因此宏哥在这里单独将其拎出来介绍和讲解一下。宏哥这里介绍和分享以下三种方法,通过选择notepad++的窗口,然后输入“北京-宏哥”。宏哥在Windows11系统演示,Windows10以下可以参考前边宏哥提到的代码,比Windows11简单多了。

4.1方法1-窗口属性值

通过窗口的属性值进行获取,代码如下:

win = app['属性值']
4.1.1代码设计

通过className属性值,代码如下:

4.1.2参考代码
# -*- coding:utf-8 -*-

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

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-01-29
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-4-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['Notepad']
win.type_keys("北京-宏哥")
4.1.3运行代码

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

2.运行代码后电脑端的动作(启动notepad++,输入文本:北京-宏哥)。如下图所示:

4.2方法2-窗口标题

通过窗口的标题获取,代码如下:

win = app['窗口的标题'] 
4.2.1代码设计

4.2.2参考代码
# -*- coding:utf-8 -*-

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

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-01-29
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-4-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("北京-宏哥")
4.2.3运行代码

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

2.运行代码后电脑端的动作(启动notepad++,输入文本:北京-宏哥)。如下图所示:

4.3方法3-窗口类名(不推荐)

这种点窗口名称的写法,只适合于一些英文的className属性,一些中文的标题,或者有特殊符号就会报语法错误。

通常用窗口的标题操作更稳定一些,用class名称有时候会报错找不到。

通过窗口的类名进行获取,代码如下:

win = app.类名
4.3.1代码设计

4.3.2参考代码
# -*- coding:utf-8 -*-

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

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-01-29
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: PC端自动化测试实战教程-4-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.Notepad
win.type_keys("北京-宏哥")
4.3.3运行代码

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

2.运行代码后电脑端的动作(启动notepad++,输入文本:北京-宏哥)。如下图所示:

5.小结

5.1遇到的问题

今天主要讲解和分享了如何操作PC端应用程序的窗口、获取窗口信息、选择窗口,以及Windows10系统和Windows11系统代码的区别,主要是多了一段连接窗口的代码。如果缺少这一段代码就会报错:pywinauto.findwindows.ElementNotFoundError: {'best_match': '新文件 1 - Notepad++', 'backend': 'uia', 'process': 12464}。如下图所示:

解决方法:上网和社区查了好多资料,都说没有解决办法,宏哥就自己试了一下,加上那段连接到窗口的代码就没有问题了,代码如下:

app = Application('uia').connect(class_name="Notepad++")

但是,宏哥试了记事本还是不可以,notepad++编辑器是可以了。真是奇怪了。。。。

5.2环境变量

你如果想要像启动记事本一样启动notepad++,你只需要配置notepad++的环境变量即可,如何配置,宏哥就不在这里赘述了,自己网上找一下,特别多,都是一样套路,或者是换汤不换药。然后代码就可以按照如下方式写:

app = Application('uia').start("notepad++.exe")

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

PC端自动化测试实战教程-4-pywinauto 操作PC端应用程序窗口 - 上篇(详细教程)的更多相关文章

  1. 《手把手教你》系列进阶篇之3-python+ selenium自动化测试 - python几种骚操作你都知道吗?(详细教程)

    1. 简介 这篇文章主要是给小伙伴或者童鞋们介绍和分享 python几种骚操:读取配置文件.获取根目录的相对路径.获取系统时间和格式化时间显示.字符串切割等等操作.为后边的自动化框架打下一个结实的基础 ...

  2. 《手把手教你》系列进阶篇之4-python+ selenium自动化测试 - python几种超神操作你都知道吗?(详细教程)

    1. 简介 今天分享和讲解的超神操作,对于菜鸟来说是超神的操作,对于大佬来说也就是几个简单方法的封装和调用.这里讲解和分享这部分主要是为了培养小伙伴们和童鞋们的面向对象的开发思维,对比这样做的好处让你 ...

  3. Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)

    简介 按照上一篇的计划,这一篇给小伙伴们分享一下测试方法. 一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递 ...

  4. Java自动化测试框架-07 - TestNG之Factory篇 - 欢快畅游梦幻工厂(详细教程)

    简介 最近忙着装修博客园,没时间更新文章,今天终于抽出时间把上次写的一半的文章给写完了,新的博客园风格,希望大家喜欢.今天继续介绍testng的相关知识--工厂. 工厂允许你动态的创建测试.例如,假设 ...

  5. 《手把手教你》系列练习篇之9-python+ selenium自动化测试 -番外篇 - 最后一波啊!!!(详细教程)

    1. 简介 本来上一篇就是练习篇的最后一篇文章了,但是有的小伙伴私下反映说是做了那么多练习,没有一个比较综合的demo练练手.因此宏哥在这里又补存了一些常见的知识点进行练习,在文章最后也通过实例给小伙 ...

  6. 《手把手教你》系列技巧篇(七)-java+ selenium自动化测试-宏哥带你全方位吊打Chrome启动过程(详细教程)

    1.简介 经过前边几篇文章和宏哥一起的学习,想必你已经知道了如何去查看Selenium相关接口或者方法.一般来说我们绝大多数看到的是已经封装好的接口,在查看接口源码的时候,你可以看到这个接口上边的注释 ...

  7. Qt5 项目程序打包发布 详细教程

    概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装文件. ...

  8. 关于《Python自动化测试实战》

    作者有话说 笔者写这本书的初心是想通过自身经验分享一些在自动化测试领域中的实用技术,能够帮助那些正在从事自动化测试相关工作或者准备转型自动化测试的测试人员.任何一门技术涵盖的知识点都是非常广泛的,可能 ...

  9. appium自动化测试实战

    一.Appium的介绍   Appium是一款开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用. 1. 使用appium进行自动化测试的好处 Appium在不同平台 ...

  10. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

随机推荐

  1. 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体的替代品,可本地部署+知识库,注册即可有750w的token使用

    最近火山引擎推出了自家联网版的DeepSeekR1,并且加入了联网的功能,不用担心DeepSeek本体的服务器繁忙了,可以说直接是DeepSeek本体的替代品.现在注册即送30块体验价(相当于750w ...

  2. Win10、Win11老游戏运行补丁(cnc-ddraw),适用于红色警戒、帝国时代等经典游戏

    Win11.Win10老游戏运行补丁(cnc-ddraw),适用广泛,红色警戒(红警),直接复制到游戏目录,然后即可畅玩.再也不需要修改:管理员运行,兼容性运行,更改DPI.cnc-ddraw 可以修 ...

  3. SparkRDD算子(transformations算子和actions算子)

    RDD提供了两种类型的操作:transformation和action1.所有的transformation都是采用的懒策略,如果只是将transformation提交是不会执行计算的,计算只有在ac ...

  4. Springboot 在项目启动时将数据缓存到全局变量

    有写字典数据不会频繁更新,但是会频繁查询,想要减少数据库链接次数,把内容缓存到项目的全局变量中,提高方法查询速度 import javax.annotation.PostConstruct; impo ...

  5. 第二届獬豸杯wp

    第二届獬豸杯wp 容器密码:}2N|n_yxdt!G/Ru}|_zdn$@?6@CD8E 计算机和手机部分已经在第二届 獬豸杯-复现 - 萧瑟迪亲传大弟子 - 博客园这里发过了,服务器部分自己又写了一 ...

  6. WARN  Issues with peer dependencies found,pnpm peer dependencies auto-install

    前言 pnpm 也需要设置自动安装对等依赖项 解决 pnpm 使用 npm 的配置格式,所以应该以与 npm 相同的方式设置配置: pnpm config set auto-install-peers ...

  7. Windows 提权-服务_弱服务权限

    本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行 ...

  8. Windows 10 的 "邮件" 设置完成QQ账户,提示您的Qq帐户设置已过期的处置方法

    引起这问题的原因可能是QQ未开启 1.POP3/SMTP服务 2.IMAP/SMTP服务   开启方法: 1.登录QQ邮箱(mail.qq.com) 2.点击"设置"->&q ...

  9. docker删除所有服务service,停止并删除所有容器container

    查看运行容器docker ps 查看所有容器docker ps -a 进入容器其中字符串为容器ID:docker exec -it d27bd3008ad9 /bin/bash 删除所有服务:dock ...

  10. 深入掌握Map的这8个操作方法,让代码更简洁优雅

    Map 是我们经常使用的数据结构接口,它的子类 HashMap.ConcurrentHashMap 也是我们使用比较频繁的集合. 了解了 Map 接口中的方法,也就相当于知道了其子类中的可用方法,管它 ...