本章主要是通過pywinauto模塊實現對windows上的一些窗口應用進行自動化運行
pywinauto這幾天用下來感覺很方便也很穩定,但是有些軟件的title,class_name還是無法定位到,需要結合到別的模塊或方法實現自動化。
主要步驟:
- 啟動應用程序
- 連接應用程序
- 得到應用主窗口
- 通過pywinauto模塊內的方法對程序主窗口的控件進行操作
安裝
pip install pywinauto -i https://pypi.douban.com/simple # 安裝pywinauto模塊
檢查工具,通過這些工具能夠得到程序窗口和控件信息
- Inspect 是一種基於 Windows 的工具,通過該工具,您可以選擇任意 UI 元素並查看元素的可訪問性數據 。
https://accessibilityinsights.io/docs/en/windows/getstarted/inspect/ # inspct下載地址
- 推薦使用spy++,有查找窗口的功能,把准星對准窗口,就能得到窗口的信息

一些基礎的方法
from pywinauto.application import Application
import win32gui
import time
app = Application(backend='uia').start(r"d:\win_install\Nuke-12.2v2-win-x86-64-installer.exe") # 打開程序
time.sleep(3) # 等待程序啟動
nuke_handle = win32gui.FindWindow(0,
"Nuke 12.2v2 安裝") # 獲取窗口句柄,單純使用title連接程序,有時會報錯,通過title和句柄連接可以避免pywinauto.findwindows.ElementNotFoundError錯誤
app.connect(title="QQ", handle=nuke_handle)
mainwindow = app.window(title_re="QQ", handle=nuke_handle) # 獲取程序主窗口
mainwindow.print_control_identifiers() # 打印主窗口上的所有控件
得到的主窗口控件

窗口控件類型(包括但不限於下列)

針對這些窗口控件可以進行一些操作
# 獲取控件的文本內容
print(mainwindow.child_window(title="關閉", control_type="Button").texts())
# 對窗口截圖保存
pic = mainwindow.capture_as_image()
pic.save('01.png')
對菜單控件的一些操作
# 通過下標選擇菜單項
menu = window['menu']
print(menu.items())#獲取菜單的子菜單項
m = menu.item_by_index(1)
print(m)
# 通過路徑選擇菜單項
menu = window['menu']
print(menu.items())#獲取菜單的子菜單項
m = menu.item_by_path("文件->新建連接...")
print(m)
# 點擊菜單項
m.click_input()#點擊
鼠標方法

鍵盤方法

寫一個自動安裝Nuke軟件腳本
from pywinauto.application import Application
import time
import os
import win32gui
import pywinauto.keyboard as kb
# 啟動安裝程序程序
os.startfile(r"d:\win_install\Nuke-12.2v2-win-x86-64-installer.exe")
print("安裝程序啟動中,請稍等...")
for i in range(10):
time.sleep(1)
try:
if win32gui.FindWindow(0, "Nuke 12.2v2 安裝"):
break
except:
pass
nuke_handle = win32gui.FindWindow(0, "Nuke 12.2v2 安裝")
app = Application(backend="uia")
app.connect(title="Nuke 12.2v2 安裝", handle=nuke_handle)
mainwindow = app.window(title="Nuke 12.2v2 安裝", handle=nuke_handle)
mainwindow["下一步(&N) >"].click()
time.sleep(2)
mainwindow["我接受(&I)"].click()
time.sleep(2)
mainwindow["下一步(&N) >"].click()
time.sleep(2)
mainwindow["安裝(&I)"].click()
kb.send_keys("{VK_RETURN}") # 這里不知道怎么卡住了,改用鍵盤enter選擇安裝
print("等待安裝完成")
for i in range(600):
print(".")
time.sleep(3)
try:
mainwindow["完成(&F)"].click()
time.sleep(3)
break
except:
pass
print("nuke 安裝完成")
os.system("pause")
