pywinauto:Windows桌面应用自动化测试(七)

news2024/12/24 3:55:27

前言

上一篇文章地址:

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_keys
        send_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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战OpenCV之环境安装与配置

OpenCV是什么 OpenCV,英文全称为Open Source Computer Vision Library,是一个开源的计算机视觉和机器学习软件库。它设计用于提供一系列功能强大的算法,以帮助开发者处理图像和视频数据,实现各种视觉任务,包括&#xf…

Nginx进阶-常见配置(三)

nginx 变量 Nginx的配置文件使用的语法的就是一门微型的编程语言。既然是编程语言,一般也就少不了“变量”这种东西。 Nginx配置文件使用的语法主要包括以下几个方面: (1)配置块 (Block Directives): Nginx配置文件由多个嵌套的…

渗透8-05作业

第十五关: 利用时间盲注 拦截并放到intruder里 请求的参数替换或改写一下 uname1 OR IF(SUBSTRING((SELECT database()), 2, 1)e, sleep(1), 1) -- &passwd1&submitSubmit payload1设置 payload2设置(点击从列表中添加可快速找到a到z的列表) 开始…

Python | Leetcode Python题解之第326题3的幂

题目: 题解: class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n 0

spdlog日志库--基础介绍

文章目录 1. 简介1.1. spdlog代码特点1.2. 说明1.3. spdlog架构 2. spdlog的安装2.1. 使用包管理器安装2.2. 使用源码安装2.3. 仅使用头文件 3. 相关概念3.0 常用的头文件3.1. level_enum3.2. sink3.3. logger3.4 格式输出3.5 对齐方式3.6 截断3.7 字符串格式化fmt 4. 特性4.1.…

职业教育云计算实验实训室建设应用案例

云计算作为信息技术领域的一次革命,正在深刻改变着我们的工作和生活方式。随着企业对云计算技术的依赖日益加深,对具备云计算技能的专业人才的需求也日益迫切。职业院校面临着培养符合行业标准的云计算人才的挑战。唯众凭借其在教育技术领域的专业经验&a…

Web3时代的智能合约:区块链技术的革命性应用

随着区块链技术的发展,Web3时代已经悄然来临。智能合约作为这一时代的重要组成部分,正引领着技术应用的革命性变革。本文将深入解析智能合约的概念、工作原理、应用场景及其带来的挑战与机遇,全面展现其在Web3时代的重要作用。 一、智能合约…

Spring Cloud 整合 Nacos、Sentinel、OpenFigen 实战【微服务熔断降级实战】

前言: 上一篇我们分析了 Sentinel 的各种核心概念点以及 Sentinel 的执行流程,并分别演示了使用 Sentinel 编码和注解方式来管理资源的场景,加上我们前面学习的 Nacos,本篇来分享 Spring Cloud 整合 Nacos、Sentinel、OpenFigen …

密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(1)

目录 1.消息摘要(Hash) 2.SHA-1 3.SHA-2 4.小结 1.消息摘要(Hash) Hash函数是一种单向密码体制,把任意长度的输入经过变换得到一个固定长度的输出,同时它还具备单向性,只能从明文到密文,不能逆向,正是由于Hash函数…

Golang | Leetcode Golang题解之第326题3的幂

题目: 题解: func isPowerOfThree(n int) bool {return n > 0 && 1162261467%n 0 }

onlyoffice使用Https访问

开发服务器用的是http,一切正常使用,部署到服务器后,由于服务器使用了Https,导致访问onlyoffice时控制台报错。Mixed Content: The page at http://xxxxx// was loaded over HTTPS, but requested an insecure frame http://xxxxx…

Jpa-多表关联-OneToOne

Jpa-多表关联-OneToOne 准备JoinColumnOneToOne属性targetEntitycascade*PERSISTMERGEREMOVEREFRESH orphanRemovalfetchoptionalMappedBy* OneToOne在 hibernate中用于对表与表之间进行维护关联 准备 import com.alibaba.fastjson.JSON; import jakarta.persistence.*; impor…

K210烧录固件失败原因

1.检查固件信息,我这里用的是亚博智能提供的canmv固件 2.检查串口有无被占用,我就是因为打开了另一个正点原子的串口接收软件卡这么久 3.你要烧录canmv固件而非maixypy固件 若烧录maixypy要用maixipy来开发 4。可以看看换不同下载方式

辛迪·克劳馥与“惊艳”家人合影,装扮完美协调 幸福满满

我的意思是——辛迪克劳馥拥有一个令人叹为观止的家庭,这真的有什么好奇怪的吗?毕竟,她是世界知名的超级名模,她把基因和颧骨传给了她的孩子,让他们很容易追随她的脚步。所以,当我们看到她最近的家庭照片时…

面试笔记 8.5

面试常见: Jvm,高并发,多线程,数据库,redis,框架 1.N I/O有什么核心组件 Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客 Buffer 缓冲 Channel 一对一 Channel 读取数据 Selector对应线程…

【ML】multi head self-attention(自注意力机制)

【ML】multi head 自注意力机制self-attention 0. Transformer1. multi head self-attention2. positional encoding3. transform 可以应用的其他领域3.1 语音识别 变体 truncated self-attention3.2 self-attention for image3.3 self-attention v.s. CNN差异3.4 self-attenti…

CSP 2022 提高级第一轮 - CSP/S 2022初试题 程序阅读第三题解析

一、代码查看 1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int MAXL 1000; 7 8 int n, k, ans[MAXL]; 9 10 int main(void) 11 { 12 cin >> n >> k; 13 if (!n) cout << 0 <&l…

IO流学习总结

IO流体系 字节流 字节流&#xff1a; 字节输出流:FileOutputStream 程序---写--->文件 字节输入流:FileInputStream 程序<---读---文件 字节输出流(FileOutputStream) Testpublic void testIO01() throws IOException {/*new FileOutputStream文件不存在创建文件父…

最新CSS3纵向菜单的实现

纵向菜单 通过下面例子&#xff0c;你会知道把列表转换成菜单的关键技术 a中的#是URL的占位符可以点击&#xff0c;真正用途中写实际URL <nav class"list1"><ul><li><a href"#">Alternative</a></li><li><…

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统

在数字经济浪潮的推动下&#xff0c;全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革&#xff0c;其中&#xff0c;电商行业作为互联网经济的重要组成部分&#xff0c;更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…