pywinauto:Windows桌面应用自动化测试(七)
前言
上一篇文章地址:
pywinauto:Windows桌面应用自动化测试(六)-CSDN博客
下一篇文章地址:
暂无
一、实战常用方法
1、通过Desktop快速获取窗口
通过之前章节我们了解到控制应用的方法为Application,需要连接应用再获取窗口。
from pywinauto.application import Application
现在我们可以通过Desktop直接获取窗口。
from pywinauto import Desktop def is_logged_in():return Desktop(backend='uia').window(title='Main Page').exists()
两种方法对比如下:
特性 | Desktop 方法 | Application 方法 |
---|---|---|
用途 | 查找和连接所有已打开的窗口 | 启动和控制特定的应用程序 |
适用场景 | 需要与系统中所有应用程序或窗口进行交互 | 需要启动和控制特定应用程序 |
性能 | 可能因为需要遍历所有窗口而较慢 | 对于特定应用程序的操作更加高效 |
灵活性 | 可以与任何已打开的窗口进行交互 | 只能控制当前脚本启动的应用程序 |
启动应用程序 | 不适用 | 可以启动新的应用程序 |
控制应用程序生命周期 | 不适用 | 可以启动、关闭和重新启动应用程序 |
示例代码 | Desktop(backend='uia').window(title="...") | Application(backend='uia').start('...').window(title="...") |
2、获取嵌套窗口
假设窗口嵌套了很多层,那么我们该如何获取他呢?一层层获取,还是直接获取?其实,两种方式都可行,对于直接获取,可以采用Desktop方法,也可以获取到应用窗口后,采用children_window方法直接获取。
3、children_window与children的方法对比
(1)child_window
方法
child_window
方法用于精确查找单个子控件。它不会返回列表,而是返回第一个匹配的控件。如果没有找到匹配的控件,会引发异常。
(3)children
方法
children
方法用于获取一个窗口的所有直接子控件。这个方法会返回一个包含子控件的列表。它接受多个参数来筛选符合条件的控件。
特性 | child_window 方法 | children 方法 |
---|---|---|
用途 | 根据特定属性查找单个子控件 | 获取所有子控件,或根据条件筛选子控件 |
返回值 | 单个控件对象 | 控件对象的列表 |
适用场景 | 查找特定的、已知属性的控件 | 需要遍历和操作多个控件 |
属性过滤 | 可以使用多个属性过滤 | 可以传递条件进行筛选 |
性能 | 查找单个控件,性能较高 | 获取所有子控件,如果控件较多,性能可能受影响 |
示例代码 | main_window.child_window(title="...", control_type="...") | main_window.children(control_type="...") |
4、inspect使用小技巧
当我们想选中窗口时,可以点击它来显示定位元素看看有没有框,如下图,你觉得你选中了框,但实际上你可能选中了标题。
还有一点就是元素的点击区域,你以为点中了,实际上只是点钟了框的中心,而它的作用域是文字部分。
5、控制应用内嵌的系统文件窗口
假设应用调用了系统文件窗口,需要对两个输入框输入信息,如下展示:
其中1需要输入文件路径,2需要输入文件名。
这种情况就需要使用多种操作来实现该功能,以下是一个简单的代码:
def get_upgrade_folder_win(self):'''获取升级选择文件的窗口'''# return self.dialog.child_window(auto_id="MainForm.widget_client.viScanner.qt_tabwidget_stackedwidget.FormEquipmentlist.FirmUpgrageBox.widget.widget_path.pushButton_browers")# return Desktop(backend="uia").window(title_re="请选择固件升级文件")return self.dialog.child_window(title="请选择固件升级文件")def choise_upgrade_file(self, file_path):'''选择升级文件,需要传输文件路径:# 定义文件路径file_path = r"C:\Users\Downloads\OTA.gta"'''upgrade_win = self.get_upgrade_folder_win()# 分割路径directory, filename = os.path.split(file_path)print("Directory:", directory)print("Filename:", filename)upgrade_win.print_control_identifiers()way_element = upgrade_win.child_window(title_re=".*地址.*", found_index=0)rectangle = self._element_num_of_copies(way_element, 5 / 6)click(coords=rectangle)upgrade_win.child_window(title_re=".*地址.*", class_name="Edit", found_index=0).type_keys("{BACKSPACE}")upgrade_win.child_window(title_re=".*地址.*", class_name="Edit", found_index=0).set_text(directory)from pywinauto.keyboard import send_keyssend_keys("{ENTER}")upgrade_win.child_window(title="文件名(N):", class_name="Edit").set_text(filename)
这里涉及到一些输入文本的方法,汇总一下:
(1)set_text方法:
直接设置控件的文本内容。
app.window(title='YourWindowTitle').Edit.set_text('YourText')
(2)type_keys方法:
模拟按键输入,可以包括特殊键(如回车键、Tab键等)。
app.window(title='YourWindowTitle').Edit.type_keys('YourText{ENTER}')
(3)send_keys方法:
使用pywinauto.keyboard模块,可以模拟全局键盘输入。
from pywinauto.keyboard import send_keys
send_keys('YourText{ENTER}')
(4)WrapperObject.set_edit_text方法:
用于直接设置编辑控件的文本内容
edit = app.window(title='YourWindowTitle').Edit.wrapper_object()
edit.set_edit_text('YourText')
(5)WrapperObject.send_chars方法:
模拟逐字符输入
edit = app.window(title='YourWindowTitle').Edit.wrapper_object()
edit.send_chars('YourText')
一些特殊字符的输入方式总结如下:
特殊字符 | 描述 | 输入方式 (type_keys) | 输入方式 (send_keys) |
---|---|---|---|
{SPACE} | 空格键 | {SPACE} | {SPACE} |
{BACKSPACE} | 退格键 | {BACKSPACE} , {BS} , {BKSP} | {BACKSPACE} , {BS} , {BKSP} |
{BREAK} | Break 键 | {BREAK} | {BREAK} |
{CAPSLOCK} | 大写锁定键 | {CAPSLOCK} | {CAPSLOCK} |
{DELETE} | 删除键 | {DELETE} , {DEL} | {DELETE} , {DEL} |
{DOWN} | 向下箭头键 | {DOWN} | {DOWN} |
{END} | 结束键 | {END} | {END} |
{ENTER} | 回车键 | {ENTER} , ~ | {ENTER} , ~ |
{ESC} | Escape 键 | {ESC} | {ESC} |
{HELP} | 帮助键 | {HELP} | {HELP} |
{HOME} | Home 键 | {HOME} | {HOME} |
{INSERT} | 插入键 | {INSERT} , {INS} | {INSERT} , {INS} |
{LEFT} | 向左箭头键 | {LEFT} | {LEFT} |
{NUMLOCK} | 数字锁定键 | {NUMLOCK} | {NUMLOCK} |
{PGDN} | 向下翻页键 | {PGDN} | {PGDN} |
{PGUP} | 向上翻页键 | {PGUP} | {PGUP} |
{PRTSC} | 打印屏幕键 | {PRTSC} | {PRTSC} |
{RIGHT} | 向右箭头键 | {RIGHT} | {RIGHT} |
{SCROLLLOCK} | 滚动锁定键 | {SCROLLLOCK} | {SCROLLLOCK} |
{TAB} | Tab 键 | {TAB} | {TAB} |
{UP} | 向上箭头键 | {UP} | {UP} |
{ADD} | 加号键 | {ADD} | {ADD} |
相关文章:

