python篇-pywinauto使用-持续更新

1- pywinauto 中的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事件等,这对于创建复杂的自动化测试场景尤其有用。

2-pywinauto 中main_window.child_window()方法及参数详细介绍

pywinauto中,child_window()方法是用于定位父窗口中的一个特定子窗口或控件。这对于自动化测试中准确地找到并操作特定的UI元素至关重要。下面是对child_window()方法及其参数的详细说明:

基本用法

child_window()方法属于窗口对象,用于在当前窗口的所有子窗口中搜索符合指定条件的第一个子窗口。基本语法如下:

Python

1parent_window.child_window(arguments)

其中,parent_window是你已经获取到的窗口对象,arguments是用于筛选子窗口的一系列关键字参数。

参数详解

child_window()方法接受多个关键字参数来精确地定位子窗口,常见的参数包括但不限于:

  • title: 字符串,控件的标题或文本。
  • class_name: 字符串,控件的类名。
  • control_type: 字符串,控件的类型(仅在UIA backend下有效)。
  • auto_id: 字符串,控件的自动化ID(AutomationId)。
  • name: 字符串,控件的名称属性,可能与标题或自动化ID不同。
  • backend: 字符串,指定后端类型,如 'win32' 或 'uia',默认自动选择。
  • process: 整数,指定目标窗口所在的进程ID。
  • enabled: 布尔值,是否只查找启用的控件。
  • visible: 布尔值,是否只查找可见的控件。
  • top_level_only: 布尔值,是否只在顶级窗口中查找。
  • found_index: 整数,当找到多个匹配项时,可以选择特定索引的匹配项。
  • control_id: 整数,控件的ID(Windows API中的控件ID)。
  • handle: 整数或ctypes.c_void_p,直接指定控件的句柄。
  • regex_title: 正则表达式对象或字符串,用于匹配标题的正则表达式。
  • regex_class_name: 同上,但用于匹配类名的正则表达式。
  • best_match: 字符串,用于best_match()逻辑,尝试匹配最接近的控件。

示例

假设你想在记事本应用的主窗口中找到名为“文件”(File)的菜单项,可以这样做:

Python

1from pywinauto import Application
2
3app = Application(backend="uia").start("notepad.exe")
4main_window = app.window(title="无标题 - 记事本")
5
6# 使用class_name和title定位子窗口
7menu_item = main_window.child_window(class_name="MenuItem", title="文件")

注意事项

  • 参数组合:通常,为了精确匹配,你需要结合多个参数一起使用。比如,同时使用class_nametitle可以更准确地定位目标控件。
  • 性能考量:如果条件设置得过于宽泛,可能会导致搜索缓慢或找到错误的控件。尽量使用具体的属性来缩小搜索范围。
  • 异常处理:如果找不到匹配的子窗口,child_window()会抛出异常。可以使用try-except结构来妥善处理这种情况。

通过灵活运用child_window()方法及其参数,你可以高效地定位并操作UI自动化中的各种元素。

3-child_window()    children()   descendants()方法介绍

如果要获取父窗口下的所有直接子窗口(而不只是单个子窗口),可以使用children()方法,它会返回一个包含所有直接子元素的列表。例如:

Python

1all_direct_children = parent_window.children()

而如果你需要递归地获取所有子孙窗口(子窗口以及子窗口的子窗口等),可以使用descendants()方法:

Python

1all_descendants = parent_window.descendants()

总结来说,parent_window.child_window()是用于定位单个满足特定条件的子窗口,而不是获取所有子内容。 若要获取所有子内容,请根据需要使用children()descendants()

4-pywinauto打开程序时,程序启动的比较慢,或点击按钮弹窗比较慢,或者打开新窗口窗口渲染的比较慢,怎么添加合理的等待时间

在使用pywinauto进行自动化操作时,合理地添加等待时间是非常重要的,尤其是在程序启动慢、按钮点击后弹窗延迟或新窗口渲染速度较慢的情况下。这能确保脚本在继续执行下一步操作前,等待相关的UI元素准备就绪。以下是几种添加等待时间的方法:

1. 显式等待(推荐)

使用wait方法是最灵活且推荐的等待方式,它允许你指定等待的条件和超时时间。

等待窗口可见:

Python

app.Window(title="窗口标题").wait("visible", timeout=10)
等待控件可用:

Python

