流程定义之高级篇(Part 1)
1、流程说明
在 《流程定义之进阶篇》 一文中,我们已经知道了什么是WHILE循环,什么是滚动页面,以及如何点击元素。 本文,我们在上述流程的基础上做一些更高级的内容拓展,试图让大家理解什么是遍历循环,以及如何通过自定义变量来辅助我们编写简单的业务逻辑——本章节, 确实需要您具备一定的编程思维和JavaScript的初步知识。
还是回到我们在《流程定义之基础篇》 以及 《流程定义之进阶篇》 中举的例子:我们在eBay中搜索“power bank”, 现在假定在搜索结果的页面中(不知道在哪一页),有一笔搜索结果是我们希望查找的商品,如下图所示:

《试图在搜索页面中寻找的商品》
我们判断这个商品的依据是:
- 商品的名称包含:Anker 10000mAh Slim Power Bank Charging Portable External Battery Backup Charger
- 商品的价格为:21.99 美元
我们现在希望做到:在搜索页面中遍历所有的检索结果,如果某个商品同时符合上述两个条件,便认为找到了我们希望查找的商品, 然后点击此商品查看商品详情,并将其加入到购物车中。
好吧,回到这个示例流程的出发点,此示例流程的目的是:如果能够通过查询关键词检索到某个商品,并将其加入到购物车, 如果这种操作行为可以自动化且完全拟人的重复操作,那么这种操作行为能够有效的增加商品的权重,让此商品在搜索页面中的排名靠前, 从而增大商品的曝光率与成单率。
2、流程变量
现在让我们观察每一个WHILE循环的循环体内容,可以发现:搜索结果其实是一个包含60个商品的记录集,现在要做的工作是想办法遍历记录集中的每一个商品, 并提取每个商品的名称与价格,再将名称与价格与上述条件进行判断,如果两个条件都符合,则认为找到了我们希望搜索的商品。

《每一个商品都是一个重复的循环元素》
为了完成上述目标,我们需要在流程定义中声明以下用户自定义变量:

《声明用户自定义变量》
- item:类型为“网页元素”,也就是某个页面节点,代表60个商品结果集中的某一个
- product:类型为“网页元素”,代表某个商品的产品名称
- price:类型为“网页元素”,代表某个商品的产品价格
- find:类型为布尔值,其取值范围只能为 true 或者 false,代表真或者假
在声明变量时,除了要声明变量类型,还可以指定其初始值,以 find 变量为例,我们设置其初始值为 false,代表没有找到,如下图所示:

《自定义变量的类型与初始值》
3、遍历循环
变量定义完成后,我们现在需要用到“遍历循环”这个流程节点。“遍历循环”可以用于两种场景:
- 场景一:基于父容器循环直接子元素。如前文所述,一个网页本质上是由若干个节点组成的一棵树,因此,任何一个网页节点,都可能拥有0至多个子节点,如果我们通过selector定位某一个父节点,便可以依次遍历该父节点的直接子节点。
- 场景二:基于重复的子元素。此场景下,会把网页中认为重复的子元素依次进行遍历循环。
显然,我们这里可以选择场景二:基于重复的子元素,因为在eBay的搜索结果集中,会出现60个类似的商品,而我们现在要做的是,依次循环这60个商品, 提取它们的属性并加以判断,以试图寻找到我们尝试搜索的商品。
3.1、遍历循环的插入位置
“遍历循环”节点应该插入到流程定义的哪个位置?显然,应该插入到“滚动页面”与“点击元素:翻页”之间。 也就是说,当浏览器显示搜索结果页面后,我们首先滚动页面到底部,以确保每一个搜索结果都能够正常显示, 然后开始遍历循环每一个商品并提取它们的属性加以判断,遍历循环结束后,如果没有找到我们希望寻找的商品, 则通过点击元素进行翻页,并依次反复,直至找到我们希望查找的商品。

《“遍历循环”流程节点的插入位置》
3.2、遍历循环的基本属性
从节点列表中选择“遍历循环”节点并拖拽至指定位置,在弹出的属性对话框中,我们需要: (1)选择“基于重复的子元素”,(2)拟提取的子元素数量为2个(商品名称与商品价格)。

《插入“遍历循环”流程节点》
3.3、指定重复的循环元素
下面要为“遍历循环”流程节点指定重复的循环元素: (1)点击“循环元素”的编辑图标,(2)激活网页元素选择器,由于此时的上下文是希望查找“循环元素”,因此,此时的网页元素选择器也处于“选择循环元素”的状态, 换言之,网页元素选择器能够帮助我们智能的判断当前网页中哪些元素是类似的,(3)显然,重复的循环元素应该是这60个商品结果集, (4)找到循环元素后,在网页元素选择器中点击预览,可以发觉共找到60个元素,代表我们的选择是正确的,点击确定返回至流程编辑器, (5)将找到的循环元素提取至变量 {item}。

《指定“遍历循环”流程节点中的循环元素》
3.4、提取子元素商品名称与商品价格
每一个循环元素为商品,而商品是一个网页节点,它包含有若干子/孙节点,其中,一定会包含商品名称与商品价格这两个节点,因此, 我们需要将这两个节点提取至变量。
(1)点击“子元素1”的编辑图标,(2)激活网页元素选择器,此时,网页元素选择器处于“选择子元素”的状态,它会从父元素(也就是上文中选择的循环元素)中选择第1个作为容器, 只允许您在此容器中选择子节点,(3)选择商品名称这个节点,(4)找到子元素后,在网页元素选择器中点击确定返回至流程编辑器, (5)将找到的子元素提取至变量 {product}。

《提取子元素“商品名称”》
与上述操作类似的是,将商品价格子元素提取至变量 {price},如下图所示,不再赘述:

《提取子元素“商品价格”》
3.5、以日志输出的形式辅助排错
流程已经比较复杂了,高级篇的第一部分即将结束,让我们喘口气,回顾一下我们的工作成果。现在,我们在遍历循环体内放一个“打印日志”的流程节点, 并输出我们提取的两个变量 {product} 与 {price},检查一下流程定义是否有问题,如下图所示:

《通过打印日志辅助流程编辑过程的排错》
4、执行预览
点击“执行预览”,花漾指纹浏览器开始执行流程定义中指定的内容,在输出日志中,我们可以观察到,流程变量 {product} 与 {price} 提取正确,如下图所示:

《流程变量 {product} 与 {price} 提取正确》
5、总结
在本文中,我们知道了什么是遍历循环,什么是用户自定义变量,并了解了网页元素选择器“智能上下文”的功能,它能够根据流程定义的上下文,自动的处于:选择单个元素、 选择循环元素、选择子元素等不同的状态;最后,我们还可以通过“打印日志”的流程节点帮助我们排错,验证流程定义是否符合我们的预期。
请进一步阅读 《流程定义之高级篇 Part 2》一文。