
最终数据以数据表格展示,由于每个人员的归属部门,都包含在部门列,所以没有做额外的部门展示。





代码大概五十多行,里面还有一些调试代码没删。
下面开始讲讲整个的逻辑。
1.捕获元素
总共捕获五个元素。


1.1捕获通讯录按钮。

1.2捕获组织架构按钮。
头两个其实没什么好说的,就是每次重置,保证你软件处于任何状态都可以正常运行。
捕获正常捕获就可以。
1.3捕获当前组织架构按钮


整个细节会多一点。
捕获先按正常捕获,然后在倒数第三个元素节点加index=1,不然会把上面的“组织架构”也捕获进去。
然后会发现,捕获出来会包括那个跟“>”很像的符号。
这时候就在最后一个元素节点,添加acc-name,然后用正则匹配,^((?!\ue601).)*$,这个式子的意思就是过滤那个符号的节点,只留下部门节点。

1.4捕获下级部门节点。
只要捕获部门名字就可以,这个应该正常捕获就可以不需要额外操作。

1.5捕获下属人员姓名节点。
这里也有个细节,我们正常捕获出来,会把岗位还有“超级管理员”、“负责人”这种都捕获出来。这时候给最后一个节点加个index=1,就可以锁定姓名,index=0是那个头像的位置。
2.流程操作
元素捕获完了,接下来就是整个操作流程。
我们把整个组织架构的捕获分为三件事。
一个是当前组织架构信息的抓取。
一个是点击子部门。
一个是返回上级部门。
而外面是一层无限循环,每一次我们面对的都是组织架构里某个具体的节点,不管他在哪一层,我们要处理他的问题都是一样的。

以上方这个图为例。
如果运营一队、运营二队没抓过,那就得点击进去。
如果都抓过,那么就得返回上一级。
2.1当前组织架构信息的抓取。
每个页面我们点进去,要抓的东西又分成三块
一个是当前部门信息,我们在哪个部门下面抓数据。
一个是下属部门信息,我们还有几个下属部门可以点。
一个是下属人员信息,我们如何获取姓名和岗位。
2.1.1当前部门信息。
这个拿捕获元素3“当前部门”就可以。
然后把获取的相似元素列表拼接成字符串。
2.1.2下属部门信息。
这个拿捕获元素4“下级部门相似元素”就可以。
2.1.3 下属人员信息。
这个拿捕获元素5“下属人员姓名相似元素”就可以得到姓名。
而岗位则采用关联元素,获取下一个元素节点的方式来完成。
我们无限循环获取下一个元素节点。
如果下一个元素节点是none,那就终止。
如果下一个元素节点存在,那就把元素节点的文本更新。
因为按照规律,岗位必然是在这一级节点的最后一个(可惜index不能直接=-1,不然都不用这样)。
------------------------

其实这个地方还有另一种方案。动态调用子流程,无限去下探获取文本,然后把每一行组成一个列表,比如['叶子','超级管理员','CEO'],取头取尾,如果列表长度为1,就说明没有岗位。

不过这种方式捕获的就不是成员姓名,而是捕获整行。按照这种方式匹配相似元素组,然后去无线下探做文本列表。
但是这个层级的相似元素也会包括部门,需要对部门进行过滤。
虚线里是另外的思路,也可以不看。
-----------------------
2.1.4 获取和写入数据的时机。
我们数据获取了,自然就写入数据表格,这个没什么好说的。
但是有个问题,如果每次到当前节点都写入数据,有些人就会被多次写入。
比如上图里的怀真,进来节点的时候写入,从运营一队节点返回,还是会写入,从运营二队节点返回,还是会写入。一个怀真会被写入三次。
这明显不是我们希望看到的。
那我们写入的时机是什么,写入的时机就是,不是返回上级部门的时候写入。
2.2点击子部门。
我们什么时候应该点子部门?
点击子部门的时机,应该是当前节点存在没有点过的下级节点。
所以我们会建立一个列表,里面存有我们点过的节点名称。
当然为了避免重名,以及体现他们和上级部门之间的关系,我们需要把下级部门名字和当前节点的名称拼接。
我们只要还有没点过的下级部门。在我们完成获取数据的任务后,我们就点击这个新的下级节点。
如果没有,那就不点,那就到了下面的返回上级部门的逻辑。
2.3返回上级部门。
我们要返回上级部门,那就得先找到按钮可以返回。
那就是当前部门的元素里,倒数第二个元素,就是他的上级部门。
那我们什么时候点返回上级?
就是2.2里点击下级部门,已经没有的点的时候。在代码里用变量b来控制。

当然,这里返回上级部门,如果在根目录怎么办?
像上图的情况,我们就在要返回上级之前判断,如果当前部门的相似元素只有一个了,那就把无限循环断了,说明我们把部门人员全部都获取到了。
OK,如上就是我的整个思路逻辑。欢迎讨论交流