Python結合Pywinauto 進行 Windows UI 自動化


轉:Python結合Pywinauto 進行 Windows UI 自動化

https://blog.csdn.net/z_johnny/article/details/52778064

說明:
Pywinauto是基於Python開發的,用於自動化測試的腳本模塊,主要操作於Windows標准圖形界面。它可以允許你很容易的發送鼠標、鍵盤動作給Windows的對話框和控件。
其中,最主要功能為對windows標准控件的一系列動作可編程處理。包括對窗口的指定、鼠標或鍵盤操作、獲得控件屬性等等。程序的開始為對所需應用的啟 動或連接。獲得程序連接后,pywinauto通過窗口的名稱、類名、是否可見等屬性尋找匹配的窗口,進而通過類似方法尋找用戶所需的控件,並獲得相應的 句柄。之后,用戶可通過易理解的編程方式對指定控件進行相關操作的編程,包括鼠標點擊、鍵盤輸入、判斷控件間關系、獲取控件屬性等。

文檔參考:
pywinauto 0.5.4 documentation
Windows GUI Automation with Python
pywinauto官網,帶Demo example
在中文windows下使用pywinauto進行窗口操作
用pywinauto進行win32應用程序的測試

舉個例子

#! /usr/bin/env python
#coding=GB18030

'''
FuncName: johnny-pywinauto.py
Desc: study pywinauto
Date: 2016-10-10 14:30
Author: johnny
Home:http://blog.csdn.net/z_johnny
'''

from pywinauto import application
import SendKeys
import time

class Pywin(object):
    """
    pywin framwork main class
    tool_name : 程序名稱,支持帶路徑
    windows_name : 窗口名字
    """
    SLEEP_TIME = 1

    def __init__(self):
        """
        初始化方法,初始化一個app
        """
        self.app = application.Application()

    def run(self, tool_name):
        """
        啟動應用程序
        """
        self.app.start_(tool_name)
        time.sleep(1)

    def connect(self, window_name):
        """
        連接應用程序
        app.connect_(path = r"c:\windows\system32\notepad.exe")
        app.connect_(process = 2341)
        app.connect_(handle = 0x010f0c)
        """
        self.app.connect_(title = window_name)
        time.sleep(1)

    def close(self, window_name):
        """
        關閉應用程序
        """
        self.app[window_name].Close()
        time.sleep(1)

    def max_window(self, window_name):
        """
        最大化窗口
        """
        self.app[window_name].Maximize()
        time.sleep(1)

    def menu_click(self, window_name, menulist):
        """
        菜單點擊
        """
        self.app[window_name].MenuSelect(menulist)
        time.sleep(1)

    def input(self, window_name, controller, content):
        """
        輸入內容
        """
        self.app[window_name][controller].TypeKeys(content)
        time.sleep(1)

    def click(self, window_name, controller):
        """
        鼠標左鍵點擊
        example:
        下面兩個功能相同,下面支持正則表達式
        app[u'關於“記事本”'][u'確定'].Click()
        app.window_(title_re = u'關於“記事本”').window_(title_re = u'確定').Click()
        """
        self.app[window_name][controller].Click()
        time.sleep(1)

    def double_click(self, window_name, controller, x = 0,y = 0):
        """
        鼠標左鍵點擊(雙擊)
        """
        self.app[window_name][controller].DoubleClick(button = "left", pressed = "",  coords = (x, y))
        time.sleep(1)

    def right_click(self, window_name, controller, order):
        """
        鼠標右鍵點擊,下移進行菜單選擇
        window_name : 窗口名
        controller:區域名
        order : 數字,第幾個命令
        """
        self.app[window_name][controller].RightClick()
        for down in range(order):
                SendKeys.SendKeys('{DOWN}')
                time.sleep(0.5)
        SendKeys.SendKeys('{ENTER}')
        time.sleep(1)

if __name__ ==  "__main__":
    app = Pywin()
    # 記事本例子
    tool_name = "notepad.exe"
    # 通過Spy++ 獲取window_name,即標題文本
    window_name = u"無標題 - 記事本"
    menulist = u"幫助->關於記事本"
    # 通過Spy++ 獲取controller,即窗口類名
    controller = "Edit"
    content = u"johnny"
    window_name_new = content + ".txt"
    # 啟動程序,記事本只能開一個
    app.run(tool_name)
    app.connect(window_name)
    app.max_window(window_name)
    app.menu_click(window_name,menulist)
    app.click(u'關於記事本', u'確定')
    app.input(window_name,controller,content)
    # Ctrl + a 全選
    app.input(window_name,controller,"^a")
    # 選擇復制
    app.right_click(window_name,controller,3)
    #選擇粘貼
    app.right_click(window_name,controller,4)
    SendKeys.SendKeys('{ENTER}')
    # Ctrl + v 粘貼
    app.input(window_name,controller,"^v")
    # Ctrl + s 保存
    app.input(window_name,controller,"^s")
    # 輸入文件名
    app.input(u"另存為",controller,content)
    # 保存
    app.click(u"另存為","Button")
    try:
        app.click(u"確認另存為","Button")
    except:
        pass
    finally:
        app.close(window_name_new)

其他

1.安裝

pip install pywinauto
pip install SendKeys
# SendKeys 需要VCForPython27.msi環境支持  

VCForPython27(SendKeys需要).msi 官方下載

2.SendKeys中特殊字符的鍵代碼

BACKSPACE {BACKSPACE}、{BS} 或 {BKSP} 
BREAK {BREAK} 
CAPS LOCK {CAPSLOCK} 
DEL 或 DELETE {DELETE} 或 {DEL} 
DOWN ARROW(下箭頭) {DOWN} 
END {END} 
ENTER {ENTER} 或 ~ 
ESC {ESC} 
HELP {HELP} 
HOME {HOME} 
INS 或 INSERT {INSERT} 或 {INS} 
LEFT ARROW(左箭頭) {LEFT} 
NUM LOCK {NUMLOCK} 
PAGE DOWN {PGDN} 
PAGE UP {PGUP} 
PRINT SCREEN {PRTSC}(保留,以備將來使用) 
RIGHT ARROW(右箭頭) {RIGHT} 
SCROLL LOCK {SCROLLLOCK} 
TAB {TAB} 
UP ARROW(上箭頭) {UP} 
F1 {F1} 
F2 {F2} 
F3 {F3} 
F4 {F4} 
F5 {F5} 
F6 {F6} 
F7 {F7} 
F8 {F8} 
F9 {F9} 
F10 {F10} 
F11 {F11} 
F12 {F12} 
F13 {F13} 
F14 {F14} 
F15 {F15} 
F16 {F16} 
數字盤加號 {ADD} 
數字盤減號 {SUBTRACT} 
數字盤乘號 {MULTIPLY} 
數字盤除號 {DIVIDE}

 

 

 

 

 

 


免責聲明!

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



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