app.Dialog.child_window(title="按钮标题", control_type="Button").wait("enabled", timeout=20)

2. 静态等待(time.sleep)

虽然不如显式等待灵活,但在某些简单场景下可以使用time.sleep来简单地暂停脚本执行。

Python

import time
time.sleep(5)  # 等待5秒

3. 动态等待

对于某些不确定何时完成的操作,可以在循环中结合检查条件和短暂停顿来实现动态等待。

Python

import timetimeout = 30  # 总超时时间
interval = 1  # 检查间隔start_time = time.time()
while time.time() - start_time < timeout:if app.Window(title="窗口标题").exists():breaktime.sleep(interval)
else:raise TimeoutError("窗口未在指定时间内出现")

4. 使用backend的特性

某些后端(如uia)提供了更高级的等待逻辑,例如在启动应用程序时可以利用Application().start(..., timeout=...)来指定启动超时时间。

5-pywinauto 打开的app有多个不同的窗口时,怎么定位具体的某个窗口

pywinauto中,如果一个应用程序打开了多个不同的窗口,要定位到具体的某个窗口,你可以根据窗口的特征来精确筛选。以下是一些常用的筛选方法:

1. 根据窗口标题(Title)

窗口标题通常是区分不同窗口最直观的属性。你可以使用窗口标题的精确文本或正则表达式来定位窗口。

Python

specific_window = app.window(title="窗口的精确标题")
# 或者使用正则表达式来模糊匹配
specific_window = app.window(title_re="窗口标题的一部分.*")

2. 结合类名(Class Name)

如果多个窗口的标题相似,但类名不同,你可以结合类名一起筛选。

Python

specific_window = app.window(title="窗口标题", class_name="窗口类名")

3. 控件类型(Control Type)和自动化ID(Automation ID)

在使用UIA后端时,如果窗口内有特定类型的控件或者控件具有唯一的Automation ID,也可以作为定位依据。

Python

# 假设窗口内有特定的控件类型或ID
specific_window = app.window(control_type="Window", automation_id="特定的自动化ID")

4. 使用子窗口或后代窗口

如果需要定位的窗口是另一个窗口的子窗口或后代,可以先定位到父窗口,再通过child_window()descendants()方法找到目标窗口。

Python

parent_window = app.window(title="父窗口标题")
specific_child_window = parent_window.child_window(title="子窗口标题")
# 或者遍历所有后代窗口找到匹配的
specific_descendant_window = parent_window.descendants(title="后代窗口标题")[0]  # 注意这会返回一个列表

5. 通过句柄(Handle)

如果你已经知道了窗口的句柄,可以直接通过句柄连接到窗口。

Python

from pywinauto.windows import win32functionshandle = win32functions.FindWindowEx(None, None, "窗口类名", "窗口标题")
specific_window = app.window(handle=handle)

注意事项

  • 在使用wait方法确保窗口已经加载和可见,特别是在定位动态弹出的窗口时,这可以避免因窗口未准备好而导致的错误。
  • 当有多个窗口匹配相同的筛选条件时,考虑使用更具体的筛选条件或结合多个属性来定位。
  • 如果窗口是在不同进程中创建的,可能需要使用Application.connect()方法来单独连接到那个窗口。

6-pywinauto 中element_info 和BaseWrapper的用法

pywinauto中,element_infoBaseWrapper是两个核心概念,它们在自动化测试和界面操作中扮演着重要角色。

element_info (pywinauto.element_info.ElementInfo)

element_info是一个底层的、面向元素信息的抽象类,它提供了对UI元素属性的访问和描述,但不直接支持操作。它是一个轻量级的包装,用于存储和传递关于UI元素的信息,如类名、标题、位置等,而不涉及实际的UI操作。element_info是所有控件信息的基础,无论控件是通过哪个后端(如win32, uia)来识别的。

当你使用pywinauto的方法(如child_window())来定位一个元素时,实际上就是在创建或查找一个element_info对象。element_info对象可以被用来创建更高级的包装对象,如BaseWrapper

BaseWrapper (pywinauto.base_wrapper.BaseWrapper)

BaseWrapper是基于element_info的更高层次的包装,它不仅包含了元素的信息,还提供了对元素进行操作的方法,如点击、发送文本、获取属性等。当你需要与UI元素进行交互时,比如点击一个按钮或填写一个文本框,你应该使用BaseWrapper对象。

