VBA驅動SAP GUI實現辦公自動化(二):判斷元素是否存在

  實際的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 方法試試,相信定會有所幫助~~

  歡迎掃碼關注我的公衆號 獲取更多爬蟲、數據分析的知識!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章