使用Python完成SAP客户端的打开和系统登陆功能
作者:NewJune 发布时间:2021-02-28 17:12:29
最近小爬一直思忖着如何将以前写的一些半自动化程序转为全自动化,这其中就涉及到SAP的打开和登录过程。我们都知道,SAP原生的“脚本录制和回放”功能是在用户进入到某一个SAP”用户指定系统“后才可以启用:
也就是说,从这里开始,您可以通过脚本录制,生成用户名、密码的输入和SAP登录过程的完整代码;
那么我们的重点就转到了,如何通过Python完成SAP应用程序的打开并进入特定的”用户指定系统“,比如下图中红圈所示系统:
PS:由于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程序并通过捕获相应句柄来控制对应的窗口。当然,我们还要借助MicrosoftSpy++来捕获各个窗口的句柄、ID、类、文本等关键信息,用以简化我们的编程过程。
大体思考过程如下:
比如我现在要进入“R3生产系统”,SAP程序打开后,会默认高亮基于排名规则的第一位的系统,而我们的目标系统“位于第二位,(您可以通过修改排序手段、配合”名称字段“的修改,让您希望的系统默认排在第一位,不过小爬没有这样做),小爬尝试去捕获”R3生产系统“这个元素的句柄,然后完成双击操作,可惜通过win32gui.FindWindow、win32gui.FindWindowEx等都未能定位到它,如果您这样做成功了,也欢迎您留言告知。
我们不妨试试一个更简单直接的方法,对照上图,先捕获到③过滤器的句柄,使用sendmessage方法输入过滤条件(要登陆的系统名称),激活该条件,此时我们的目标系统②就会自然处于第一位且被”高亮“,然后我们捕获左上角①(登陆)的句柄,单击它进入到系统登陆界面,后续的登陆代码通过原生的SAP脚本录制方法得到,您也可以使用”Tracker“工具来快速录制出python下可用的SAP自动化代码(小爬之前的文章中简要介绍过该工具);
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-------------------------------------------------------------------
来源:https://www.cnblogs.com/new-june/p/11151458.html


猜你喜欢
- #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2020/02/11
- 最近在重构公司以前产品的前端代码,摈弃了以前的session-cookie鉴权方式,采用token鉴权,忙里偷闲觉得有必要对几种常见的鉴权方
- 解决案例一:今天公司服务器上所有的网站都出现问题,有的打开没有数据,有的直接是空白。我的第一反应就是数据库挂了。打开远程,进了系统,serv
- 这个游戏就是实现键盘上输入不同的数字,将圆分割成不同的几个部分,每部分用不同的颜色来实现。导入包导入随机包,pygame,系统包,time时
- 介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用so
- str_split不支持中文,利用mb_xx函数实现个/** * Convert a string to an array * @param
- (一)、tf.train.Saver()(1). tf.train.Saver() 是用来保存tensorflow训练模型的,默认保存全部参
- 前言我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程
- 一、定义与作用主键:表中能够唯一地辨别事物的属性。通过主键能够查询出表中一条完整的记录,同时使用主键能防止表中出现重复的记录,避免了数据的冗
- 实际应用时可能比较想获取VGG中间层的输出,那么就可以如下操作:import numpy as npimport torchfrom tor
- 无意中看到以前在电脑上保存的一个html页面,关于div水平垂直居中的问题。如何实现div水平垂直居中呢?1.已知宽高度水平垂直居中posi
- 下载,安装先检查系统中是否有mysql ,MariaDB,如有,先卸载rpm -qa | grep mysqlrpm -qa | grep
- 到现在为止,我们通过前面几篇博文的描述和分析,已经可以自动实现棋子、棋盘位置的准确判断,计算一下两个中心点之间的距离,并绘制在图形上,效果如
- <script type="text/javascript"> //那种方式移动 var choMove =
- 目录方案一:重建 Replicas前提条件优点缺点操作步骤MasterSlave方案二:使用percona-toolkit进行数据修复前提条
- 我就废话不多说了,大家还是直接看代码吧!绘制曲线:import timeimport numpy as npimport matplotli
- 前言这次,我们要用Pygame写一个Pong游戏先看看效果:需要的模块:Pygame在python文件同目录下新建resources文件夹,
- 本文实例为大家分享了python网络爬虫的笔记,供大家参考,具体内容如下(一) 三种网页抓取方法1、 正则
- vue阻止页面回退的方法如何阻止页面回退?VUE中跳转页面后,阻止返回的方法有很多种,这里就不一一列举,我是用vue-prevent-bro
- 本篇文章主要介绍了python OpenCV学习笔记之绘制直方图的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来