前言
上一篇文章地址:
pywinauto:Windows桌面应用自动化测试(六)-CSDN博客
下一篇文章地址:
pywinauto:Windows桌面应用自动化测试(八)_pywinauto如何获取元素-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} |