RPA-中级认证通过经验分享
木然晓月异山
2024年06月07日 17:48

不管是应对考试,还是学习交流,祝大家都考取成功。这篇文章专门介绍考试的整个流程与套路。


题目简单分为两类:登录网页,登录订单管理系统。

登录网页目前有两个题目:

1.商品库存导出 特点: 比对数据勾选项目

获取网页订单的数据,然后与库存的项目一个一个对比。

2.客户信息筛选 特点:爬取链接后合并文本表格

获取客户的数据(会加载数据那个)

订单管理系统有三个题目:

3.商品销量排行 特点:各分组销量最多数据排序

只需要爬取订单数据商品编号分类销量最多。

4.订单数据录入 特点:随机排列字段录入数据

爬取订单数据录入

5.客户信息录入 特点:爬取窗口非单元格项目

爬取客户的信息,然后录入

考试时打开桌面的【中级实践题】查找题目是哪一个

作者只做过前面四道题目,最后一道只做过一次,卡在数据爬取了,所以不是很了解。有把握的是前面三道题目,前三道已经通过考试认证了,第四道题目和第五道题目太难了,不想研究了。


接下来是每个题目你都要做的事情,如果你都知道请看各个详细题目

1.元素适配教程

Uibot6.0版本修改元素属性可以通过鼠标光标移动到绿色(元素)部分打开【编辑】。

也可以通过打开【Ui分析器】找到元素设为目标函数进行编辑。

如果没有学习过html,css,窗口程序基础的,推荐第一个方法,先去识别一个的元素,这个元素不是选择好了就可以了,还需要通过编辑修改让元素适配,如果找的不是这个元素,可以打开Ui分析器左边的目录找到它的父元素或者子元素。

