Python驱动SAP GUI完成自动化(五)

  小爬前几篇SAP GUI自动化相关的博文提到过,我们可以借助tracker工具,在手工利用SAP GUI完成一系列操作(查询、导表、创建凭证等)后,可以快速得到python脚本,我们再结合python的语法特性稍加修改,把逻辑分支、循环分支、条件分支等加入其中,就可以做成一段自动化的脚本。

  现实的办公世界里,我们在SAP GUI中输入的外部参数很多都会触发SAP的报警弹窗、消息(报警、错误、信息、成功等多种状态),我们可以利用SAP原生的一些API来捕获我们的报警弹窗、SAP左下角消息状态、消息文本等,利用这些来提高脚本工具的鲁棒性;

  

 

 

 

  比如我们可以拿到SAP左下角的消息,利用RE正则表达式或者其他字符串解析方法-解析得到自动创建的内部订单号,可以根据消息的状态(报警还是正常消息、还是错误消息)来决定程序是否要继续,捕获某个SAP Session下的窗口个数(不为1,说明程序弹出了子窗口),来决定是否要处理子窗口,这些都是实际业务中会遇到的太正常不过的需求。甭着急,小爬都有招数一一应对。

  下面这段代码演示了如何利用python和win32com连接SAP,同时捕获当前会话下的窗口数量(是否有子窗口),以及如何关闭弹窗:

import win32com.client,win32con
'''连接SAP,需要提前安装pywin32库'''
SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connectionCnt = application.Children.count
if connectionCnt==0:
    session = None
    connection = None
    application = None
    SapGuiAuto = None   
connection = application.Children(0)
session=connection.Children(0) #得到第一个session

sapText=session.findById("wnd[0]").text #得到GUI主窗口的窗口标题

'''获取当前session下的窗口数量'''
cnt=len(session.children) # 如果有报警信息,则会显示两个弹窗,需要关闭SAP报警弹窗
if cnt==2:
    session.findById("wnd[1]/tbar[0]/btn[0]").press()  # 关闭子窗口,消除弹窗报警  

  接下来这段脚本则演示了,如何获取SAP左下角的消息状态、消息文本,并进行后续处理:

import win32com.client,win32con
import tkinter
import tkinter.messagebox

'''连接SAP,需要提前安装pywin32库'''
SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connectionCnt = application.Children.count
if connectionCnt==0:
    session = None
    connection = None
    application = None
    SapGuiAuto = None   
connection = application.Children(0)
session=connection.Children(0) #得到第一个session

'''比如创建内部订单最后一个环节,点击保存后,捕获内部订单号'''
orderMessageText=session.findById("wnd[0]/sbar/pane[0]").text #得到SAP左下角消息,即SAP创建好的内部订单号,进行存储
if session.findById("wnd[0]/sbar").messageType !="S": #消息类型不等于S,意味着没有成功创建内部订单号,或者存在报警信息
    root = tkinter.Tk()
    root.withdraw()
    tkinter.messagebox.showwarning('*_*',orderMessageText)  # 利用tkinter生成GUI弹窗,讲SAP消息反应在我们自制的弹窗上
    os._exit(0)    
internalOrderNo=orderMessageText.split(" ")[1] #解析消息文本,提取内部订单号

我们可以利用SAP GUI脚本帮助,查询到SAP状态栏对象的消息类型属性,如下:

 

 

  这个例子也再次验证了,脚本录制得到的代码只是基础,它远不够灵活,熟悉SAP scripting API(对象、属性、方法),并灵活运用到我们的自动化脚本中,对代码的灵活性、鲁棒性的提升是肉眼可见的。感兴趣的童鞋,赶紧试试吧!

  快来扫码关注我的公众号 获取更多爬虫、数据分析的知识!

 

posted @ 2021-02-20 09:32  NewJune  阅读(1896)  评论(6编辑  收藏  举报