我们在VBA中嵌入SAP原生的【脚本录制与回放】功能生成的VBS脚本,可以实现很多自动化操作。但只有我们对SAP做了一系列动作,才会得到这些动作的脚本。然而,一旦我们需要用代码提前做一些判断,然后再决定后续的动作时,这个判断的代码就无法通过【脚本录制与回放】功能录制得到。这个时候,我们需要学会看SAP GUI Scripting API。

  举个小爬在实际工作中碰到的例子。我们有时候会利用脚本驱动事务代码F-02完成SAP凭证的批量录入。在凭证的行项目录入界面中,某些科目下,SAP需要我们维护【到期日】【基准日】;有些行项目下,则没有这个选项让用户维护,如下图所示:

   我们需要先判断有没有【到期日】这个元素,再决定是不是要给这个元素传值。这个判断的代码就无法去录制代码得到了。

  这也就是小爬今天要分享的知识点:利用FindAllByName()方法去判断是否存在某个元素。这些方法就是通过SAP GUI Scripting API学习得来。

  之所以这里用到FindAllByName()而不是我们熟悉的FindById()方法,是因为当我们使用FindById()去查找某个页面中没有的元素时,程序会直接报错异常,而VBA的异常响应能力天生不足,使用FindAllByName()则完全不会存在这个问题。

  从上图中可以看到,FindAllByName()方法接收两个参数,一个是元素的Name,另一个是元素的Type,而返回值是一个GuiComponentCollection对象,相当于一个数组。当我们没有找到对应的元素时,会返回一个空数组,并不会报错。

以【到期日】这个字段为例,我们还是需要借助万能的Scripting Tracker工具先找到元素的Name和Type。我们可以点击工具中的望远镜图标【查找对象】,输入关键词【到期日】,此时工具会自动帮我们定位到对应对象(灰色背景),如下图所示:

  这里可以看到,【到期日】对象对应的Name:BSEG-ZFBDT,对应的Type:GuiLabel(注意,这里不用输入Type括号后面的数字)。只要判断有这个【到期日】label元素,就可以断定页面中是否有【到期日】这个GuiCTextField输入框元素。

有了这两点,我们可以这样来组织我们的VBA代码,避免程序出错和写不必要的异常响应,代码示例如下:

  1. 1 Sub Main()
  2. 2
  3. 3 Dim SapGuiAuto As Object
  4. 4 Dim app As Object
  5. 5 Dim connection As Object
  6. 6 Dim session As Object
  7. 7 Dim ZFBDT_collection As Object, cnt As Long
  8. 8
  9. 9 Set SapGuiAuto = GetObject("SAPGUI")
  10. 10 Set app = SapGuiAuto.GetScriptingEngine
  11. 11 app.HistoryEnabled = False
  12. 12 Set connection = app.Children(0)
  13. 13 If connection.DisabledByServer = True Then
  14. 14 Exit Sub
  15. 15 End If
  16. 16 Set session = connection.Children(0)
  17. 17 If session.Busy = True Then
  18. 18 Exit Sub
  19. 19 End If
  20. 20 If session.Info.IsLowSpeedConnection = True Then
  21. 21 Exit Sub
  22. 22 End If
  23. 23
  24. 24
  25. 25 session.findById("wnd[0]").maximize
  26. 26 Set ZFBDT_collection = session.findById("wnd[0]/usr").FindAllByName("BSEG-ZFBDT", "GuiLabel") '基于Name和Type 查找【到期日】元素
  27. 27 cnt = ZFBDT_collection.Count
  28. 28 If cnt = 0 Then
  29. 29 MsgBox "【到期日】元素在当前SAP会话中不存在!"
  30. 30 Else:
  31. 31 Debug.Print ZFBDT_collection(0).Text '打印对应的元素的Text属性,佐证是否为【到期日】
  32. 32 session.findById("wnd[0]/usr/ctxtBSEG-ZFBDT").Text = "2022.01.01" '找到对应的元素,传值
  33. 33 End If
  34. 34 End Sub

     除了FindById,是时候开始学学FindAllByName来查找SAP GUI元素了。尤其是在VBA中做SAP GUI自动化,该方法真心好用,强推~~

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

