天天看點

幾行python代碼輕松實作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\\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可執行檔案。

幾行python代碼輕松實作SAP自動登入

我們需要知道該exe檔案在系統本地的完整檔案路徑。不清楚如何檢視檔案路徑的可參照如下步驟找到:

幾行python代碼輕松實作SAP自動登入
幾行python代碼輕松實作SAP自動登入

 代碼如下:

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:

    visibleFlag=win32gui.IsWindowVisible(saplogonHwnd)

 經過這番操作後,我們就可以完全啟動sap Logon了。界面如下:

幾行python代碼輕松實作SAP自動登入

   假定我們要登入圖中所示的【測試系統】,我們需要定位到它,然後輕按兩下該元素即可。通過下圖可見,先前的SPY++無法捕獲到這些SAP client對應的元素資訊。

幾行python代碼輕松實作SAP自動登入

這就是為啥本篇重點要講這個uiautomation的原因,不過使用uiautomation該具體如何操作呢?

此時我們需要借助微軟官方提供的inspect工具(可關注文章末尾提到的公衆号後,輸入inspect背景擷取對應工具)來擷取整個控件的結構:

輔助功能工具 - 檢查 - Win32 apps | Microsoft Docs(該官方文檔有詳細的inspect使用說明,也提供官方的工具下載下傳連結)。

打開inspect,滑鼠定位到【測試系統】,可以看到inspect工具已經完整捕獲了該控件的各項屬性,我們可以借助name,classname,automationId等多種屬性定位它。

根據uiautomation作者的官方文檔,我們可以知道工具查找元素的邏輯,不同的查找方法,效率是完全不同的,見下圖:

幾行python代碼輕松實作SAP自動登入

為了加快元素的查找速度,我們需要使用分層查找,先找到SAP logon對話框,然後再來查找【測試系統】。searchDepth = 0xFFFFFFFF, 搜尋深度。我們可以通過inspect數 祖先(ancestors參數)的數量輕松确定它。

幾行python代碼輕松實作SAP自動登入

整個過程不過寥寥數行,完整代碼如下:

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對應的【測試系統】已經打開,來到如下界面:

幾行python代碼輕松實作SAP自動登入

   對後面這部分輸入【使用者】、【密碼】實作登入的方法,可借助SAP原生的【腳本錄制與回放】功能或者SAP Tracker工具來得到錄制的腳本。對此有疑問的童鞋,可以翻看小爬此前的python驅動SAP完成自動化的系列文章。在此不再贅述。如果對以上内容仍有疑問,可關注下方公衆号,一起讨論。

歡迎掃碼關注我的公衆号 擷取更多爬蟲、資料分析的知識!