Personal Insights
SAP Build Process Automation (SPA) 中级练习-抓取实时汇率信息(下)
本文档内容是基于我个人对SPA的理解产生的,目的是帮助您进一步了解SAP流程自动化 (SAP Build Process Automation 简称SPA) 的开发方式
本文档面向的人群是拥有1年及以上代码开发经验的开发者。
本文档是SPA中级练习-抓取实时汇率信息的下半部分(上半部分主要关注从零构建一个基础自动化流程),主要分享实战调优方面的个人经验
通过此文档,您可以学习到SPA的实战用法,包括如何应对网页可能的卡顿,如何利用脚本将字符串中的有效数据提取出来,如何将文件在不同日期以不同名字保存,以及更多优化方式的经验分享等。
这里是上一篇中流程搭建的结果
全过程包括了:
打开一个新的excel,再打开外汇管理局网址
抓取汇率列表,并遍历所有汇率的LI控件,先获取text,再将text推入当前的excel内
最后保存excel
但这样一个简单的汇率抓取流程,要真正用到实战中还存在很多问题,
1.稳定性上:网页加载可能会卡顿;网页出现了但是元素加载卡顿;现在读取到的数据是一整行的文字而非可以直接录入系统的数据;Excel文件另存为时可能遇到文件已存在的情况
2.易用性上:每天运行的Excel是否需要分别以不同的名字存储起来?
这里分享一些我自己常用的方法来解决这些问题,其实还有很多控件都可以辅助解决,只是我个人用这些方式比较顺手,给大家做一些参考。
1.应对网页或元素卡顿
无论网页卡顿或是元素卡顿,机器人这种无侵入性的技术都无法加快这个进度,我们只能模拟人再遇到这种情况下的操作:等待。
而等到什么时候呢? 那只需要等到这个页面出现,并且我们需要操作的元素也出现就可以继续流程了,一般网页出现但元素加载缓慢这个现象比较常见,所以这里以此为例,通过加入Wait Element控件,来让机器人等到汇率元素出现再继续操作:
将控件纳入流程后,点击该控件,在右侧编辑其属性
这样,机器人会在识别到汇率元素集合中的第一个元素时,才继续运行,这样就避免了元素加载过慢导致机器人抓不到数据的问题
2.从字符串中抽取数据
机器人现在抓取到的数据是类似这样的:
而这样的字符串显然不适合直接填入系统,我们需要从整体的字符串中提取出数据该怎么做呢?首先可以直接去声明更深层次的元素,以抓取到目标数据,其次呢,我们还可以利用脚本从这样固定格式的字符串中提取出我们需要的数据,
放到流程中,就是在获取到字符串之后,将其传入自定义脚本控件,再将解析完的结果传出,送给Push Value用以放入Excel中
接下来双击流程中的脚本控件,来编辑细节,先添加脚本中要使用的输入输出变量:
这里涉及到Javascript的编程内容,对于没有代码基础的同学可能比较晦涩,我们只需要知道这个脚本接收一段文字,然后将其分割成4段后输出就可以了:
return input.split((/[\s]/));
再点击流程空白处,将脚本的输入设置为Get Element的输出
现在我们获得了分割后的数组,就不需要Push原字符串到Excel内了,将脚本的输出Push进去即可:
此时再运行流程,Excel内的数据就会变成这样:
我们甚至可以在Excel刚创建出来的时候就将字段名称Push进去,这样可读性会更高。
3.以更加用户友好的方式存储结果
现在的流程结尾会将Excel文件存储为固定的名字,这样重复运行机器人时会遇到“该文件已存在”的错误,针对这个问题有多种解决方案:可以在流程初始阶段检查文件是否存在,若存在则删除;可以将文件存储到新创建的当日文件夹等等,
这里选择简单的将文件根据时间存储为不同的名字来解决这个问题:
首先我们需要获取到流程运行当时的时间,那么在Save As Workbook之前加入一个脚本控件用以获取该信息,该脚本不需要输入,输出一个now的字符串变量:
var temp=new Date();
var temp2=temp.getFullYear()+’-‘+String(temp.getMonth()+1)+’-‘+temp.getDate()+’-‘+temp.getHours()+’-‘+temp.getMinutes();
return temp2;
然后利用这个now变量来组成被保存的Excel的名字:
“C:\\Users\\Public\\” + Step9.now + “.xlsx”
这样最后存储的Excel文件名就会是流程运行的当前时间。
4.更多优化方式的经验分享
优化到这里,该流程已经基本能用了,简单的修改一些命名之后,流程长这样:
当然了,为了让流程更加鲁棒,在各种不同情况下都能运行,我们还可以快速的添加许多功能,例如:
为防止保存文件时遇到重名文件,可以在流程的最前端添加文件检查;
要存储多个文件时,可以创建当日文件夹,并将所有文件都存进该文件夹;
需要用户自定义流程参数时,可以在本地Excel文件或者代理内存储一些变量,然后在流程最前端读取;
为防止流程启动前应用已打开并停留在不同页面,可以在流程最前端检查应用是否存在,若存在则关闭应用,这样保证应用都是从头打开的;
5.处理Excel内的大量数据
当我们要读取的Excel在数十行的程度时,还可以使用控件来操作,但如果内容超过数十行,我们可能就要借助专门的控件Excel Cloud Link来一次性读取大量数据了:
首先搜索并拉出一个Excel Cloud Link到流程中:
双击它之后,会发现配置内容比较多,我们一个一个来,首先将要读取的文件Sample拖进左侧方框(我们先前保存的汇率结果Excel是不含第一列表头的,之后我们可以在创建Excel的时候直接将表头Push进Excel)
我这里使用的是含表头的汇率结果:
拖入后的界面如下:
其中,设计参数都是来自Sample Excel文件,只需要选对工作表即可
执行参数相对复杂一点,其中,
- 范围定义(即要读取的数据范围)目前是一个常数,但是当我们要读取的Excel超过3行时,我们就应该读取一个动态的范围,也就是Excel的每一行,所以应该在Excel Cloud Link之前打开目标Excel,并通过Get UsedRange Row来获取该Excel的行数,这样范围定义就会是[”A1:D”+行数], 也就是会读取新文件第一到四列的所有行内容、
- 工作簿路径,即我们要读取的路径+Excel文件名,和Open Excel需要的一致
- 工作表名称,即我们要读的Sheet名,默认为Sheet1
- 数据参数:在我们确定要读取文件的路径,文件名,工作表,表内的数据范围之后,我们还需要确定这些数据在读取后会变成什么格式,所以我们要先建立起数据格式,点击图中所示的 “+自Excel数据”
直接点击创建后,离开流程编辑页面,从左边侧边栏找到 数据类型-刚刚设定的名称,可以看到只包含了一个默认变量叫做varName
然后咱们针对目标数据,来新建字段(点击字段后在右侧编辑其属性),让该数据类型变成这样:
然后回到流程编辑页面,就会看到刚刚创建的数据类型出现在了执行参数右侧
最后将数据参数下的长方形拖到右侧 在此处映射上,就可以建立映射关系,重复四次操作
最后执行该流程,在完成汇率抓取及保存之后,看看Excel Cloud Link读取出来了什么:
整个Excel Cloud Link的配置如下图:
这样我们就可以继续使用脚本来批量处理这些汇率信息了,例如我们要找出汇率比较超过5的币种,我们又发现所有人民币的金额都是100,那么我们可以将Excel Cloud Link读取出来的变量交给后续的脚本,用以下代码来返回那些汇率超过5的部分:
var output=[];
for (var i = 0; i < input.length; i++) {
if(input[i].金额1 > 500 || input[i].金额2 >500){
output.push(input[i]);
}
}
return output;
以上都是我个人一些粗浅的经验,实际上基于丰富的控件我们可以实现更多的逻辑来适配更多业务需求,希望这些内容可以对大家有所帮助。
其他深度用法在这里就不做赘述了,请在blogs.sap.com上搜索内容和这里的深度用法Template ,或者直接联系我 arthur.yang@sap.com