之前有个题目需要爬取公司的主页,但是直接数据爬取选择的数据只有网页这个文本,爬不到链接,要爬取链接需要设置爬取目标为链接(html中链接元素用<a></a>表示,链接有一个属性herf="https:xxx",这个href就是要爬取的链接,但是选择表格它只会爬取到<em></em>,因为元素可以嵌套所以它的结构大概就是:

<td><a href="xxxxxx"><em>网页</em></a></td> td代表单元格。

(UI分析器图片)

这一步骤会在获取客户订单专栏详细介绍。

上面介绍的例子是错选的问题,就是选择的元素不是需要的,本来选的是链接,但实际是文本这种情况。

接下来是漏选的问题,这个问题就是识别的元素不够通用,它没有共性。以本题目举例,框线项目属性如下:

(框线项目属性)

需要注意唯一的区别就是title后面会有(142982)这条属性改为*,表示在其他属性不变下任意title都可以,那么不管你拿张三登录还是李四登录,都会找到。所以避免漏选的最好方法是排除个性,在【编辑】界面找到比较特殊的属性全部去掉或者改为*,这样不管张三的页面还是李四的页面都可以识别。一般来说要修改的属性title,anname容易出现漏选,其他的都不会。

有个万能方法可以让你找到造成漏选的属性,就是找不同游戏,小时候我玩过两张奥特曼图片来找不同,不过现在给两段代码找不同。现在你只需要获取张三登录时候这个元素的源代码,粘贴到一边。李四登录的时候有同理。然后比较两个代码有什么不同。换言之,你可以刷新一遍重新识别元素,粘贴,然后比较哪些属性不同,对不同的属性进行适配

如果不进行元素匹配就会出现下面的错误:元素未找到,就是没有给元素做适配处理。

考试时候最好对每个选择的元素进行适配处理,一般要修改的是title,name,anname这三个属性。

这个步骤不能像复制代码一样,复制过来就可以用了,需要自己仔细加工。

2.Python插件问题

Uibot考试完全支持python插件,不是我擅长python非要用这个,而是真不需要很麻烦的操作(官网明明有教程),并且在数据处理方面比原有uibot方便很多。不要跟我杠为什么不用人家自己的,你自己写试试看就知道多复杂了。

在【文档】-【UiBot】文件夹-【creator】-【Project】-【你的流程名字】-【extend】-【python】下面新建一个文本文档txt.随便命名,我一般是Py.txt,然后改后缀txt为py,点击会弹出是否更改拓展,点确定就可以。

这样用记事本打开,考试的时候没有安装python调试环境,所以只能修改,不能调试,你不会你粘贴不就行了。

然后不要只保存,要选择另存为,有一个编码方式,一定要选utf-8。选择替换原文件。(当然一般记事本是默认utf-8)。

然后完了,需要更改代码,粘贴用记事本打开就可以了。Python是非常注重缩进的语言,记得检查缩进,不要无脑粘贴。保持代码整齐规范。

3.保存文件问题

有的题目最后会有保存文件到某个路径,一般是c:/exam_data/rpa/level2这个路径,注意! 这个是绝对路径。Uibot提供了一种相对路径,保存文件资源在流程里的方法:@res""。

比如使用打开Excel命令:

objExcelWorkBook = Excel.OpenExcel(@res"模版.xlsx",True,"Excel","","")

res是你的流程文件下的子文件夹,QQ群不是喜欢@全体成员吗,这里作用是一样的。

字符串""内就是文件夹里文件。

所以考试会给你模版文件。这个文件不是保存它说的c:/exam_data下,这个绝对路径是放考试结果的地方。可以先把模版文件下载到res文件(注意是你要的流程res,当然考试你只会建一个流程)下,然后写代码就可以用@res""了

res保存的模版和extend/python保存的python文件都是在你的流程文件夹,会一起打包的,不用担心提交了有没有这个文件

而c:/exam_data/rpa/level2,这个路径是考试的结果的路径,一般在excel另存(保存)

另存为Excel文件命令:Excel.SaveOtherFile(objExcelWorkBook,'''c:/exam_data/rpa/level2''')

4.登录流程解决办法:

登录来也流程创造者-新建流程,随便取名


以下三个题目是运行没问题,通过了考试的。其他题目还没有通过考试,虽然有过程代码,但不敢保证通过,仅供参考。注意打开源代码粘贴代码完看一下注释(绿色部分)

【商品库存导出】

Py文件代码


import re

def match(text):

  pattern = r'\d+/(\d+)'

  match = re.search(pattern, text)

  return match.group(1) if match else None 

#作用,获取列表项最后一页页数

def is_same_str(s,arr):

  return s in arr

#作用,返回布尔型,判断字符串s是否在数组里

def flatten_list(nested_list):

  return [item for sublist in nested_list for item in sublist]

#作用,去除嵌套列表[[1,2]]


Uibot代码

流程块一:登录来也网页


Dim hWeb,bRet,sRet,sText

hWeb = WebBrowser.Create("chrome","https://sim-academy.laiye.com/produce-manager/5182838/login",30000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"sBrowserPath":"","sStartArgs":""}) Keyboard.InputText(@ui"输入控件<input>","UiBot_140863",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false}) Keyboard.InputText(@ui"输入控件1<input>","DMyI7s",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

//注意设置输入控件1,2,3的属性

Do bRet = UiElement.Exists(@ui"菜单项目_库存1",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200}) If bRet Break End If sText = LocalOCR.ScreenOCR(@ui"图像<img>",{"x":0,"y":0,"width":0,"height":0},"SceneText",10000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"bSetForeground":true}) Keyboard.InputText(@ui"输入控件<input>3",sText,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false}) Mouse.Action(@ui"按钮<button>_登录","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false}) Loop While not bRet


流程块二:订单数据查询


Mouse.Action(@ui"菜单项目_订单","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

hWeb = WebBrowser.BindBrowser("chrome",7000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

sRet = WebBrowser.RunJS(hWeb,"function(){document.querySelector('#main > div > div > div.home-main > div:nth-child(2) > form > div:nth-child(1) > div.ant-col.ant-form-item-control > div > div > div > div > input').readOnly=false;document.querySelector('#main > div > div > div.home-main > div:nth-child(2) > form > div:nth-child(2) > div.ant-col.ant-form-item-control > div > div > div > div > input').readOnly=false;return 123}",true,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

//注意这里的document.querSelector('')单引号内的内容

//右键日期input有个检查,有个copy,选择copy selector粘贴就是#main这一坨了

//短期内不需要修改

Keyboard.InputText(@ui"输入控件<input>5","2021-08-28",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Keyboard.Press("Enter", "press", [],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})

Keyboard.InputText(@ui"输入控件<input>6","2021-09-07",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Keyboard.Press("Enter", "press", [],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})

Mouse.Action(@ui"按钮<button>_查询","left","dbclick",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})


流程块三:爬取数据和比对数据


Dim arrayData=[],objDatatable,sRet,iPageNum,arrElement

Import Py sRet = UiElement.GetValue(@ui"列表项<li>_1/3",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200}) iPageNum = CInt(Py.match(sRet)) for i = 1 to iPageNum Step 1 Keyboard.InputText(@ui"输入控件<input>_1",i,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false}) Keyboard.Press("Enter", "press", [],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"}) Delay(2000) arrayData = concat(arrayData,UiElement.DataScrap({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":[{"tag":"DIV","id":"main"}]},{"ExtractTable":0,"Columns":[{"selecors":[{"tag":"div","index":0,"className":"produce-manager","value":"div.produce-manager","prefix":""},{"tag":"div","index":0,"className":"produce-manager-home","value":"div.produce-manager-home","prefix":">"},{"tag":"div","index":0,"className":"home-main","value":"div.home-main","prefix":">"},{"tag":"div","index":0,"className":"ant-table-wrapper","value":"div.ant-table-wrapper","prefix":">"},{"tag":"div","index":0,"className":"ant-spin-nested-loading","value":"div.ant-spin-nested-loading","prefix":">"},{"tag":"div","index":0,"className":"ant-spin-container","value":"div.ant-spin-container","prefix":">"},{"tag":"div","index":0,"className":"ant-table ant-table-small ant-table-bordered","value":"div.ant-table.ant-table-small.ant-table-bordered","prefix":">"},{"tag":"div","index":0,"className":"ant-table-container","value":"div.ant-table-container","prefix":">"},{"tag":"div","index":0,"className":"ant-table-content","value":"div.ant-table-content","prefix":">"},{"tag":"table","index":0,"className":"","value":"table","prefix":">"},{"tag":"tbody","index":0,"className":"ant-table-tbody","value":"tbody.ant-table-tbody","prefix":">"},{"tag":"tr","value":"tr","index":0,"prefix":">"},{"tag":"td","index":5,"className":"ant-table-cell","value":"td:nth-child(5)","prefix":">"}],"props":["text"]}]},{"objNextLinkElement":'',"iMaxNumberOfPage":5,"iMaxNumberOfResult":-1,"iDelayBetweenMS":1000,"bContinueOnError":False})) Delay(1000) Next objDatatable = Datatable.BuildDataTable(arrayData,["商品编码"]) objDatatable_drop = Datatable.DropDuplicatesDataTable(objDatatable,["商品编码"],"first") objDatatable_drop=Datatable.GetDataTableByArray(objDatatable_drop,false) arr商品编码=Py.flatten_list(objDatatable_drop) TracePrint(arr商品编码) Mouse.Action(@ui"菜单项目_库存","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false}) data = UiElement.DataScrap({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":[{"tag":"DIV","id":"main"}]},{"ExtractTable":0,"Columns":[{"selecors":[{"tag":"div","index":0,"className":"produce-manager","value":"div.produce-manager","prefix":""},{"tag":"div","index":0,"className":"produce-manager-home","value":"div.produce-manager-home","prefix":">"},{"tag":"div","index":0,"className":"home-main","value":"div.home-main","prefix":">"},{"tag":"div","index":0,"className":"ant-table-wrapper","value":"div.ant-table-wrapper","prefix":">"},{"tag":"div","index":0,"className":"ant-spin-nested-loading","value":"div.ant-spin-nested-loading","prefix":">"},{"tag":"div","index":0,"className":"ant-spin-container","value":"div.ant-spin-container","prefix":">"},{"tag":"div","index":0,"className":"ant-table ant-table-small ant-table-bordered","value":"div.ant-table.ant-table-small.ant-table-bordered","prefix":">"},{"tag":"div","index":0,"className":"ant-table-container","value":"div.ant-table-container","prefix":">"},{"tag":"div","index":0,"className":"ant-table-content","value":"div.ant-table-content","prefix":">"},{"tag":"table","index":0,"className":"","value":"table","prefix":">"},{"tag":"tbody","index":0,"className":"ant-table-tbody","value":"tbody.ant-table-tbody","prefix":">"},{"tag":"tr","value":"tr","index":0,"prefix":">"},{"tag":"td","index":4,"className":"ant-table-cell","value":"td:nth-child(4)","prefix":">"}],"props":["text"]}]},{"objNextLinkElement":'',"iMaxNumberOfPage":5,"iMaxNumberOfResult":-1,"iDelayBetweenMS":1000,"bContinueOnError":False}) TracePrint(len(data)) For row =2 to len(data)+1 step 1 if Py.is_same_str(data[row-2][0],arr商品编码) UiElement.SetCheck(@ui"复选框_",true,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200}) end if Next Mouse.Action(@ui"按钮<button>_导出选中项","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false}) Keyboard.InputText(@ui"窗口_库存_20240606093219.xlsx","c:\\exam_data\\rpa\\level2\\商品库存表.xlsx",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false}) Mouse.Action(@ui"窗口_保存(S)","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})



