最近小爬一直思忖着如何将之前写的一些半自动化程序转为全自动化,这其中就涉及到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-------------------------------------------------------------------
是否是很简单,赶忙试试吧!