pywinauto:Windows桌面应用自动化测试(七)
前言 上一篇文章地址: pywinauto:Windows桌面应用自动化测试(六)-CSDN博客 下一篇文章地址: 暂无 一、实战常用方法 1、通过Desktop快速获取窗口 通过之前章节我们了解到控制应用的方法为Application࿰…...

RGB++是什么;UTXO是什么;Nervos网络;CKB区块链;
目录 RGB++是什么,简单举例说明 RGB++简介 举例说明 UTXO是什么 定义 功能与特点 使用方式 优缺点 结论 CKB区块链 一、基础属性 二、技术特点 三、经济模型 四、应用场景 Nervos网络 一、网络架构 二、技术特点 三、经济模型 四、应用场景 五、未来展望 …...

轻闪PDF v2.14.9 解锁版下载与安装教程 (全能PDF转换器)
前言 轻闪PDF(原傲软PDF编辑软件)是一款操作简单的全能PDF转换器,轻松实现PDF转换为Word,Excel或其他格式,以及PDF压缩,合并和图片文字识别OCR等功能.这款pdf编辑转换软件几乎支持所有常见文档格式,一键完成PDF与其他文档互相转换,并含有PDF合并,压缩,图片文字识别OCR等增值功…...

mysql 5.7 解析binlog日志,并统计每个类型语句(insert、update、delete)、每个表的执行次数
1、mysqlbinlog工具 使用mysqlbinlog工具将文件中执行语句解析至某个文件中。 /usr/local/mnt/mysql/bin/mysqlbinlog --base64-outputDECODE-ROWS -v /usr/local/mnt/mysql/log/mysql-bin.017278 > binlog017278.sql --base64-outputDECODE-ROWS 参数: 这个…...