BaseWrapperelement_info的直接扩展,它将底层的元素信息转换为可操作的对象。这意味着,你可以通过BaseWrapper直接执行如.click(), .set_text(), .texts(), .exists()等操作,使得自动化脚本编写更为直观和便利。

使用示例

假设你要操作一个按钮,可以按照以下步骤:

Python

from pywinauto import Applicationapp = Application().start("your_app.exe")
main_win = app.window(title="Main Window Title")# 使用child_window()方法找到一个按钮,得到的是一个BaseWrapper实例
button = main_win.child_window(title="Click Me", control_type="Button")# 然后,你可以直接调用BaseWrapper的方法来操作这个按钮
button.click()

在这个过程中,虽然没有直接使用element_info,但实际上child_window()内部处理了从element_infoBaseWrapper的转换,让你能够直接与UI元素进行交互。

7-pywinauto 的BaseWrapper类还有哪些方法,详细说明

根据搜索到的内容总结如下

pywinautoBaseWrapper类提供了许多方法来操作和查询UI元素。这些方法覆盖了从基本的属性访问到复杂的UI交互,下面是BaseWrapper类中一些常用方法的概览和简要说明:

常用属性和方法

  1. .window_text(): 获取控件的文本内容。
  2. .texts(): 返回一个包含控件所有文本内容的列表,适用于包含多行文本的控件。
  3. .class_name(): 返回控件的类名。
  4. .control_type(): 使用UIA后端时,返回控件的类型。
  5. .enabled(): 检查控件是否启用。
  6. .visible(): 检查控件是否可见。
  7. .rectangle(): 获取控件的矩形区域,包括坐标和大小。
  8. .set_focus(): 将焦点设置到控件上。
  9. .click_input(): 模拟鼠标点击控件。
  10. .double_click_input(): 双击控件。
  11. .right_click_input(): 右键点击控件。
  12. .drag_drop(target): 拖拽控件到指定的目标。
  13. .type_keys(keys, with_spaces=True, set_foreground=True): 向控件发送键盘输入。
  14. .set_text(text): 设置文本控件的内容。
  15. .texts(): 获取控件的所有文本内容,适用于可能有多行文本的控件。

控件定位和操作扩展

  1. .child_window(**kwargs): 在当前控件的子控件中查找并返回匹配条件的BaseWrapper对象。
  2. .descendants(**kwargs): 返回当前控件的所有子孙控件的列表,这些控件满足给定的筛选条件。
  3. .parent(): 返回当前控件的直接父控件的BaseWrapper对象。
  4. .top_parent(): 返回当前控件的最顶级父控件的BaseWrapper对象。

属性获取与设置

  • .get_properties(): 获取控件的所有属性信息。
  • .set_property(name, value): 设置控件的属性值。

图像操作

  • .capture_as_image(): 截取控件的图像,返回一个PIL图像对象。

其他

  • .wait('exists', timeout=timedelta(seconds=5)): 等待控件存在,直到超时。
  • .wait('visible', timeout=timedelta(seconds=5)): 等待控件变得可见。
  • .wait_not('visible', timeout=timedelta(seconds=5)): 等待控件不再可见。

以上只列出了部分方法,实际上BaseWrapper类包含更多功能,涵盖了大多数自动化测试和UI操作的需求。具体的使用方法和参数细节,建议参考pywinauto的官方文档或直接查看源代码注释,以获取最全面和最新的信息。

  • 尝试显式类型转换:如果适用,可以尝试将找到的元素转换为具体的控件类型,然后调用 .click_input() 方法。

Python

from pywinauto.controls.win32_controls import ButtonWrapperbutton = ButtonWrapper(element)
button.click_input()

如果以上方法都不能解决问题,建议查阅 pywinauto 的官方文档或访问其GitHub页面查看是否有相关的问题报告或更新日志。同时,确保你的Python环境是最新的,并考虑升级 pywinauto 到最新稳定版。

8-pywinauto 都可以转换成什么控件类型Wrapper

