实际的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 方法试试,相信定会有所帮助~~

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