众所周知,如果要用Python做一些桌面WIN32应用的自动化工作,就需要用到著名的pywin32尤其是其中的win32com.client模块,pywin32的安装不能直接通过pip install方法,奉上pywin32的官方github链接:https://github.com/mhammond/pywin32/releases。选择与桌面系统版本、python版本对应的版本安装即可:

如果一切正常,在Ipython中导入该模块时不会报异常!如:

In [1]: import win32com.client

接下拉就是建立与sap GUI的连接,如下:

     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 session = connection.Children(0)
if not type(session) == win32com.client.CDispatch:
connection = None
application = None
SapGuiAuto = None
return

代码的剩余部分可以通过sap原生的“脚本录制与回放”功能生成vbs脚本语句,直接插入python代码中即可!

需要强调的是,脚本录制功能并不会记录下所有鼠标键盘操作,过程中如果有些窗口是操作系统本身窗口,依旧需要结合windows句柄的捕获、结合sendmessage、postmessage等win32 API函数来处理。

当然,还需要查阅sap gui script的帮助文件,里面会列出所有的sap底层对象的属性、方法、对应的参数类型、数量等,界面如下:

在我的一项实际工作中,需要获得一个shell表单的某个类似于excel 单元格的值,表格是ALV格式的,但是实际录制中没法录制到单元格值,也许你绞尽脑汁,最后通过其他方法(比如 用sendkey结合 ctrl + Y,CTRL + C)达到了同样的效果,但是笔者依然推荐用sap script 原生的API来解决。通过查阅SAP GUI知道它属于“GuiGridView Object”,具有方法“GetCellValue Method”,方法如下:

Public Function GetCellValue( _
ByVal Row As Long, _
ByVal Column As String _
) As String

  其中column参数为字符串string类型,通过录制sap脚本,双击对应可以录制到列名称,通常录制代码类似:

session.findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell").currentCellColumn = "SGTXT"

所以如果想要取得某个单元格(sap中称之为cell)的值,语法如下:

sgtxt = Table.GetCellValue(0, "SGTXT")

需要注明的是,SAP底层的ALV格式表格中行号是从 0开始的,如果想要知道表格共有多少数据行,两行代码即可搞定(表格的ID通过脚本录制即可得到):

Set Table = session.findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell")

tableRowCount = Table.RowCount

如果要获取sap窗口标题来辅助程序判断,语法也很简单,直接调用session对象的text属性即可,如:

window_caption=session.findById("wnd[0]").Text

  这些属性方法的操作看似简单,但是如果不查阅相关sap gui script API文档,对API不了解,你自己很难实验出来,也许勉强用别的方法实现,却难免走了弯路或者牺牲了稳定性。毕竟无论是VB、还是Python的编译器,都不会对sap底层的api进行代码提示和自动补充。所以必要时,务必要查阅“帮助文件”。

此处推荐SAP博客站的一个著名博主:Stefan Schnell(他写了很多sap script与其他语言结合的文章,非常受用)以及他开发的免费的sap脚本工具:

Scripting Tracker – Development Tool for SAP GUI Scripting,附上博客链接:https://blogs.sap.com/2014/11/20/scripting-tracker-development-tool-for-sap-gui-scripting/

内含scripting Tracker的下载链接:https://tracker.stschnell.de/

该工具比原生的sap script更加可视化更加易用,其中Analyser模块界面如下,依靠它可以清晰捕获到sap界面的树形结构和对应的元素id等属性:

你们关心的脚本录制工具recorder长这样,它支持录制脚本,且支持vb、python、java、powerShell等多种脚本语言的导出:

实在是良心应用,强烈推荐!

有了这些,用Python 控制操作SAP,从此不再是难事!

下面为一个python 操作sap打开T-code ”mm03“的简单示例,供参考:

 #-Begin-----------------------------------------------------------------

 #-Includes--------------------------------------------------------------
import sys, win32com.client #-Sub Main--------------------------------------------------------------
def Main(): try: 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 session = connection.Children(0)
if not type(session) == win32com.client.CDispatch:
connection = None
application = None
SapGuiAuto = None
return #session.findById("wnd[0]").resizeWorkingPane(65, 19, 0)
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]/tbar[0]/btn[0]").press()
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP02").select() except:
print(sys.exc_info()[0]) finally:
session = None
connection = None
application = None
SapGuiAuto = None #-Main------------------------------------------------------------------
if __name__ == "__main__":
Main() #-End-------------------------------------------------------------------

