python篇-pywinauto使用-持续更新

2024-05-24 11:44

本文主要是介绍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类的使用方法会更有帮助。

这篇关于python篇-pywinauto使用-持续更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/998313

相关文章

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