pywinauto實現windows視窗自動化操作
阿新 • • 發佈:2021-10-03
本章主要是通過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")