MySQL案例:MHA实现主备切换(主从架构)万字详解
目录 MHA 概念 MHA的组成 特点 案例介绍 (1)案例需求 (2)案例实现思路 (3)案例拓扑图 (4)案例环境 案例步骤 基本环境配置 关闭防火墙和内核安全机制 安装数据库 授权…...

81.SAP ME - SAP SMGW Getway Monitor
目录 1.起因 2.SMGW Displaying Logged On Clients Displaying Remote Gateways Display and Control Existing Connections Deleting a Connection Displaying Gateway Release Information Displaying Parameters and Attributes of the Gateway Change Gateway Pa…...

SAPUI5基础知识24 - 如何向manifest.json中添加模型(小结)
1. 背景 在上一篇博客中,我们总结了SAPUI5中模型的各种类型,并通过代码给出了实例化这些模型的方式。 其实,在SAPUI5中,我们可以通过在manifest.json 中添加模型配置,简化模型的初始化过程,并确保模型在应…...

操作系统---文件管理
一、系统调用(系统API) 什么是系统调用 由操作系统向应用程序提供的程序接口信息,本质上就是应用程序与操作系统之间交互的接口。 操作系统的主要功能是为了管理硬件资源和为应用软件的开发人员提供一个良好的环境,使得应用程序…...

C语言指针详解(三)目录版
C语言指针详解(三)目录版 1、字符指针变量1.1、字符指针变量的一般应用1.2、常量字符串1.3、常量字符串与普通字符串的区别1.3.1 常量字符串的不可修改性1.3.2 常量字符串的存储 2、数组指针变量2.1、数组指针变量定义2.2、数组指针变量的初始化 3、二维…...

【AI资讯早报】AI科技前沿资讯概览:2024年8月6日早报
【AI资讯早报,感知未来】AI科技前沿资讯概览,涵盖了行业大会、技术创新、应用场景、行业动态等多个方面,全面展现了AI领域的最新发展动态和未来趋势。 1.【图像生成技术再突破】Midjourney V6.1震撼发布,人像生成质量跃上新台阶 …...

等保测评中的密码技术与密钥管理
在信息安全领域,等保测评(信息安全等级保护测评)是一项重要的安全评估活动,旨在评估信息系统的安全性,并根据评估结果给予相应的安全等级。这一过程中,密码技术与密钥管理发挥着至关重要的作用。本文将详细…...

