飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • AngularJS教程
  • UEditor使用文档
  • ThinkPHP5.0教程

python利用uiautomation轻松实现SAP自动登录

时间:2022-01-20  作者: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\\域名\', \'-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完成自动化的系列文章。在此不再赘述。如果对以上内容仍有疑问,可关注下方公众号,一起讨论。

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

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。