概述
Pywinauto 是一個用于自動化 Windows GUI 應用程序的 Python 庫,適用于自動化測試、數據錄入和其他重復性桌面操作。
快速參考表
方面 | 方法/屬性示例 | 說明 |
---|---|---|
安裝 | pip install pywinauto | 安裝庫 |
后端選擇 | Application(backend="uia") 或 Application(backend="win32") | 根據應用程序技術選擇后端 |
啟動應用 | app.start("notepad.exe") | 啟動應用程序 |
連接應用 | app.connect(process=進程ID) | 連接到已運行的應用程序 |
定位窗口 | app.window(title='無標題 - 記事本') | 通過標題定位窗口 |
打印控件標識 | dlg.print_control_identifiers() | 打印窗口中所有控件的標識信息 |
定位控件 | dlg.child_window(title="確定", control_type="Button") | 使用多種方式定位控件 |
操作控件 | .click_input() , .type_keys("文本") | 點擊控件、輸入文本 |
鼠標操作 | pywinauto.mouse.click(button='left', coords=(x, y)) | 模擬鼠標點擊 |
鍵盤操作 | pywinauto.keyboard.send_keys('{ENTER}') | 模擬鍵盤按鍵 |
菜單操作 | dlg.menu_select("文件->另存為") | 選擇菜單項 |
詳細使用指南
1. 安裝與導入
pip install pywinauto
from pywinauto import Application
from pywinauto import findwindows
from pywinauto import mouse, keyboard
2. 后端選擇策略
- “uia”:適用于現代應用程序(WPF, WinForms, Qt5, 瀏覽器應用等)
- “win32”:適用于傳統舊式應用程序(MFC, VB6, VCL 等)
選擇建議:使用 Inspect.exe(uia)或 Spy++(win32)查看控件屬性,選擇顯示信息更全面的對應后端。
3. 啟動或連接應用程序
啟動新應用:
app = Application(backend="uia").start("notepad.exe")
連接已運行應用:
# 通過進程ID連接
app = Application(backend="uia").connect(process=1234)# 通過窗口標題連接
app = Application(backend="uia").connect(title="無標題 - 記事本")# 通過窗口句柄連接
handle = findwindows.find_windows(title='無標題 - 記事本', class_name='Notepad')[0]
app = Application().connect(handle=handle)
4. 定位窗口和控件
窗口定位:
dlg = app.window(title='無標題 - 記事本')
dlg = app.window(title_re=".*記事本.*") # 模糊匹配
控件識別:
dlg.print_control_identifiers() # 關鍵步驟:查看所有控件結構
精確定位控件:
# 多條件組合定位
ok_button = dlg.child_window(title="確定", auto_id="Button1", control_type="Button")# 按控件類型定位
edit_box = dlg.child_window(control_type="Edit")
5. 控件操作
點擊操作:
ok_button.click_input() # 推薦:模擬鼠標點擊
ok_button.click() # 替代方式
文本輸入:
edit_box.type_keys("你好,pywinauto!{ENTER}") # 支持特殊按鍵
edit_box.set_text("直接設置文本") # 直接設置文本
菜單操作:
dlg.menu_select("文件->另存為")
列表/組合框操作:
combo_box = dlg.child_window(control_type="ComboBox")
combo_box.select("選項一")
6. 等待機制
# 等待窗口存在
dlg.wait("exists", timeout=10)# 等待控件可見
ok_button.wait("visible", timeout=5)# 判斷控件存在性
if ok_button.exists():print("控件存在")
7. 完整示例:操作記事本
from pywinauto import Application
from pywinauto.timings import wait_until# 啟動記事本
app = Application(backend="uia").start("notepad.exe")# 連接到記事本窗口
dlg = app.window(title='無標題 - 記事本')# 輸入文字
edit = dlg.child_window(control_type="Edit")
edit.type_keys("Hello, Pywinauto!{ENTER}This is a new line.")# 菜單操作
dlg.menu_select("文件->另存為")# 操作保存對話框
save_dlg = app.window(title="另存為")
save_dlg.wait("exists", timeout=5)
filename_edit = save_dlg.child_window(control_type="Edit")
filename_edit.type_keys("my_document.txt")
save_button = save_dlg.child_window(title="保存", control_type="Button")
save_button.click_input()# 等待和清理
wait_until(10, 0.5, lambda: dlg.exists())
# app.kill() # 強制結束進程
8. 推薦工具
- Inspect.exe(Windows SDK):uia 后端最佳調試工具,支持跟蹤焦點和光標
- Spy++(Visual Studio):win32 后端控件屬性查看工具
?? 注意事項
- 控件定位:優先使用
auto_id
或control_type
等穩定屬性組合,避免依賴易變的title
或坐標 - 時機處理:使用
wait
方法替代固定的time.sleep
,確保應用程序響應 - 權限要求:以管理員身份運行腳本以確保進程訪問權限
- 兼容性:Windows 版本和應用程序更新可能影響腳本穩定性,需要定期維護
總結
Pywinauto 提供了強大的 Windows GUI 自動化能力,通過合理選擇后端、精確控件定位和適當的等待機制,可以構建穩定可靠的自動化腳本。多使用 Inspect 等工具進行控件分析,能夠顯著提高開發效率。