小爬前幾篇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(對象、屬性、方法),並靈活運用到我們的自動化腳本中,對代碼的靈活性、魯棒性的提升是肉眼可見的。感興趣的童鞋,趕緊試試吧!