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")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM