几行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,里面有大量的示例。详见作者自己的文章介绍:。
第一步我们还是要借助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完成自动化的系列文章。在此不再赘述。如果对以上内容仍有疑问,可关注下方公众号,一起讨论。
欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!