pywinauto 提供了一系列针对不同控件类型的Wrapper类,这些类封装了对特定类型控件的操作方法,使得自动化操作更加直观和方便。以下是部分常用的控件类型及其对应的Wrapper类:

  1. Button - ButtonWrapper

    • 用于操作按钮,支持点击等操作。
  2. Edit - EditWrapper

    • 用于编辑框,支持文本的设置、获取等操作。
  3. ComboBox - ComboBoxWrapper

    • 用于组合框(下拉列表),支持选择项、获取选项列表等。
  4. ListBox - ListBoxWrapper

    • 用于列表框,支持选择项、获取项列表等。
  5. CheckBox - CheckBoxWrapper

    • 用于复选框,支持勾选、取消勾选及状态检查。
  6. RadioButton - RadioButtonWrapper

    • 用于单选按钮,支持选择及状态检查。
  7. Menu - MenuWrapper

    • 用于菜单项,支持展开菜单、选择菜单项等。
  8. TreeView - TreeViewWrapper

    • 用于树状视图控件,支持节点的展开、选择等。
  9. TabItem - TabWrapper

    • 用于选项卡控件中的单个选项卡。
  10. Dialog - DialogWrapper

    • 对话框窗口的特殊处理,虽然也是窗口,但可能包含特定于对话框的操作方法。
  11. Window - WindowWrapper

    • 通用窗口类,几乎所有窗口都可以用这个类来操作,但针对特定控件类型使用特定的Wrapper会更方便。

请注意,直接将element_info转换为特定的Wrapper类(如从element_infoButtonWrapper)并不总是直接支持,通常你不需要手动进行这样的转换。当你通过正确的筛选条件使用child_window()等方法时,pywinauto会自动为你提供最适合的Wrapper实例。如果需要更具体的控件操作,可以通过访问BaseWrapper实例的属性或方法来实现,因为大多数Wrapper类都是从BaseWrapper继承而来,已经包含了基础的交互方法。

在实际使用中,直接利用child_window()方法根据控件的属性(如标题、类名、控制类型等)来定位并操作控件即可,大多数情况下无需关心底层的Wrapper类转换。如果需要更高级或特定的功能,查阅pywinauto的文档或源码,了解特定Wrapper类的使用方法会更有帮助。

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

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

相关文章

2024年电工杯高校数学建模竞赛(B题) 建模解析| 大学生平衡膳食食谱的优化设计 |小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;实现综合建模。独创复杂系统视角&#xff0c;帮助你解决电工杯的难关呀。 本题&…

面试八股之MySQL篇5——主从同步原理篇

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

IP地址的风险画像及其应用

在现代互联网环境中&#xff0c;IP地址不仅是设备在网络中的唯一标识符&#xff0c;还是分析网络安全和风险管理的重要工具。IP地址的风险画像通过分析IP地址的行为和相关数据&#xff0c;揭示潜在的安全威胁&#xff0c;为企业和组织提供有效的风险管理方案。本文将探讨IP地址…

齐业成工程行业数字化预算费控方案:编制、执行、数据分析全过程闭环管理

工程建设企业具备项目周期长、业务复杂的特点&#xff0c;预算费控涉及内部管理、项目、客户、收支等&#xff0c;账目多、且难控。 在工程企业日常预算费控过程中存在着诸多挑战&#xff1a; • 数据核对难&#xff1a;涉及数据多&#xff0c;需多部门协同填写&#xff0c;需…

人工智能的阴暗面:犯罪分子如何利用 AI 进行欺诈

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成为推动各行各业生产力和创新的关键力量&#xff0c;而一些不法分子也开始探索如何将这些先进的工具用于他们自己的非法目的。从网络钓鱼到深度伪造&#xff0c;再到人肉搜索、越狱服务和身份验证系统的…

【动态维护树的直径】【HBCPC2023】I. Colorful Tree

题目 https://codeforces.com/gym/105139/problem/I 思路 其实相当于是分别求黑色点和白色点所构成的树的直径。 当两个连通块连在了一起&#xff0c;假设它们的直径是 ( u 1 , v 1 ) &#xff0c; ( u 2 , v 2 ) (u_1,v_1)&#xff0c;(u_2,v_2) (u1​,v1​)&#xff0c;(u…

【程序填空】三维点坐标平移(增量运算符重载)

题目描述 定义一个三维点Point类&#xff0c;利用友元函数重载""和"--"运算符&#xff0c;并区分这两种运算符的前置和后置运算。 表示x\y\z坐标都1&#xff0c;--表示x\y\z坐标都-1 请完成以下程序填空 输入 只有一行输入&#xff0c;输入三个整数&a…

