网站开发 兼职万网的网站建设是什么
前言
上一篇文章地址:
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} | 
