Python自动化SAP登录:从启动到系统选择的全流程实现
本文详细介绍如何利用Python脚本实现SAP客户端的自动启动及指定系统的登录流程。通过调用subprocess启动程序,结合win32com和win32gui库获取窗口句柄,利用SendMessage模拟输入过滤条件,使目标系统高亮后自动登录。文中提供了处理窗口延迟、句柄捕获及SAP原生脚本集成的完整代码逻辑,适用于浏览器、工作区及树视图模式。
SAP自动化登录的背景与难点
近期,作者致力于将以往半自动化的操作流程升级为全自动化处理,其中关键一环便是实现SAP客户端的自动打开与登录。通常,SAP原生的“脚本录制与回放”功能仅在用户成功进入某个特定的“用户指定系统”后才能启用,这意味着我们需要先解决前置的启动与选择问题。

一旦成功进入指定系统,即可通过脚本录制功能,自动生成包含用户名、密码输入及完整SAP登录过程的代码片段。
因此,本文的核心议题转向:如何利用Python程序自动启动SAP应用程序,并精准进入如红圈所示的特定“用户指定系统”。



需要注意的是,SAP启动后若选择不同的视图模式,界面布局会有所差异。下文演示的方法适用于“浏览器视图”、“工作区视图”以及“树视图”这三种模式。若您的SAP客户端默认使用其他视图,该方法可能无效。建议用户将默认视图设置为上述三种之一,因为SAP客户端会记忆用户的视图偏好,下次启动时将自动应用该设置。

SAP客户端自动启动与依赖配置
程序的第一步是自动启动SAP应用程序。在Python中实现此功能有多种方式,作者采用的方法如下所示。
sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #您的saplogon程序本地完整路径
subprocess.Popen(sap_app)接下来,使用Python激活SAP中的“指定用户系统”。这需要确保Python环境中已安装win32com等相关组件,官方下载地址为:pywin32 224。

借助该组件,Python可以连接本地Win32程序,并通过捕获相应的窗口句柄来控制窗口行为。此外,还需借助Microsoft Spy++工具来捕获各个窗口的句柄、ID、类名及文本等关键信息,从而简化编程过程。

基于句柄捕获的系统选择策略
整体的实现思路如下。

以进入“R3生产系统”为例,SAP程序启动后,默认会高亮显示按排名规则排序的第一位系统,而我们的目标系统位于第二位(虽然可以通过调整排序规则或修改名称字段使目标系统默认排在首位,但此处未采用此策略)。作者尝试通过win32gui.FindWindow或FindWindowEx等方法直接捕获“R3生产系统”元素的句柄并执行双击操作,但未能成功定位。若读者有成功的方案,欢迎留言分享。
通过过滤器定位与登录界面进入
我们可以尝试一种更简单直接的方法:参考上图,首先捕获编号③过滤器的句柄,使用SendMessage方法输入过滤条件(即目标系统名称),激活该过滤条件。此时,目标系统②会自动位于第一位并被高亮显示。随后,捕获左上角编号①(登录)的句柄并单击,即可进入系统登录界面。后续的登录代码可通过SAP原生的脚本录制功能获取,您也可以使用“Tracker”工具快速生成适用于Python的SAP自动化代码(该工具在作者之前的文章中已有简要介绍)。

补充说明:
延时处理与完整代码实现
在程序执行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-------------------------------------------------------------------至此,关于使用Python完成SAP客户端打开及系统登录的文章介绍完毕。如需了解更多Python与SAP登录相关的内容,请搜索本站过往文章或继续浏览后续相关文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