PS:1、实际的sap脚本录制过程,会录制大量诸如 setfocus,caretposition,resizeWorkingPane等对程序无实际帮助的语句,为了提升程序执行效率,建议对录制的脚本语句进行适当注释和删除;

2、本文部分sap script api语句用的VB,需要适当修改才能运用到python中。

Python结合SAP GUI Script操作sap的简易教程的更多相关文章

  1. sap gui 使用方法, sap logon

    1:打断点:在程序保存并激活之后,可以打内部或外部断点. 如图示. 2:  display 展示程序,不能修改. 3: 查看创建的类的结构,使用more>display object list  ...

  2. 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧

    Jerry和SAP成都研究院一些新同事聊天时,谈到ABAP和SAP GUI这个话题.很多新同事在加入SAP成都之前,是做Java和C++开发的,习惯了Eclipse/IntelliJ IDEA/Vis ...

  3. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...

  4. VBA驱动SAP GUI完成界面元素值初始化

    小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象.GuiCheckBox( ...

  5. SAP GUI的配置文件

    GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...

  6. SAP GUI SAPLOGON.INI

    GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...

  7. 更改SAP GUI 登陆背景

    您也可以定制初始屏幕(SAP Easy Access): 所有用户的全局设置:o   更改位于初始屏幕右侧的登录 -   如果希望将登录放置在初始屏幕右侧,请按如下处理:        使用事务 SW ...

  8. Mac OS X 中使用SAP GUI的方法

    下载sap gui for mac 730 解压后 安装之前需要去oracle 官网下载jdk 6 然后运行 安装完成后配置登陆端 新建连接时,只需要配置Advanced 页签:勾选Expert Mo ...

  9. SAP GUI 750 安装包 及 补丁3 共享

    SAP GUI 750 安装包 及 补丁3 共享 链接: https://pan.baidu.com/s/1hstkfUs%20 密码: ggbz -------------------------- ...

随机推荐

  1. HBase总结 LSM理解

    转载的文章,觉得写的比较好 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储 ...

  2. eclipse下启动tomcat访问网址报404错误

    问题: 解决步骤 首先检查一遍自己tomcat的相关配置,如果无误,则继续下面的操作 1.打开server视图,双击tomcat进入编辑页面 选择其中的第二个选项,并且修改Server path中的内 ...

  3. [wordpress]WordPress地址(URL)错误,修改解决方案

    本人在修改Wordpress地址(URL)时,误操作使URL指向错误,后台无法进入. 解决方案 1.先利用Putty登陆到自己的服务器上(这里登陆方法我不再赘述): 2.登陆MySqL,并输入密码: ...

  4. 2017-2018 Northwestern European Regional Contest (NWERC 2017)

    A. Ascending Photo 贪心增广. #include<bits/stdc++.h> using namespace std; const int MAXN = 1000000 ...

  5. jmeter 使用问题

    问题1:导入脚本失败,提示 解决:没有安装JMemter plugins manager插件,具体安装参考http://www.cnblogs.com/cxx1/p/7883820.html,第二步.

  6. Havel-Hakimi定理的方法来构图

    给定一组非负数字,(数字为节点的度),判断该组数字能不能构成图. Havel-Hakimi定理: 将序列按照从大到小排序之后,从第二个数开始到第一个数的长度+1为止,依次减1.每操作一次,删掉第一个数 ...

  7. python mysql 单表查询 多表查询

    一.外键 变种: 三种关系: 多对一 站在左表的角度: (1)一个员工 能不能在 多个部门? 不成立 (2)多个员工 能不能在 一个部门? 成立 只要有一个条件成立:多 对 一或者是1对多 如果两个条 ...

  8. CodeForces 1143 B. Nirvana

    题目 解决思路是,每个位上都是9的情况,遍历一下就可以了. #include <iostream> using namespace std; int n; int a[35]; int m ...

  9. 《SQL Server性能调优实战》知识点汇总

    2.4数据库结构的设计 好的性能出自好的设计 尽可能添加数据完整约束(非空约束.默认值约束.CHECK约束.唯一约束.外键约束)等,这些约束的添加将有助于数据库关系引擎分析执行计划. 尽可能小的字段类 ...

  10. Jenkins实现自动运行jmeter脚本

    下载安装包 --jenkins的war包 下载地址:http://jenkins-ci.org/ 链接:https://pan.baidu.com/s/1VhwgYWqn3Bex2kCHigW5wA ...