【订单数据筛选】

python代码


import re

import pandas as pd

def match(text):

  pattern = r'\d+/(\d+)页'

  match = re.search(pattern, text)

  return match.group(1) if match else None

def drop(lst2d):

  return lst2d[1:]

def rank( dataframe ):

# 注意,注意,考试每个题目的字段都是不一样的,可能商品编码叫做商品编号,你要自己改一下,包括订单数量,有时候是数量,需要自己修改!

  grouped=dataframe.groupby ( '商品编码' ).apply (lambda x: x.sort_values ( '订单数量' , ascending = False ).head ( 1 ) ).reset_index ( drop = True )

  return grouped.sort_values('订单数量',ascending = False)


Uibot代码

流程块一:登录订单管理系统


Dim iPID,bRet,sText

iPID = App.Start('''C:\soft\订单管理系统\订单管理系统.exe''', 1, 1)

UiElement.Wait(@ui"客户端_订单管理系统-登录","show",10000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

Keyboard.InputText(@ui"可编辑文本_用户","UiBot_140613",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Keyboard.InputText(@ui"可编辑文本——密码","yHFUSN",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Do 

 bRet = UiElement.Exists(@ui"窗口_登录",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

 sText = LocalOCR.ScreenOCR(@ui"窗格_密码:",{"x":0,"y":0,"width":0,"height":0},"SceneText",10000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"bSetForeground":true})

 Keyboard.InputText(@ui"可编辑文本_yzm",sText,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

 Mouse.Action(@ui"窗口_登录","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

 BRet = UiElement.Exists(@ui"对话框",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

If BRet

Mouse.Action(@ui"窗口_确定","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

End If

If not bRet

  Break

 End If

Loop While bRet


流程块二:查询订单数据


//注意这里的所有框线项目都需要设置属性title=*

Mouse.Action(@ui"框线项目_0","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

Delay(1000)

Mouse.Action(@ui"框线项目_1","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

Delay(1000)

Mouse.Action(@ui"框线项目_2","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

Delay(1000)

Keyboard.InputText(@ui"窗口_2021年1月1日","2021-06-09",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Keyboard.InputText(@ui"窗口_2024年5月31日","2021-06-19",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Mouse.Action(@ui"窗口_查询","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})


流程块三:爬取数据并筛选


Dim arrayData=[],sRet,arrRet,objDatatable,objExcelWorkBook

dim arr,data,res,title Import Py sRet = UiElement.GetValue(@ui"窗口_1/4页",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200}) sRet = CInt(Py.match(sRet)) for i = 0 to sRet Step 1 arrayData = concat(arrayData,UiElement.DataScrap({"wnd":[{"cls":"WindowsForms*","title":"*","app":"订单管理系统"},{"cls":"WindowsForms*","ctrlname":"panel2","idx":3},{"cls":"WindowsForms*","aaname":"DataGridView","ctrlname":"dgv_order_list","idx":5}],"ctrl":[{"role":"ROLE_SYSTEM_TABLE","name":"DataGridView"}]},{"ExtractTable":1,"Columns":[]},{"objNextLinkElement":'',"iMaxNumberOfPage":5,"iMaxNumberOfResult":-1,"iDelayBetweenMS":1000,"bContinueOnError":False})) Mouse.Action(@ui"窗口_下一页","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false}) Delay(1000) Next objDatatable = Datatable.BuildDataTable(arrayData,arrayData[0]) objDatatable = Datatable.DropDuplicatesDataTable(objDatatable,[],"first") arr=Datatable.GetDataTableByArray(objDatatable,false) data = Py.drop(arr) title = arrayData[0] res = Datatable.BuildDataTable(data,title) res = Py.rank(res) TracePrint(res) res=Datatable.GetDataTableByArray(res,false) //将模版文件下载到res文件夹,并且命名为模版 //这里不一定要模版.xlsx,你只需下载模版excel到res,输入@res"时候会出现依赖项,你可以自己选择有那个名字的excel objExcelWorkBook = Excel.OpenExcel(@res"模版.xlsx",true,"Excel","","") Excel.WriteRange(objExcelWorkBook,"Sheet1","A2",res,false) Delay(1000) //注意,这里的路径一切以考试要求的路径为准,将考试路径粘贴到三引号内 Excel.SaveOtherFile(objExcelWorkBook,'''C:\exam_data\rpa\level2\商品销量榜单.xlsx''') Delay(1000) Excel.CloseExcel(objExcelWorkBook,true)



【客户信息筛选】

Python代码


import re

import pandas as pd

def match(text):

  pattern = r'\d+/(\d+)'

  match = re.search(pattern, text)

  return match.group(1) if match else None 

def da(company_info,company_url):

   

  return(

  pd.DataFrame(company_info)

  .set_axis(list('ABCDE'),axis=1)

  .query("C=='主页'")

  .reset_index()

  .join(pd.DataFrame(company_url))

  .set_axis(list('ABCDEFG'),axis=1)

  .loc[:,list('BCGEF')]

  .set_axis(['客户行业', '客户编码', '公司网址', '联系方式', '名称'],axis=1)

  .query("客户行业=='农业'")

)

# 一定注意,那个列表按照考试给的模版Excel标题顺序和字段,不同考试查询行业也是不同


Uibot代码

流程块一:登录(同题目一)


Dim hWeb,bRet,sRet,sText

hWeb = WebBrowser.Create("chrome","https://sim-academy.laiye.com/produce-manager/5182838/login",30000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"sBrowserPath":"","sStartArgs":""})

Keyboard.InputText(@ui"输入控件<input>","UiBot_140863",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Keyboard.InputText(@ui"项目_","DMyI7s",true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Do 

  bRet = UiElement.Exists(@ui"菜单项目_库存1",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

  If bRet

    Break

  End If

  sText = LocalOCR.ScreenOCR(@ui"图像<img>",{"x":0,"y":0,"width":0,"height":0},"SceneText",10000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"bSetForeground":true})

  Keyboard.InputText(@ui"输入控件<input>3",sText,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

  Mouse.Action(@ui"按钮<button>_登录","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

Loop While not bRet


流程块二:爬取+筛选客户信息


Dim arrayData,objElement,arrElement,res,objDatatable,objExcelWorkBook

Mouse.Action(@ui"菜单项目_客户","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})

Dim company_url=[],company_arrayData=[],sRet,arrRet

Import Py

sRet = UiElement.GetValue(@ui"列表项<li>_1/4",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

sRet = CInt(Py.match(sRet))

for i = 1 to sRet Step 1

// 抓取公司信息,注意不能抓取链接

Keyboard.InputText(@ui"输入控件<input>_1",i,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})

Keyboard.Press("Enter", "press", [],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})

Delay(1000)

UiElement.Wait(@ui"文字_加载完成","show",10000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})

company_arrayData = concat(company_arrayData,UiElement.DataScrap({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":[{"tag":"TABLE","idx":1}]},{"ExtractTable":1,"Columns":[]},{"objNextLinkElement":'',"iMaxNumberOfPage":5,"iMaxNumberOfResult":-1,"iDelayBetweenMS":1000,"bContinueOnError":False}))

Delay(1000)

// 然后是抓取链接的问题,这里最好定义一个变量row_end替换下面的11

for row = 2 to 11 Step 1

sRet = UiElement.GetAttribute(@ui"链接<a>","href",{"bContinueOnError":true,"iDelayAfter":300,"iDelayBefore":200})

company_url = push(company_url,sRet)

Next

Delay(1000)

Next

//对客户信息数据处理

res = Py.da(company_arrayData,company_url)

TracePrint(res)

res=Datatable.GetDataTableByArray(res,false)

objExcelWorkBook = Excel.OpenExcel(@res"客户统计.xlsx",true,"Excel","","")

Excel.WriteRange(objExcelWorkBook,"Sheet1","A2",res,false)

Excel.SaveOtherFile(objExcelWorkBook,'''C:\exam_data\rpa\level2\客户统计.xlsx''')

Excel.CloseExcel(objExcelWorkBook,true)



这篇文章不算教程,只是整合以前做过题目的代码。需要用的时候复制粘贴。