小爬之前的博文【使用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庫來實現,代碼如下:
經過這番操作后,我們就可以完全啟動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完成自動化的系列文章。在此不再贅述。如果對以上內容仍有疑問,可關注下方公眾號,一起討論。
歡迎掃碼關注我的公眾號 獲取更多爬蟲、數據分析的知識!