go语言flag库学习
文章目录 flag基本创建使用方法正常声明全局变量指针短写 flag 基本创建使用方法 func String(name string, value string, usage string) *string func StringVar(p *string, name string, value string, usage string) 正常声明全局变量 package mainimport ("flag…...

2024年必备技能:智联招聘岗位信息采集技巧全解析
随着大数据时代的发展,精准定位职业机会成为程序员求职的关键。本文将深入解析如何利用Python高效采集智联招聘上的岗位信息,助你在2024年的职场竞争中脱颖而出。通过实战代码示例,揭示网络爬虫背后的秘密,让你轻松掌握这一必备技…...
《机器学习by周志华》学习笔记-决策树-02
1、剪枝处理(Pruning) 1.1、背景概念 上文「决策树01」的学习中,我们了解了著名的3种决策树算法ID3、C4.5、CART。这3种决策树算法最根本的核心就是根据特征选择离散属性作为节点来搭建树结构,运用搭好的结构进行推理。 剪枝(pruning)则就是将搭好的决策树去掉一些「非叶节…...

centos Python3.6升级3.8
CentOS系统上升级Python3.6到3.8版本。 步骤 1. 更新系统 在开始升级Python之前,首先需要确保系统是最新的。可以使用以下命令更新CentOS系统: sudo yum update 2. 安装依赖项 升级Python之前,需要安装一些依赖项。运行以下命令安装这些依赖…...
文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于竞价空间预测的虚拟电厂日前竞价策略》
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

Simulink模型开发中的一些自动化方法
随着Simulink模型的产品化开发进程,许多模型开发人员会关心模型的建模自动化问题。比如如何对模型中的元素进行批量查找和修改;如何构建自己的建模规则对模型进行检查;如何实现测试自动化等。在这些使用场景中我们都需要了解一些Simulink函数…...

RabbitMQ消费者消费消息失败处理
在我们开发分布式系统的过程中,RabbitMQ这样的消息队列无疑是实现微服务间通信的利器。然而,消息处理失败在所难免。当我们面临消费消息失败的情况时,该如何应对呢?在这篇博客中,我将带你深入探讨RabbitMQ消费者的消息…...

Apache Kylin分布式的分析数据仓库
Apache Kylin 是一个分布式的分析数据仓库,用于大数据上的超快在线分析处理 (OLAP)。它能够在大规模数据集上提供亚秒级的查询响应时间,并支持标准的 ANSI SQL 查询接口。Kylin 最初由 eBay 开发,后来捐赠给 Apache 软件基金会,现…...

informer中DeltaFIFO机制的实现分析与源码解读
informer中的DeltaFIFO机制的实现分析与源码解读 DeltaFIFO作为informer中重要组件,本文从源码层面了解是如何DelatFIFO是实现的。 DeltaFIFO的定义 找到delta_fifo.go的源码,位于client-go/tools/cache/delta_fifo.go 代码结构大致如下: store定义…...

树莓派下,centos7amr64下,搭建目标检测开发环境,java语言
在树莓派(Raspberry Pi)上使用CentOS 7 ARM64搭建基于Java的目标检测开发环境,可以按照以下步骤进行。需要注意的是,CentOS 7 ARM64的官方镜像可能不支持树莓派的某些硬件,因此你可能需要寻找第三方镜像或进行一些额外的配置。 1. 安装CentOS 7 ARM64 首先,确保你已经正…...

SpringBoot+Redis 发布与订阅
两个应用都引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artif…...

huggingface无法访问怎么办?一招教你解决,使用hf-mirror.com镜像站快速下载各种大模型
huggingface.co无法访问怎么办? 请访问 https://hf-mirror.com/ hf-mirror.com是一个旨在为中国国内的人工智能开发者提供更快更稳定下载服务的镜像站点,它镜像了Hugging Face的huggingface.co网站上的模型和数据集资源。由于网络环境和地理限制…...

如何用密码保护你的 WordPress 管理员 (wp-admin) 目录
在维护 WordPress 网站时,确保 wp-admin 目录安全是非常重要的。为该目录添加密码保护可以有效提高网站安全性,防止未经授权的访问。这篇文章将介绍实现这一目标的两种方法。 1.为什么要为 wp-admin 目录添加密码保护 WordPress 管理员后台是网站的核心…...

java 程序包org.junit.jupiter.api不存在
问题描述 正常启动springboot报错java 程序包org.junit.jupiter.api不存在。 问题分析 pom文件中缺少junit依赖,但是添加后问题仍然没解决,后面把test部分删掉解决问题。 解决方法 添加junit依赖 <dependency><groupId>junit</group…...

简单的docker学习 第4章 docker容器
第4章 Docker容器 4.1 容器基础 4.1.1 容器启动流程 通过 docker run 命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的镜像,如果找到了,则直接启动,否则会到镜像中心查找。如果镜像中心存在该镜像,则会下载到…...

零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因)
零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因) 目录 零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因)1. SVM-RFE基础知识2. SVM-RFE(Rstudio)——代码实操2. 1 数据…...

Python酷库之旅-第三方库Pandas(067)
目录 一、用法精讲 266、pandas.Series.dt.second属性 266-1、语法 266-2、参数 266-3、功能 266-4、返回值 266-5、说明 266-6、用法 266-6-1、数据准备 266-6-2、代码示例 266-6-3、结果输出 267、pandas.Series.dt.microsecond属性 267-1、语法 267-2、参数 …...

Spring快速学习
目录 IOC控制反转 引言 IOC案例 Bean的作用范围 Bean的实例化 bean生命周期 DI 依赖注入 setter注入 构造器注入 自动装配 自动装配的方式 注意事项; 集合注入 核心容器 容器的创建方式 Bean的三种获取方式 Bean和依赖注入相关总结 IOC/DI注解开发 注解开发…...

【Web开发手礼】探索Web开发的秘密(十五)-Vue2(2)AJAX、前后端分离、前端工程化
主要介绍了AJAX、前后端分离所需的YApi、前端工程化所需要的环境安装!!! 目录 前言 AJAX 原生Ajax Axios Axios入门 案例 前后端分离开发 YApi 前端工程化 环境准备 总结 前言 主要介绍了AJAX、前后端分离所需的YApi、前端工…...