1. 程式人生 > 其它 >pywinauto實現windows視窗自動化操作

pywinauto實現windows視窗自動化操作

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