使用Python完成SAP客户端的打开和系统登陆
最近小爬一直思忖着如何将以前写的一些半自动化程序转为全自动化,这其中就涉及到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程序并通过捕获相应句柄来控制对应的窗口。当然,我们还要借助Microsoft Spy++ 来捕获各个窗口的句柄、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 = ""
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 GUI Script操作sap的简易教程
众所周知,如果要用Python做一些桌面WIN32应用的自动化工作,就需要用到著名的pywin32尤其是其中的win32com.client模块,pywin32的安装不能直接通过pip install ...
- 【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍
Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍 FTP 是File Transfer Protocol(文件传输协议)的英文简称,它基于传输层协议TCP建立,用于Interne ...
- python驱动SAP完成数据导出(二)
在上一篇 python驱动SAP完成数据导出(一)中,我们提到了数据导出前,SAP布局的重要性,如何识别当前布局模式,以及如何切换到想要的布局.本篇小爬将着重讲讲数据导出的注意事项. 我们可以通过如下 ...
- Python文件使用“wb”方式打开,写入内容
Python文件使用"wb"方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. 所以写入 ...
- 再也不必当心我的密码了,多个SAP 客户端自动输入密码
再也不必当心我的密码了,多个SAP 客户端自动输入密码问题: 通常对于OFFICE人员来说,一天有很多的密码,OA密码,多个ERP密码,邮箱密码,代理密码等等,还经常60天过期之类,实在是焦头烂额. ...
- 基于Python的ModbusTCP客户端实现
Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口.以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业 ...
- SAP客户端 测试机、开发机、生产机
SAP客户端 测试机.开发机.生产机 客户端(即Client),是SAP组织架构里最高层的组织单元,所有数据,包括静态数据(科目.客户.供应商.物料.资产等).业务数据(采购订单.销售订单. ...
- 原!!win7-64 安装python的 redis客户端库
安装python的redis客户端库 本人系统已装python2.7 利用cmd命令行: 1.cmd-->python -->>>进入python命令下 >>> ...
- java在线聊天项目0.4版本 制作服务端接收连接,客户端连接功能 新增客户端窗口打开时光标指向下边文本域功能,使用WindowListener监听WindowAdapter
建一个服务端类ChatServer,用于设置端口接收连接 package com.swift; import java.io.IOException; import java.net.ServerSo ...
随机推荐
- hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目9 : Minimum【线段树】
https://hihocoder.com/problemset/problem/1586 线段树操作,原来题并不难..... 当时忽略了一个重要问题,就是ax*ay要最小时,x.y可以相等,那就简单 ...
- H5页面在iOS网页中的数字被识别为电话号码,字体颜色变黑色,且颜色不可改变
解决办法:在html中添加代码: <meta name="format-detection" content="telephone=no" />
- web移动开发小贴士
1.判断手机类型 var u = navigator.userAgent; || u.indexOf(; //android var isiOS = !!u.match(/\(i[^;]+;( U;) ...
- 【Vue】基于nodejs的vue项目打包编译部署
一·项目编译 1·进入项目目录下的终端执行命令 npm run build 正常情况如下图,如遇到错误不会编译成功,且编译后的html文件不能正常渲染. 2·编译完成后进入项目下的dist目录运行生成 ...
- JSX语法及特点介绍
1.1 基本语法 1)自定义组件名首字母大写:元素名即组件名,首字母需要大写.首字母小写时React会以为这是HTML的标准标签,因此自定义的组件名需要首字母大写,否则会报错. 2)嵌套:在rende ...
- DOM事件和一些实用笔记
let el = document.body.querySelector("style[type='text/css'], style:not([type])");返回HTML文档 ...
- Fragment开发实战(二)
由于在Android的实现机制中Fragment和Activity会被分别实例化为两个不相干的对象,他们之间的联系由Activity的一个成员对象Fragmentmanager来维护.Fragment ...
- poj 1920 Towers of Hanoi
Towers of Hanoi Time Limit: 3000MS Memory Limit: 16000K Total Submissions: 2213 Accepted: 986 Ca ...
- 智课雅思短语---三、unshakable duty
智课雅思短语---三.unshakable duty 一.总结 一句话总结:不可推卸的义务 unshakable duty 1.satisfy/ meet the needs of…? 满足需求 2. ...
- Python--day64--Bootstrap样式的使用
Bootstrap样式网址:https://v3.bootcss.com