Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
ArthurYang
Product and Topic Expert
Product and Topic Expert
0 Kudos
654

本文内容来源于我对SPA的理解,是基于汇率抓取入门练习和优化练习的结果做出的进一步讲解。

 

如果您对BTP感兴趣,BTP个人精选内容目录 | SAP Blogs  可能有更多你需要的内容

 

在完成前两篇练习之后,您已经初步熟悉了界面和一些基本操作,接下来我们再多定义几个元素和屏幕来让您快速了解一下原理。

 

1.外汇管理局首页元素抓取

之前的练习中我们只用到了外汇管理局首页的一些元素,如果之前没有抓取过,这里我们先额外抓取一个时政要闻按钮:

打开我们已经抓取好的界面: 外汇管理局system – 国家外汇管理局门户网站(自动填写的屏幕名称)

中间有三个选项”屏幕”,”两者”,”树”,点进”屏幕”选项,在页面截图中单击左侧中间的”时政要闻”按钮,该元素就会在图片中被一个绿色框框柱,右侧就会显示“元素详细信息”,并且右侧的”识别条件”中自动出现了一个条件 [Text等于 时政要闻],并提示”已唯一标识元素”

对于这样的元素,我们直接单击页面右下角的”声明元素”,即可将其保存到左下角的”已声明元素”,之后机器人在寻找该元素时就会根据[Text等于 时政要闻]来找,而页面内只有一个元素是符合条件的

 

再抓取一个外汇新闻按钮:

在同一个界面的屏幕截图中,单击”时政要闻”右侧的”外汇新闻”右侧会显示“元素详细信息“,”识别条件”下自动选用的条件是[Text等于 外汇新闻],而这时候的提示则是黄色的”已标识2个元素”,为什么和时政要闻不一样呢?这是因为符合[Text等于 外汇新闻]的元素有两个。

看看屏幕截图,可以看到第二个元素在屏幕截图的左上部位,而这个元素也是一个A标签,它的Text也是”外汇新闻”,那我们怎么区分他们两个呢?

 

首先,经过实际点击,可以发现点击两个元素的效果是一样的,都会打开新页面,所以我们可以直接将这两个元素声明为一个集合(因为点哪个都一样),单击”识别条件”右下方的”三个三角形”按钮,之后就会提示”已唯一标识集合”,之后在使用Click控件调用时填写一个序号1即可(因为Click控件只能针对单个元素,所以序号1就代表着在集合中选定第1个元素来执行Click操作)

 

其次,如果需要区分开两个元素,我们可以看看其他的”可用条件”,能不能额外区分他们俩,

最后,如果两个元素完全无法区分,我们将界面中间的”两者”打开,可以观察到我们的目标元素归属在一个LI下,先尝试右击该LI – “添加到条件”,会发现为目标元素自动添加了一个识别条件[Text等于 外汇新闻]的父项, 但是发现还是无法唯一识别,这是因为另一个元素也有一个这样的父项,


但是我们发现,另一个元素的直接父项不是LI,而是隔了一个H3才到LI, 那么我们就可以点击 ”识别条件” – 父项条件 右侧的三个点,选择”直接父项”,这样就可以唯一识别了

亦或者右击目标元素上两层的UL,使用它作为父项条件,因为另一个元素没有符合[Text 等于 时政要闻外汇新闻]的UL父项,这样也可以唯一识别

最后单击右下角的”声明元素”即可

 

2.时政要闻页面抓取

先手动在外汇管理局页面单击时政要闻按钮,进入新页面

