實際的SAP GUI自動化業務場景中,我們經常需要根據SAP GUI Session中判斷某個元素是否存在,從而產生邏輯分支,然後SAP官方的Scripting API文檔中沒有某個元素是否存在這樣的屬性或方法。今天小爬就試着寫一個通用的方法,判斷某個ID的元素是否存在。
如下圖所示,事務代碼FBL1N(供應商行項目顯示)下,SAP提供【切換清單】功能。兩種清單界面下,元素的獲取方式完全不同。因爲對應的元素ID都將變化,我們有必要先判斷當前用戶的會話屬於哪種清單模式,這樣的需求在實際工作中再正常不過了。
這個問題,對於使用python驅動SAP GUI的童鞋,甚至都不是一個問題,我們壓根無需提前判斷它是否存在。我們只需在Try ... Except ...結構中假定該元素存在,往下操作,如果代碼進入到Except分支,即說明該元素它不存在。
可是在VBA的語法世界裏,可沒有那麼好的異常捕獲和響應機制,提前構建一個isElementPresentById的方法,再來決定後續的操作邏輯分支,就顯得優雅的多。
我們可以這樣來思考,根據用戶提供的元素ID(結構如:"wnd[1]/tbar[0]/btn[6]"),我們可以通過拆分字符串,拿到其父元素的ID,再遍歷父元素的每個子元素,同時拿到其ID值,逐個與我們的目標ID進行比對,當兩者嚴格相等時,便說明該元素存在,反之則說明該元素不存在。具體到VBA代碼層面,可以參考下小爬的示例代碼:
1 Function isElementPresentById(ByVal session As Object, ByVal elementId As String) As Boolean 2 '根據元素ID查找父元素ID(前提,父元素ID確實存在),根據父元素,遍歷children的ID,找到該元素ID,返回True,否則返回False 3 Dim myArr, parentId As String, i As Integer, parentElement As Object 4 fullElementId = session.ID + "/" + elementId 5 isElementPresentById = False '假設一開始,該值爲False 6 myArr = Split(elementId, "/") 7 endIndex = UBound(myArr) 8 If endIndex = 0 Then 9 MsgBox "該元素不存在父元素!" 10 isElementPresentById = False 11 Else: 12 parentId = session.ID 13 For i = 0 To endIndex - 1 14 parentId = parentId + "/" + myArr(i) '逐個數組元素拼接得到最終的父元素ID 15 Next 16 17 Set parentElement = session.findByID(parentId) 18 For Each element In parentElement.Children 19 If element.ID = fullElementId Then 20 isElementPresentById = True 21 Exit For 22 End If 23 Next 24 End If 25 26 End Function
習慣用VBA來驅動SAP的童鞋,如果遇到文中提到的這類問題,不妨用這個 isElementPresentById 方法試試,相信定會有所幫助~~
歡迎掃碼關注我的公衆號 獲取更多爬蟲、數據分析的知識!