Linux运维工程师基础面试题整理(二)

Linux运维工程师基础面试题整理(二) 1. 如何配置Linux网络?请说出3种以上方法?2. 如何查询某个目录下的每个文件大小?3. 如何诊断ping不通服务器?4.在Linux中,如何让一个命令在后台运行?5. 如何查看Linux系统日志?6. 如何查看磁盘空间情况?7. 如何在Linux中查看和管理…

一个开源的工具类轮子是怎么造出来的

心路历程 为什么要做 在22年9月的某一天&#xff0c;在公司开需求评审时&#xff0c;接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员&#xff0c;在遇到这些问题时&#xff0c;第一反应是去github上找找有没有类似的开源框架。但是&#xff0c;出乎我意料…

2024年 电工杯 (B题)大学生数学建模挑战赛 | 大学生平衡膳食食谱的优化设计 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是电工杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 问题1&…

快手二面准备【面试准备】

快手二面准备【面试准备】 前言版权快手二面准备秋招一面中的问题实习一面中的问题计算机网络和操作系统论坛项目登录注册ThreadLocal代替session存储用户秒杀项目登录注册->阿里验证码->rpcsession为什么改为token实现&#xff0c;redis存储用户信息由binlog的用法->…

Python魔法学院:PySpider篇——网络世界的探险与征服

Hi&#xff0c;我是阿佑&#xff0c;迎来到Python魔法学院&#xff0c;今天阿佑要带大家学习的是PySpider篇——一门让你在网络世界中探险与征服的魔法课程。从环境搭建到高级功能应用&#xff0c;再到性能优化&#xff0c;每一个章节都是成为数据大师的必经之路&#xff01; 文…

为什么拼命赚钱:穷怕了

我内心深处比较自卑。 从小在农村长大&#xff0c;爸不管妈不爱。 这么说大家没感觉&#xff0c;从小什么都干&#xff0c;六岁开始做饭&#xff0c;每次开学都会全员大扫除&#xff0c;站在那里脚踩泥土地、眼神呆滞、双手无处安放、眼神都不敢直视的小伙子就是我&#xff0…

VS Code中使用 Anaconda 环境

在 Visual Studio Code (VS Code) 中使用 Anaconda 环境进行 Python 开发&#xff0c;可以充分利用 Anaconda 提供的包管理和虚拟环境功能&#xff0c;同时享受 VS Code 提供的强大开发工具和调试功能。以下是详细步骤&#xff1a; 1. 安装 Visual Studio Code 和 Anaconda 首…

JavaScript Window对象

一、BOM&#xff08;浏览器对象模型&#xff09; window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象。 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的。 所有通过var定义在全局作用域中的变量、…

GitLab的原理及应用详解(四)

本系列文章简介&#xff1a; 随着软件开发的不断进步和发展&#xff0c;版本控制系统成为了现代软件开发过程中不可或缺的一部分。而GitLab作为其中一种流行的版本控制工具&#xff0c;在软件开发领域享有广泛的应用。GitLab不仅提供了强大的版本控制功能&#xff0c;还集成了项…

四川古力科技抖音小店,创新科技点亮购物新体验

在这个数字化浪潮汹涌的时代&#xff0c;四川古力科技以其前瞻性的战略眼光和创新能力&#xff0c;闪耀于抖音小店这片电商新蓝海&#xff0c;开启了未来购物的新纪元。作为一家集技术研发、产品创新、市场营销于一体的科技型企业&#xff0c;古力科技不仅为消费者带来了前所未…

idea中显示git的Local Changes

1. 第一打开idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾选应用即可 4. 本地提交就会显示出来

ruoyi出现的那些bug

1、 npm install --registryhttps://registry.npm.taobao.org/element-ui request to https://registry.npm.taobao.org/element-ui failed, reason: certificate has expired 路径错误 ​ npm install https://registry.npmmirror.com 2、自定义模块401 {"msg"…

Google Earth Engine(GEE)深度学习入门教程-Python数据读入篇

Python数据读入篇 前置条件&#xff1a; GEE预处理影像导出保存为tfrecord的数据包&#xff0c;并下载到本地tensorflow的深度学习环境 本篇文章的目的主要是把Tfrecord格式的数据加载为tf可使用的数据集格式 设定超参数 首先需要设定导出时的波段名称和数据格式&#xff…