那么,在第二节课程中我会带着大家一步步地创建一个流,通过这个案例让大家快速上手PAD的基本操作。另外,在本节课的最后我还为大家准备一份PAD的调试指南,可以帮助大家利用一些基本原则来快速定位bug以及解决bug。
在PAD里帮你完整解决一个问题的流程就是流,至于流是简单还是复杂,那就丰俭由人。用PAD逐个打开京东、淘宝的网址,这个操作可以是流;用PAD打开商品网址后,复制标题和价格到Excel,这个操作可以是流;用PAD打开商品网址后,复制标题和价格到Excel,然后把Excel作为附件发送给自己,同时抄送给同事,这个操作也可以是流。因此,一个流中的动作数量和复杂程度没有任何限制,只要这个流可以解决预想中的问题,就可以称之为一个完整的流。
如上文的例子所述,如果评估完成本和收益后还是觉得使用PAD更划算,那我们再来认真学习如何创建一个流也不迟。
上文提到过,我们可以把PAD理解成一种编程工具,而利用编程工具解决问题可以分为三步:
那么把这个流程应用到PAD上,就可以得到如下步骤:
假如说我有一个需求:给定一批京东商品的网址,逐个在浏览器上访问,然后截图保留快照到本地文件夹,最后把文件夹打包压缩。
这里的需求相对简单,多体验几次就可以直接生成下面这份流程图。我们大致可以将这个流程分为两个部分:Excel读取、浏览器循环打开网址并截图。
这时我们就需要想想,在人工操作的时候我们是怎么来确定选中区域的范围的?其实很简单,只要找到文字和空白行交界的地方,从第一行到这里就是该选中的位置。
所以在PAD里面,我们可以先定位出表格里第一个空白行,然后提取表格里面第一行到「第一个空白行-1」范围之间的内容。
因为不同的模块是靠变量来传递信息的,上一个模块的输出是下一个模块的输入。上一个模块写好了,我们应该检查一下这个模块输出的内容是否满足我们的要求,如果不满足,则下一个模块也无法正常对接运行。
这里我们希望的输出是一个存放着所有需要遍历的网址列表ExcelData,所以我们只需要观察在此部分模块结束时,ExcelData中的数据是否符合我们的需求即可。
点击「运行」,等待流执行完成。完成后在「流变量」区域点击ExcelData,发现数据类型的确是「数据表」,并且表中存放着需要遍历的所有网址,这就代表着这个模块我们已经创建成功了。
正常来讲,此处应该直接开始编写循环结构,但这样每次调试都需要运行一次之前的步骤,既耗时又增加了调试的复杂度,和我们「分模块拼接」的思想是相悖的。
因此,在循环这个模块里,我们其实只需要一个存放着网址列表的变量输入。为了方便下面的调试,可以全选上一个模块的动作,然后在右键菜单中选择「禁用操作」。
首先是用浏览器打开:
现在网页加载好了,我们该进行截图操作了。PAD自己提供了三种截图的动作。
这里我们选择「获取屏幕截图」这个动作,多显示器的用户可以指定要截取的屏幕,单一屏幕可以直接选「所有屏幕」。
我们希望截图能够以文件的形式保存,那么就需要指定一个本地路径。这里的本地路径可以在目标文件夹内随意复制一个文件的地址后粘贴进来,然后修改最后的文件名和文件后缀。等截图完了,我们就可以关闭浏览器。
当循环里的任务编写完后也需要做一次检查,点击「运行」看看目标文件夹内是否生成了对应的屏幕截图。
我们现在尝试把单项任务放到循环里面。
首先,我们需要一个列表作为循环的输入。按照「分模块调试」的思想,我们应该另外创建一个存放网址的列表作为模块测试的输入源,避免前方动作耗时太长而降低模块测试的效率。不过,在这个案例中前方的动作数量较少,耗时不多,所以权且直接启用上一个模块的输出作为循环模块的输入。
接着,我们对ExcelData进行「foreach」循环,每次循环到的网址储存到CurrentItem里面。
点击「运行」,我们来看看是否这个模块按照我们的期望输出了三个商品的截图。很遗憾,没有。文件夹最后只有一张截图,这是因为我们所有的截图文件都采用了同一个文件名,每次新的截图把前一个直接覆盖掉了。
因此,我们需要让不同的截图拥有不同的名字。方法有很多,这里我想用网址中的数字编号来做唯一的匹配符。从网址里获取第20个字符后12个字符长度的内容,赋值为ItemID,然后放入图片的保存路径。
此时再运行一次,就可以发现文件夹里成功包含了三张商品的截图。
虽然运行成功了,但是我们也能发现每次打开浏览器然后关闭太耗时。当循环次数少时尚能接受,次数增多后则非常难熬。
与开启关闭浏览器相比,在开启的浏览器中跳转新网址则会快很多,所以我们可以在循环外开启和关闭浏览器,循环内只完成不同网址的跳转。
打包压缩这一步很简单,PAD有成熟的动作,拖进工作区填表即可。
很不幸,正因为Bug是意料之外的,所以我也很难直接告诉你一个框架性的处理Bug的流程。不过处理Bug可以拆成找Bug和解决Bug两个环节,还是有一些基本的原则可以帮助你事半功倍。
通常我们运行一个流,它报错时会直接提示你是在第几个操作上出了什么问题,这个时候你可以直接点开对应的操作看看是不是自己配置上出了什么错误。
比如下图的「提示-图像不存在」,原因在于我们的文件路径少了文件后缀,即文件的路径应该是D:\我的坚果云\常用模块案例\04-批量提取身份证信息\身份证图片集\身份证.png,而不是D:\我的坚果云\常用模块案例\04-批量提取身份证信息\身份证图片集\身份证。
简单的配置错误其实通过报错的信息就可以解决,但有时候我们会发现报错提示的操作的配置并没有问题,这就说明问题出在更前面的操作里。
这个时候我们可以通过设置断点,流运行到断点就会自动停止,只有我们点击「运行下一个操作」流才会继续往下运行,然后通过在变量区观察断点操作前后变量值的变化,就可以验证断点处的操作是否符合我们的要求。
在写一些比较复杂的流时,可能涉及到多个软件,以及数百个操作。这个时候如果想要验证的操作是第80个,那从头开始运行就会很耗时。
另外,调试的时候经常会运行数十次才能找到问题,如果每次都需要前面的操作运行几分钟,那整个调试的效率就会非常低。
这种场景下我会更建议大家将一个复杂的流拆成几个模块(通常是根据不同的软件),上一个模块的输出就是下一个模块的输入。然后除了测试模块,其他模块全部禁用,在测试模块前手动设置测试模块里所需变量的值,观察测试模块的输出是否符合预期。
通常我们定位到Bug以后,整个问题其实就解决了一半。解决Bug的方法核心其实就是查文档、搜索然后不断修改验证。
PAD中的每一个操作微软都提供了一个参考文档,可以点击「详细信息」快速直达。对照文档,可以看看自己的配置是否存在问题。
另一个方法是我们可以设置一个Warning变量存放我们想要观察的变量值,然后通过调用子流来输出。这个触发条件可以是报错就触发,也可以指定特定报错类型才触发。