实际的SAP GUI自动化业务场景中,我们经常需要根据SAP GUI Session中判断某个元素是否存在,从而产生逻辑分支,然后SAP官方的Scritping 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 方法试试,相信定会有所帮助~~
欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!