本章主要是通過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")