new-june

  小爬之前的博文【使用Python完成SAP客户端的打开和系统登陆】中已经提到了一种自动登录SAP的思路,该博文的评论区也有好心的网友ken-yu提供了另一种思路来做到这一点,代码如下:

import subprocess

#'-system = PRD' 请把PRD换成指定SAP系统的SID
# '-client=110' 请把Client修改为正确的Client, 输入用户名和密码的上方有的Client, 3位数字的
#'-l=ZH' ZH中文,EN英文, 
def login()
    login_info = ['C:\\Program Files (x86)\\SAP\\FrontEnd\\SAPgui\\sapshcut.exe', '-system=PRD', '-client=110','-l=ZH', '-user=用户名', '-pw=密码']
    subprocess.check_call(login_info)

login()
#
#
#
#主要是调用sapshcut.exe ,SAP GUI 740,750,760 都有这个sapshcut.exe程序,通过查看sapshcut.exe这个程序的帮助能得到更多有用的信息.
#下面是登录组的配置.
#sapshcut.exe -client=110 -l=EN -sid=AAA -gui=/M/aaa.cnblogs.com/S/3600/G/serverGroup  -u=用户名 -pw=密码 
#-gui 配置logon group
#使用登录组的方式.如上,login_info那里替换下就可以了.
#同理也可以使用dos的方式直接执行并登录

  今天的博文中,小爬通过使用uiautomation库,同样可以轻松做到SAP自动登录。

  UIautomation库是国内的YinKaisheng开发的一款适用于Python的UI自动化库。uiautomation封装了微软UIAutomation API,支持自动化Win32,MFC,WPF,Modern UI(Metro UI), Qt, IE, Firefox(version<=56 or >=60, Firefox57是第一个Rust开发版本,前几个Rust开发版本个人测试发现不支持), Chrome和基于Electron开发的应用程序(Chrome浏览器和Electron应用需要加启动参数--force-renderer-accessibility才能支持UIAutomation).

  对该库感兴趣的童鞋可以看下作者的github开源项目:Python-UIAutomation-for-Windows/readme_cn.md at master · yinkaisheng/Python-UIAutomation-for-Windows · GitHub,里面有大量的示例。详见作者自己的文章介绍:开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt

第一步我们还是要借助subprocess库的popen方法启动我们桌面的SAP logon可执行文件。

 

我们需要知道该exe文件在系统本地的完整文件路径。不清楚如何查看文件路径的可参照如下步骤找到:

 

 

 

 

 

 代码如下:

import subprocess
subprocess.Popen(r'D:\Program Files (x86)\sap\FrontEnd\SAPgui\saplogon.exe')

启动它之后,我们需要等待SAP Logon窗口完全可见,此处可借助pywin32库来实现,代码如下:

import uiautomation as ua
import subprocess,win32gui,time
subprocess.Popen(r'D:\Program Files (x86)\sap\FrontEnd\SAPgui\saplogon.exe')
saplogonHwnd=0
while saplogonHwnd==0:
    saplogonHwnd=win32gui.FindWindow("#32770","SAP Logon 740") #借助spy++工具提前得到其类名#32770,和窗口标题SAP Logon 740
    time.sleep(0.1)
'''如果担心句柄捕获到后,sap界面依然没加载好,可以使用IsWindowVisible进一步确认,直至窗口可见'''
visibleFlag=False
while visibleFlag==False:
    time.sleep(0.1)
    visibleFlag=win32gui.IsWindowVisible(saplogonHwnd)

 经过这番操作后,我们就可以完全启动sap Logon了。界面如下:

 

   假定我们要登录图中所示的【测试系统】,我们需要定位到它,然后双击该元素即可。通过下图可见,先前的SPY++无法捕获到这些SAP client对应的元素信息。

 

 

这就是为啥本篇重点要讲这个uiautomation的原因,不过使用uiautomation该具体如何操作呢?

此时我们需要借助微软官方提供的inspect工具(可关注文章末尾提到的公众号后,输入inspect后台获取对应工具)来获取整个控件的结构:

辅助功能工具 - 检查 - Win32 apps | Microsoft Docs(该官方文档有详细的inspect使用说明,也提供官方的工具下载链接)。

打开inspect,鼠标定位到【测试系统】,可以看到inspect工具已经完整捕获了该控件的各项属性,我们可以借助name,classname,automationId等多种属性定位它。

根据uiautomation作者的官方文档,我们可以知道工具查找元素的逻辑,不同的查找方法,效率是完全不同的,见下图:

 

 

 

为了加快元素的查找速度,我们需要使用分层查找,先找到SAP logon对话框,然后再来查找【测试系统】。searchDepth = 0xFFFFFFFF, 搜索深度。我们可以通过inspect数 祖先(ancestors参数)的数量轻松确定它。

 

整个过程不过寥寥数行,完整代码如下:

import uiautomation as ua
import subprocess,win32gui,time
subprocess.Popen(r'D:\Program Files (x86)\sap\FrontEnd\SAPgui\saplogon.exe')
saplogonHwnd=0
while saplogonHwnd==0:
    saplogonHwnd=win32gui.FindWindow("#32770","SAP Logon 740") #借助spy++工具提前得到其类名#32770,和窗口标题SAP Logon 740
    time.sleep(0.1)
'''如果担心句柄捕获到后,sap界面依然没加载好,可以使用IsWindowVisible进一步确认,直至窗口可见'''
visibleFlag=False
while visibleFlag==False:
    time.sleep(0.1)
    visibleFlag=win32gui.IsWindowVisible(saplogonHwnd)

sapLogonDialog=ua.WindowControl(searchDepth=2, Name='SAP Logon 740')
testControl=sapLogonDialog.Control(searchDepth=12, Name='测试系统')
testControl.DoubleClick()

执行完上面的操作后,SAP对应的【测试系统】已经打开,来到如下界面:

 

   对后面这部分输入【用户】、【口令】实现登录的方法,可借助SAP原生的【脚本录制与回放】功能或者SAP Tracker工具来得到录制的脚本。对此有疑问的童鞋,可以翻看小爬此前的python驱动SAP完成自动化的系列文章。在此不再赘述。如果对以上内容仍有疑问,可关注下方公众号,一起讨论。

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

 

相关文章: