简介

pywinauto 是一款基于 Python 的开源库,用于自动化测试 Windows 平台的 GUI 应用程序。

本身遵守BSD-3-Clause license开源协议

http://renew7.fun:8090/archives/bsd-license

它能够模拟用户的键盘和鼠标操作,以及获取和修改应用程序的控件属性。pywinauto 提供了简单而强大的 API,使得开发人员可以轻松地编写自动化测试脚本。

环境安装

安装pywinauto环境前先确认python环境安装无误!

pip安装

pip install pywinauto

手动安装

  1. 必须python环境包安装

  1. 下载pywinauto

https://github.com/pywinauto/pywinauto/releases

  1. 解压后运行

python setup.py install

GUI对象检查工具

为了定位&获取要测试的APP画面中,各个窗口,按钮,文言等元素的属性,需要使用GUI对象检查工具

常用的检查工具:

1. Inspect(定位元素工具(uia))

https://github.com/blackrosezy/gui-inspect-tool

2. Spy++ (定位元素工具(win32))

SPY++ 是由微软开发的一款强大的系统级工具,专为开发者设计,用于深入理解和分析Windows操作系统下的窗口管理、消息传递机制、进程与线程行为。

这款工具以其直观的界面和详尽的信息展示,成为程序员不可或缺的辅助工具之一,尤其适合进行GUI开发、调试及Windows API的学习研究。

下载

本身集成于Visual Studio,不能单独使用

但是国内大佬已经提取成功

https://gitcode.com/open-source-toolkit/c612f/blob/main/SPY%20%20%2016.00.28803.zip

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()

句柄模拟

https://blog.51cto.com/u_16099323/9782374

API

https://pywinauto.readthedocs.io/en/latest/