最近小爬一直思忖着如何將之前寫的一些半自動化程序轉爲全自動化,這其中就涉及到SAP的打開和登陸過程。咱們都知道,SAP原生的「腳本錄製和回放」功能是在用戶進入到某一個SAP」用戶指定系統「後才能夠啓用:
python
也就是說,從這裏開始,您能夠經過腳本錄製,生成用戶名、密碼的輸入和SAP登陸過程的完整代碼;編程
那麼咱們的重點就轉到了,如何經過Python完成SAP應用程序的打開並進入特定的」用戶指定系統「,好比下圖中紅圈所示系統:api
PS:因爲SAP啓動後選擇不一樣的視圖,界面會略有不一樣,下面演示的方法是在」瀏覽器視圖「、」工做區視圖「以及「樹視圖」下演示的,其餘啓動視圖下無效,因此若是您但願下面提到的方法在您電腦上生效,請務必確保您登錄後視圖屬於上面提到的視圖中的一種。慶幸的是,SAP客戶端會記錄您的用戶習慣,一旦您完成默認瀏覽視圖的設定,下次程序啓動時,程序會默認使用此視圖。瀏覽器
程序須要首先完成SAP 應用程序的自動啓動,python中的方法有不少種,我用到的方法以下:session
sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #您的saplogon程序本地完整路徑 subprocess.Popen(sap_app)
而後是用python完成激活SAP「指定用戶系統」,這裏須要您的python安裝win32com等組件,附上官方下載地址:pywin32 224app
有了它,咱們能夠輕易經過python來鏈接本地的win32程序並經過捕獲相應句柄來控制對應的窗口。固然,咱們還要藉助Microsoft Spy++ 來捕獲各個窗口的句柄、ID、類、文本等關鍵信息,用以簡化咱們的編程過程。工具
大致思考過程以下:ui
好比我如今要進入「R3生產系統」,SAP程序打開後,會默認高亮基於排名規則的第一位的系統,而咱們的目標系統「位於第二位,(您能夠經過修改排序手段、配合」名稱字段「的修改,讓您但願的系統默認排在第一位,不太小爬沒有這樣作),小爬嘗試去捕獲」R3生產系統「這個元素的句柄,而後完成雙擊操做,惋惜經過win32gui.FindWindow、win32gui.FindWindowEx等都未能定位到它,若是您這樣作成功了,也歡迎您留言告知。spa
咱們不妨試試一個更簡單直接的方法,對照上圖,先捕獲到③過濾器的句柄,使用sendmessage方法輸入過濾條件(要登錄的系統名稱),激活該條件,此時咱們的目標系統②就會天然處於第一位且被」高亮「,而後咱們捕獲左上角①(登錄)的句柄,單擊它進入到系統登錄界面,後續的登錄代碼經過原生的SAP腳本錄製方法獲得,您也能夠使用」Tracker「工具來快速錄製出python下可用的SAP自動化代碼(小爬以前的文章中簡要介紹過該工具);code
PS:
程序中要考慮SAP的啓動、系統雙擊打開等都須要必定的時間消耗,因此要添加延遲來解決,而延遲時間的長短能夠經過while True的循環配合Try except方法來靈活調整,整個過程用python實現是這樣的:
#-Begin----------------------------------------------------------------- #-Includes-------------------------------------------------------------- import sys, win32com.client import win32api,win32gui,win32con,win32ui,time,os,subprocess #-Sub Main-------------------------------------------------------------- def Main(): sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #您的saplogon程序本地完整路徑 subprocess.Popen(sap_app) time.sleep(1) flt=0 while flt==0: try: hwnd = win32gui.FindWindow(None,"SAP Logon 740") flt=win32gui.FindWindowEx(hwnd,None,"Edit", None) #capture handle of filter except: time.sleep(0.5) win32gui.SendMessage(flt,win32con.WM_SETTEXT,None,"R3生產系統") win32gui.SendMessage(flt,win32con.WM_KEYDOWN,win32con.VK_RIGHT,0) win32gui.SendMessage(flt,win32con.WM_KEYUP,win32con.VK_RIGHT,0) time.sleep(0.1) dlg = win32gui.FindWindowEx(hwnd,None,"Button", None) #登錄(0) win32gui.SendMessage(dlg,win32con.WM_LBUTTONDOWN,0) win32gui.SendMessage(dlg,win32con.WM_LBUTTONUP,0) SapGuiAuto = win32com.client.GetObject("SAPGUI") if not type(SapGuiAuto) == win32com.client.CDispatch: return application = SapGuiAuto.GetScriptingEngine if not type(application) == win32com.client.CDispatch: SapGuiAuto = None return connection = application.Children(0) if not type(connection) == win32com.client.CDispatch: application = None SapGuiAuto = None return time.sleep(2) flag=0 while flag==0: try: session = connection.Children(0) flag=1 except: time.sleep(0.5) if not type(session) == win32com.client.CDispatch: connection = None application = None SapGuiAuto = None return session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "username" #這次放入您的SAP登錄用戶名 session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "password" #這次放入您的SAP登錄密碼 session.findById("wnd[0]").sendVKey(0) """下面演示了使用mm03查看物料1000000000000的狀態後再退回sap首頁的過程""" session.findById("wnd[0]/tbar[0]/okcd").text = "mm03" session.findById("wnd[0]").sendVKey(0) session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "1000000000000" session.findById("wnd[0]").sendVKey(0) session.findById("wnd[1]").sendVKey(0) session.findById("wnd[0]/tbar[0]/okcd").text = "/n" session.findById("wnd[0]").sendVKey(0) #>Insert your SAP GUI Scripting code here< #-Main------------------------------------------------------------------ if __name__ == "__main__": Main() #-End-------------------------------------------------------------------
是否是很簡單,趕忙試試吧!