Python驅動SAP GUI完成自動化(五)

  小爬前幾篇SAP GUI自動化相關的博文提到過,我們可以藉助tracker工具,在手工利用SAP GUI完成一系列操作(查詢、導表、創建憑證等)後,可以快速得到python腳本,我們再結合python的語法特性稍加修改,把邏輯分支、循環分支、條件分支等加入其中,就可以做成一段自動化的腳本。

  現實的辦公世界裏,我們在SAP GUI中輸入的外部參數很多都會觸發SAP的報警彈窗、消息(報警、錯誤、信息、成功等多種狀態),我們可以利用SAP原生的一些API來捕獲我們的報警彈窗、SAP左下角消息狀態、消息文本等,利用這些來提高腳本工具的魯棒性;

  

 

 

 

  比如我們可以拿到SAP左下角的消息,利用RE正則表達式或者其他字符串解析方法-解析得到自動創建的內部訂單號,可以根據消息的狀態(報警還是正常消息、還是錯誤消息)來決定程序是否要繼續,捕獲某個SAP Session下的窗口個數(不爲1,說明程序彈出了子窗口),來決定是否要處理子窗口,這些都是實際業務中會遇到的太正常不過的需求。甭着急,小爬都有招數一一應對。

  下面這段代碼演示瞭如何利用python和win32com連接SAP,同時捕獲當前會話下的窗口數量(是否有子窗口),以及如何關閉彈窗:

import win32com.client,win32con
'''連接SAP,需要提前安裝pywin32庫'''
SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connectionCnt = application.Children.count
if connectionCnt==0:
    session = None
    connection = None
    application = None
    SapGuiAuto = None   
connection = application.Children(0)
session=connection.Children(0) #得到第一個session

sapText=session.findById("wnd[0]").text #得到GUI主窗口的窗口標題

'''獲取當前session下的窗口數量'''
cnt=len(session.children) # 如果有報警信息,則會顯示兩個彈窗,需要關閉SAP報警彈窗
if cnt==2:
    session.findById("wnd[1]/tbar[0]/btn[0]").press()  # 關閉子窗口,消除彈窗報警  

  接下來這段腳本則演示了,如何獲取SAP左下角的消息狀態、消息文本,並進行後續處理:

import win32com.client,win32con
import tkinter
import tkinter.messagebox

'''連接SAP,需要提前安裝pywin32庫'''
SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connectionCnt = application.Children.count
if connectionCnt==0:
    session = None
    connection = None
    application = None
    SapGuiAuto = None   
connection = application.Children(0)
session=connection.Children(0) #得到第一個session

'''比如創建內部訂單最後一個環節,點擊保存後,捕獲內部訂單號'''
orderMessageText=session.findById("wnd[0]/sbar/pane[0]").text #得到SAP左下角消息,即SAP創建好的內部訂單號,進行存儲
if session.findById("wnd[0]/sbar").messageType !="S": #消息類型不等於S,意味着沒有成功創建內部訂單號,或者存在報警信息
    root = tkinter.Tk()
    root.withdraw()
    tkinter.messagebox.showwarning('*_*',orderMessageText)  # 利用tkinter生成GUI彈窗,講SAP消息反應在我們自制的彈窗上
    os._exit(0)    
internalOrderNo=orderMessageText.split(" ")[1] #解析消息文本,提取內部訂單號

我們可以利用SAP GUI腳本幫助,查詢到SAP狀態欄對象的消息類型屬性,如下:

 

 

  這個例子也再次驗證了,腳本錄製得到的代碼只是基礎,它遠不夠靈活,熟悉SAP scripting API(對象、屬性、方法),並靈活運用到我們的自動化腳本中,對代碼的靈活性、魯棒性的提升是肉眼可見的。感興趣的童鞋,趕緊試試吧!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章