
Pywinauto
简介
pywinauto 是一款基于 Python 的开源库,用于自动化测试 Windows 平台的 GUI 应用程序。
本身遵守BSD-3-Clause license
开源协议
它能够模拟用户的键盘和鼠标操作,以及获取和修改应用程序的控件属性。pywinauto 提供了简单而强大的 API,使得开发人员可以轻松地编写自动化测试脚本。
环境安装
安装pywinauto环境前先确认python环境安装无误!
pip安装
pip install pywinauto
手动安装
必须python环境包安装
下载pywinauto
解压后运行
python setup.py install
GUI对象检查工具
为了定位&获取要测试的APP画面中,各个窗口,按钮,文言等元素的属性,需要使用GUI对象检查工具
常用的检查工具:
1. Inspect(定位元素工具(uia))
2. Spy++ (定位元素工具(win32))
SPY++ 是由微软开发的一款强大的系统级工具,专为开发者设计,用于深入理解和分析Windows操作系统下的窗口管理、消息传递机制、进程与线程行为。
这款工具以其直观的界面和详尽的信息展示,成为程序员不可或缺的辅助工具之一,尤其适合进行GUI开发、调试及Windows API的学习研究。
下载
本身集成于Visual Studio,不能单独使用
但是国内大佬已经提取成功
3. UI Spy (定位元素工具)
4. Swapy(可简单生成pywinauto代码)
在选择工具时!
先要确认一下要测试的对象APP,可以支持使用哪种可访问技术
如FUJIFILM TETHER APP,在使用Inspect对【PREVIEW】按钮进行检查后,可见此软件为【MS UI Automation】,即对应【uia】
程序里面的任意一个部位其实都是控件,在inspect的控件树中都可以找到,是一层一层分级别的,可以一个个点开所有控件
可见由Inspect获取的控件为树状结构层级、这样就可以快速获取控件的ClassName等等
基础使用
导入库
在开始之前,首先导入pywinauto
库:
from pywinauto.application import Application
启动应用程序
使用Application()
类可以启动一个Windows应用程序。
例如,启动记事本应用:
app = Application().start("notepad.exe")
连接到已运行的应用程序
如果应用程序已经在运行中,使用connect()
方法来连接到它:
app = Application(backend="uia").connect(title="Notepad")
查找窗口
pywinauto
根据窗口标题、类名或其他属性来查找窗口。
例如,查找记事本窗口:
app = Application(backend="uia").connect(title="Notepad")
notepad = app.Notepad
模拟键盘和鼠标操作
pywinauto
模拟键盘和鼠标操作。
例如,发送键盘输入:
notepad.type_keys("Hello, World!")
模拟鼠标点击:
notepad.menu_select("File->Save")
获取和操作控件
使用print_control_identifiers()
来查看窗口中所有可用控件的标识符:
notepad.print_control_identifiers()
然后,使用这些标识符来获取和操作控件,例如,点击"保存"按钮:
notepad.Save.click()
自动化测试
pywinauto
还可以用于自动化测试。创建测试用例来模拟用户操作,并验证应用程序的行为。
def test_notepad():
app = Application(backend="uia").start("notepad.exe")
notepad = app.Notepad
notepad.type_keys("Hello, World!")
notepad.menu_select("File->Save")
notepad.SaveAs.FileNameEdit.type_keys("test.txt")
notepad.SaveAs.Save.click()
assert "test.txt - Notepad" in notepad.child_window(title_re=".*test.txt - Notepad").window_text()
test_notepad()
高级应用
图像识别
pywinauto
支持图像识别,在不知道窗口句柄的情况下查找控件。这对于一些特定的场景非常有用。
window = app.top_window()
control = window.child_window(class_name="Button", found_index=0)
实例
from pywinauto import Application
# 连接 PC 应用的两种方式
# app = Application(backend="uia").start("notepad.exe")
app = Application(backend="uia").connect(process=32120)
print(app.process)
# 获取主窗口
top_window = app.window(title="无标题 - Notepad", control_type="Window")
# 打印控件菜单树结构
top_window.print_control_identifiers()
# 获取输入框
document = top_window.child_window(control_type="Document")
document.print_control_identifiers()
# 标出是否正确选中输入框
document.draw_outline(colour='red')
# 写入
document.click_input()
document.type_keys(keys="Your text here", with_spaces=True)
from pywinauto import Application
from pywinauto.application import Application
import time
app = Application(backend="uia").start(r"C:\Program Files\FUJIFILM Pixel Shift Combiner\PixelShiftCombiner.exe")
#app = Application().connect(title="FUJIFILM Pixel Shift Combiner")
#print(app.process)
dlg = app.window(title="FUJIFILM Pixel Shift Combiner")
#dlg.print_control_identifiers()
# widget = dlg.child_window(title="ジョブ登録", control_type="Button")
# widget.click()
# time.sleep(2)
# xButton = dlg.child_window(title="キャンセル",control_type="Button")
# xButton.click()
# time.sleep(2)
# dlg.close()
time.sleep(2)
jobDelete = dlg.child_window(title="ジョブ削除", control_type="Text")
jobDelete.click()