再在开发界面,点开左上角的小照相机,将这个新页面抓取下来,新页面会自动使用一个[URL等于https://www.safe.gov.cn/safe/szyw/index.html] 作为识别条件,这样就和旧屏幕区分开了,

但是在其他系统内,如果URL无法区分怎么办呢?首先,和元素一样,我们先尝试其他识别条件,例如这里我们就可以把URL条件删掉,从”可用条件”中选择TITLE条件,因为这两个屏幕的TITLE很明显不同,

而有的系统,屏幕就是多形态的,都是在同一个URL下变化,那么这些屏幕都可以作为同一个屏幕的不同捕获而存在,单击屏幕右侧的三个点 - ”将捕获添加到当前屏幕” 即可

 

3.全流程细节讲解

结合我们入门练习的结果,在执行时,

1.第一个控件是Start Application,针对的对象是”外汇管理局system”,那么实际上机器人会启动“应用程序 - 左侧”已声明应用程序”下第一条 – 右侧应用程序详细信息 – 高级 – 应用程序路径”内的URL,也就是自动识别出来的 http://www.safe.gov.cn/

2.Open excel instance会打开一个excel程序

3.Add workbook会打开一个未保存的空白excel

4.Push Value会将输入值”塞入”当前打开着的excel workbook,而这个”塞入”的行位置则是最后一行内容的行序号+1, 列位置则是从0开始,简单理解就是塞到最后面,而对步骤3打开的新workbook自然就是第一排从第一列开始,塞入” ['金额1', '币种1', '金额2', '币种2']”这四个值

5.For each针对的是一个元素集合,符合两个条件的元素会被认为属于集合:[其归属于[id等于rmb_query]的UL下],以及[其本身类型为LI]

所以机器人会先找到所有[id等于rmb+query]的UL,然后在这些UL下找到所有LI

集合确定之后,就会根据For each内的操作对集合内元素依次执行操作:Get Element获取元素字符值,将Get Element的输出Push到当前打开的excel文件内

6.如果你抓取并点击了” 时政要闻”按钮,那么机器人会找到唯一一个字符值为”时政要闻”的按钮,进行点击

7.如果你抓取并点击了”外汇新闻”按钮,机器人也会按照条件找到元素并点击

(关于每个控件的官方解释文档:在搜索控件窗口,每个控件的右边都有"惊叹号",点开里面有"打开文档"

 

4.深度概念讲解:

机器人在启动运行后,会按照”自动化”项目中定义的流程去顺序执行动作,

如果动作涉及屏幕和元素,机器人就会在当前电脑上寻找目标屏幕/元素,例如寻找应用程序AppA的ScreenB屏幕内的ElementC, 寻找的过程如下所述:

1.列出当前电脑打开的所有屏幕,确认这些屏幕中有哪些符合AppA的识别条件

(在应用程序界面,单击左侧”已声明应用程序”下第一条后,右侧会显示”应用程序详细信息”,该部分就有”识别条件”,旧条件不够用的话就,点击”识别条件”的下方”可用条件”就可以添加新条件

(例如[EXE等于SAPLOGON.EXE]就可以识别SAP GUI程序,[DOMAIN等于www.baidu.com] 就可以识别出所有URLwww.baidu开头的网页)

­

这一步可以在所有屏幕中圈出一批备选

 

2.将这些备选屏幕的参数和ScreenB的识别条件进行匹配,找出哪一个是ScreenB

(在应用程序界面内,单击左侧的目标屏幕名,右侧会显示”屏幕详细信息”,该部分就包含了”识别条件”,旧条件不够用的话就,点击”识别条件”的下方”可用条件”就可以添加新条件)

(例如[Name等于SAP Logon 770]一般对应着打开SAPLOGON之后出现的第一个选择系统的屏幕,[Name 等于SAP 轻松访问 -  用户菜单 - XXX]的一般对应着完成SAP登录后的第一个界面)

 

这一步可以唯一确认屏幕

 

3.最后则是在确认的屏幕中,将所有元素和ElementC的识别条件进行匹配

(在应用程序界面内,单击左侧的目标屏幕名,再单击左下角”已声明元素”下的目标元素,就会在右边看到”元素详细信息”,该部分就包含了”识别条件”,旧条件不够用的话就,点击”识别条件”的下方”可用条件”就可以添加新条件)

这一步可以找到动作的唯一执行对象,最后再具体对这个对象完成动作

(例如”自动化”中的Click控件就是一个点击动作)

 

 

解读:

机器人在实际运行中,可能会看到一批各种各样的屏幕,但是机器人需要唯一确定它要操作的屏幕,所以需要检测所有屏幕,但这样工作量太大,

所以RPA用”应用程序”的概念来先将屏幕们分群,而符合该”应用程序”标准的屏幕们就会归于一群,这个标准一般也可以拿来衡量这些屏幕是否属于”同一个系统”

例如”exe 等于 SAPLogon.exe”这个标准就可以用于定义SAP GUI系统的所有屏幕,”DOMAIN  等于www.safe.gov.cn”就可以定义外汇管理局网页系统的所有屏幕

点击”应用程序”内的第一行(即”应用程序”本身,也是左侧”已声明应用程序”下第一条),就可以在右侧看到该”应用程序”的识别条件(如下图),

 

 

而屏幕内不同元素之间,首先可以尝试根据Name, text, ID等常见参数作为识别条件,同时也可以把”等于”修改成”包含”,或者”开始于”等条件,来用单一参数识别,如果右侧显示”已唯一识别元素”则有可能就识别成功了

单一参数无法识别时,我们可以用多参数识别,每一个参数都可以用来缩小范围

当有两个十分相似,参数也基本一模一样的元素无法识别时,可以把这两个元素声明为一个集合,在每次操作时针对该集合的第X个元素操作,也可以达到效果

 

5.常见问题Q&A

Q: 页面明明是在这个系统打开的,为什么不符合应用程序的识别条件?

例如SAP GUI系统的弹窗,有些时候使用的是windows的弹窗,其exe不等于SAPLogon.exe,故而无法用常见的[ EXE 等于 SAPLOGON.EXE ]来判断。这个时候可以找别的条件添加到应用程序的识别条件内,用”或”来和原有的识别条件并列,以将目标页面纳入范围

当然也可以为目标页面单独建一个应用程序

 

Q: 两个页面参数基本一致,无法唯一区分:

首先需要确认这不同页面内的元素有没有区别,如果没有区别的话可以直接当同一个页面,或者一个页面的多个捕获来使用,例如有时从SAP导出文件时会弹出多次GUI安全性提示,尽管这几次提示的文字略有区别,但是元素基本没有区别,故可以当做同一个屏幕

如果元素有区别,则可以定义有区别的元素,并为其赋予”必须存在”和”必须不存在”条件,来辅助页面识别,当机器人利用识别条件无法分辨两个屏幕时,就会通过检查”必须存在”的元素是否存在,来判断要操作的是哪个屏幕

 

Q: 页面中看见了很多元素,但是抓取时无法选中这些元素,选中的是一个iframe

iframe其实可能是因为你看到的这部分网页元素其实来自其他URL地址,所以我们可以单独将这个iframe作为一个screen进行抓取:在页面抓取器里找到主页面,左侧可能有箭头,点开去找目标元素位置所在的子页面,并进行抓取

 

Q:Get used Range Row有什么用?

Get used Range Row控件会获取到当前打开着的excel workbook最后一行内容的行序号

 

Q:电脑自动打开的Excel无法关闭页面怎么办?

excel instance代表的是excel这个app

机器人并不知道电脑有没有自行打开instance和workbook、但是可以通过get open workbook list检测当前有哪些workbook是打开的,

该控件返回值为当前打开着的workbook名字的列表”workbookList”,而如果电脑当前只有一个新打开的workbook,这样” workbookList[0]”就是电脑当前workbook的名字了

而Get excel instance就可以通过workbook名字获取instance,最后再恢复正常的close workbook和close instance 操作

 

Q: 怎么模拟键盘按键?

选用控件keystroke,在输入值的表达式页面填入irpa_core.enums.key,再输入一个点 . 就会提示各种键盘按钮,例如Enter

如果需要同时按下多个按钮,例如ctrl+enter+P,需在表达式页面填入[irpa_core.enums.key.Ctrl+irpa_core.enums.key.Enter + ’P’]

 

Q:怎么调外部API接口?

A:在RPA主页左菜单的 商店 内搜索 best practices,进入web service best practices并导入到自己的环境即可

 

Q:如何抓取容易消失的弹窗等页面元素


因为我们在抓取页面元素时需要将其打开,再切换到开发界面来进行抓取,而有些元素在切换页面时就会发生变化,这个时候我们可以借助手动的捕获工具来抓取这类元素

在添加屏幕的弹窗中,选择捕获工具这个页签

ArthurYang_0-1740024146748.png

 

ArthurYang_1-1740024146752.png

 

等待捕获工具的小弹窗出现之后,切换到需要捕获的页面,打开需要捕捉的元素后马上 按住Ctrl并将鼠标移动至目标元素上,等待红框出现后松开Ctrl,此时开发界面就会开始捕捉红框内的元素

ArthurYang_2-1740024146756.png

 

ArthurYang_3-1740024146766.png


和标准的捕捉已检测到的屏幕方式比较,最大的区别就是可以捕捉那些转瞬即逝的页面元素。


Q:
当元素完全无法抓取,如何使用坐标的方式去点击

SPA识别元素的方法很多,除了直接利用其属性来识别,还可以利用其父结构识别(在先前的练习已经演示过)

SPA支持通过坐标去点击界面上的某个点,如果存在实在无法抓取的元素A,最后可以考虑通过定位A附近的元素B,通过Get Rectangle获取到B的坐标后,去通过Mouse Left Click等控件去点击A

 

整个屏幕的最左上角为坐标轴的原点,其坐标为(X:0,Y:0)

 

Get Rectangle会获取到目标元素最左上角坐标的XY值,同时会获取到元素的宽cx和高cy,这样我们就可以利用数值组合来点击到目标元素,但是该方法不够稳定,一般只在万不得已的情况下使用

 

Q:当Screen难以区分时如何识别

首先,有些时候,如果两个ScreenAttribute基本完全一致,那么他们就应该被认为是同一个Screen,应该作为同一个Screen的两个捕获来抓取

其次,如果需要分开,可以利用AB两个Screen中不同的元素来区分,例如将A中必然存在,B中必然不存在的某个元素在A中识别出来,将其标记为"必须存在",再将其拖入B屏幕中,标记为"必须不存在",这样机器人就可以更好的识别Screen

 

 Q:实时测试元素是否被识别,以及测试控件对元素的操作效果

 在应用程序页面内,左上角的开始键可以打开页面测试器,测试当前电脑打开的页面是否被识别,进而查看该页面内识别除了多少元素,以及这些元素包含哪些属性

 

最后还可以对这些元素尝试不同的控件操作并查看结果,这样可以实地检验控件选择的合理性

 

Q:网页/SAP系统卡顿怎么办

无论网页卡顿或是元素卡顿,机器人这种无侵入性的技术都无法加快这个进度,我们只能模拟人再遇到这种情况下的操作:等待。

而等到什么时候呢? 那只需要等到这个页面出现,并且我们需要操作的元素也出现就可以继续流程了,一般网页出现但元素加载缓慢这个现象比较常见,所以这里以此为例,通过加入Wait Element控件,来让机器人等到汇率元素出现再继续操作:

 

将控件纳入流程后,点击该控件,在右侧编辑其属性

这样,机器人会在识别到汇率元素集合中的第一个元素时,才继续运行,这样就避免了元素加载过慢导致机器人抓不到数据的问题

在开发SAP GUI流程时遇到页面卡顿,可以通过控件获取GUI的状态是否卡顿,如果卡顿则持续进行等待,直到session恢复正常再继续流程,大体上如下图所示

ArthurYang_4-1740024146769.png

 

6.一点开发小技巧:

在测试运行流程时,左侧会有测试运行的记录,每一步的输入与输出都可以在点选中后从右侧的”测试”部分看到,测试运行还可以打断点,来更好的查看每一步的变化

 

而开始测试运行前,如果担心页面识别条件设置不准确,可以在抓取页面的地方左上角启动页面测试器,再启动要检测的屏幕,来看看页面和元素是否真正能被识别

 

对于页面测试器检测到了的屏幕和元素,还可以直接在页面测试器里调用控件,执行动作,通过查看返回值以及屏幕是否发生变化来判断该控件是否正确使用了,例如下图,可以对时政要闻元素执行Click操作来观察结果

 

关于本文内容有任何问题或见解,欢迎在评论区留下你的想法,如果需要帮助,也可以直接联系到我 arthuryang1996@foxmail.com,感谢你的时间

 

ArthurYang_15-1706324819934.png

ArthurYang_14-1706324819917.png

ArthurYang_13-1706324819915.png

ArthurYang_12-1706324819912.png

ArthurYang_11-1706324819909.png

ArthurYang_10-1706324819904.png

ArthurYang_9-1706324819895.png

ArthurYang_8-1706324819889.png