VBA驱动SAP GUI自动化:查找页面元素FindAllByName的更多相关文章

  1. VBA驱动SAP GUI完成界面元素值初始化

    小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象.GuiCheckBox( ...

  2. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...

  3. Python+Selenium自动化-定位页面元素的八种方法

    Python+Selenium自动化-定位页面元素的八种方法   本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...

  4. 基于Selenium2+Java的UI自动化(3) - 页面元素定位

    一.几种网页定位方式 webdriver的页面定位很灵活,提供了8种定位方式: 其中,常见的有三种:id .cssSelector .xpath: 一个元素如果存在 id 属性,则这个 id 的值,在 ...

  5. Cypress系列(16)- 查找页面元素的基本方法

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前端页面代码 后面写的 Cypress ...

  6. Cypress系列(17)- 查找页面元素的辅助方法

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 单一的基础定位元素方法并不一定能满 ...

  7. 使用protractor操作页面元素

    Protractor是为Angular JS应用量身打造的端到端测试框架.它可以真实的驱动浏览器,自动完成对web应用的测试.Protractor驱动浏览器使用的是WebDriver标准,所以使用起来 ...

  8. Selenium Web 自动化 - 如何找到元素

    Selenium Web 自动化 - 如何找到元素 2016-07-29 1. 什么是元素? 元素:http://www.w3school.com.cn/html/html_elements.asp ...

  9. python驱动SAP完成数据导出(一)

    写在前面 我们使用Python驱动SAP时,经常会需要导出一些SAP报表数据至本地Excel文件.这个看似简单的问题背后,其实暗藏玄机,今天小爬就带各位同学好好捋捋. 以事务代码FB03(凭证清单)为 ...

  10. 使用webview查找元素,appium查找web页面元素

    9 webview查找元素 9.1 webview 简介 WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面.它使用的内核是webkit引擎,4.4版本之后,直接使用 ...

随机推荐

  1. Openstack neutron:SDN现状

    目录 - SDN现状 - (一)SDN现状 - SDN诞生的背景 - SDN的介绍 - (二)SDN领域的相关组织和发展现状 - 1.ONF - 2.OpenDaylight - 3. IETF -  ...

  2. 详解字符编码与 Unicode

    人类交流使用 A.B.C.中 等字符,但计算机只认识 0 和 1.因此,就需要将人类的字符,转换成计算机认识的二进制编码.这个过程就是字符编码. ASCII 最简单.常用的字符编码就是 ASCII(A ...

  3. PHP获取当前周一、周末时间等(持续更新)

    获取周一和周日的日期 $week = date('w') == 0 ? 7 : date('w'); $Sunday = strtotime('today -' . ($week - 1) . 'da ...

  4. 使用django_registration框架实现用户的注册与激活

    1.前言 本节内容是在以下环境中实现的. python version: 3.7 Django version: 3.1.1 Django-registration version: 3.1.1 如版 ...

  5. Node.js(七)MySql+ajax

    Api.js const express=require("express"); const router=express.Router(); const mysql = requ ...

  6. 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和

    第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...

  7. printf-库函数重定向、重载

    重定向:这是针对标准C语言语法来讲,指的是我们可以重新声明库函数并定义库函数的执行体 重载:这是CPP引入的新特性,即根据函数不同参数个数或参数类型来对同一函数名进行不同定义 C和CPP对重定向处理机 ...

  8. 记一次某制造业ERP系统 CPU打爆事故分析

    一:背景 1.讲故事 前些天有位朋友微信找到我,说他的程序出现了CPU阶段性爆高,过了一会就下去了,咨询下这个爆高阶段程序内部到底发生了什么? 画个图大概是下面这样,你懂的. 按经验来说,这种情况一般 ...

  9. Linux中CentOS 7版本安装JDK、Tomcat、MySQL、lezsz、maven软件详解

    软件安装 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式 特点 二进制发布包安装 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 rpm安装 软件已经按照 ...

  10. echarts的使用 超好用的报表制作、数据的图形化展示

    地址链接:https://echarts.apache.org/zh/index.html 1.图形选择 2.对应的js代码