python利用uiautomation轻松实现SAP自动登录
小爬之前的博文【使用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\\域名\', \'-system=PRD\', \'-client=110\',\'-l=ZH\', \'-user=用户名\', \'-pw=密码\'] 域名k_call(login_info) login() # # # #主要是调用域名 ,SAP GUI 740,750,760 都有这个域名程序,通过查看域名这个程序的帮助能得到更多有用的信息. #下面是登录组的配置. #域名 -client=110 -l=EN -sid=AAA -gui=/M/域名/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/域名 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 域名n(r\'D:\Program Files (x86)\sap\FrontEnd\SAPgui\域名\')
启动它之后,我们需要等待SAP Logon窗口完全可见,此处可借助pywin32库来实现,代码如下:
import uiautomation as ua import subprocess,win32gui,time 域名n(r\'D:\Program Files (x86)\sap\FrontEnd\SAPgui\域名\') saplogonHwnd=0 while saplogonHwnd==0: saplogonHwnd=域名Window("#32770","SAP Logon 740") #借助spy++工具提前得到其类名#32770,和窗口标题SAP Logon 740 域名p(0.1) \'\'\'如果担心句柄捕获到后,sap界面依然没加载好,可以使用IsWindowVisible进一步确认,直至窗口可见\'\'\' visibleFlag=False while visibleFlag==False: 域名p(0.1) visibleFlag=域名ndowVisible(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 域名n(r\'D:\Program Files (x86)\sap\FrontEnd\SAPgui\域名\') saplogonHwnd=0 while saplogonHwnd==0: saplogonHwnd=域名Window("#32770","SAP Logon 740") #借助spy++工具提前得到其类名#32770,和窗口标题SAP Logon 740 域名p(0.1) \'\'\'如果担心句柄捕获到后,sap界面依然没加载好,可以使用IsWindowVisible进一步确认,直至窗口可见\'\'\' visibleFlag=False while visibleFlag==False: 域名p(0.1) visibleFlag=域名ndowVisible(saplogonHwnd) sapLogonDialog=域名owControl(searchDepth=2, Name=\'SAP Logon 740\') testControl=域名rol(searchDepth=12, Name=\'测试系统\') 域名leClick()
执行完上面的操作后,SAP对应的【测试系统】已经打开,来到如下界面:
对后面这部分输入【用户】、【口令】实现登录的方法,可借助SAP原生的【脚本录制与回放】功能或者SAP Tracker工具来得到录制的脚本。对此有疑问的童鞋,可以翻看小爬此前的python驱动SAP完成自动化的系列文章。在此不再赘述。如果对以上内容仍有疑问,可关注下方公众号,一起讨论。
欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!