UiBot攻克应用程序内下拉列表框

UiBot攻克应用程序内下拉列表框

  • 一共想到了四种方法
    • 1.通过百度ocr识别
    • 2.通过推测下拉进度条到达某城市的时间
    • 3.通过获取元素值是否为空判断有没有到达某个城市
    • 4.最终解决办法:使用鼠标点击目标图像的方法,循环

公司有项目需要用到UiBot,本人也是第一次接触UiBot,使用UiBot主要是为了实现自动化流程。因为这个项目是针对应用程序,不像浏览器可用直接使用selenium那样方便,同时这个下拉框元素取值特别麻烦。。。想了想还是写个文章记录一下。。。

这里形容一下:下拉列表比较复杂,层层递进,同时使用UiBot无法获取到下拉进度条的元素。

UiBot攻克应用程序内下拉列表框_第1张图片

一共想到了四种方法

1.通过百度ocr识别

ocr最简单,简单说一下,最外围代码设置一个while循环,之后通过UiBot的点击图像方法,识别当前范围有没有某个城市,如果有,点击,如果没有,通过点击下拉进度条的坐标,达到下拉的效果,直到找到城市名为止。
同时说明一点,UiBot的ocr识别只支持百度ocr(含位置)与百度ocr(高精度含位置)两种方式,那啥,通过实验,如上图这么标准的中文,居然还要高精度才能识别出来,高精度百度ocr标价为两分钱一次,这不是烧钱么。。。弃。。。(这段代码很早就删了,,不想重复写)

2.通过推测下拉进度条到达某城市的时间

UiBot攻克应用程序内下拉列表框_第2张图片

忘记说明了,通过元素取值可以取到城市的元素,但是如果直接使用鼠标点击元素是不能成功的,因为元素没有出现在可视化列表框内,只有当元素出现在框内,才可以点击。
因为下拉进度条需要执行点击动作,根据时间长短,推测出下拉到某个城市所需但是时间,上图仅仅是省份的列表推测,就已经显得比较臃肿了,并且列表框比较短还好,长的话下拉时间不是太准确,很可能两次下拉能到达的省份不相同。

3.通过获取元素值是否为空判断有没有到达某个城市

{"wnd":[{"app":"EPPortalnew","cls":"TApplication","title":"自然人税收管理系统扣缴客户端"},{"cls":"TFrmVertListControl","title":"FrmVertListControl","aaname":"FrmVertListControl"},{"cls":"TPanel"},{"cls":"TMyPanel","idx":33}]}

这里是“安徽”的元素,最后的idx为代表元素的序号,一共33个。UiBot有获取元素文本的功能,只有当元素处于可见状态,才能获取到元素文本值,否则返回空。
分析到这就简单了,之后便是循环判断,不成功则继续下拉一段列表。但之后经过试验,还是发现这样一次自动化流程,实在太慢,不知道怎的,可能是判断的元素在界面中存在多个,每次循环都有遍历一遍当前界面所有的下拉框,故。。。弃

4.最终解决办法:使用鼠标点击目标图像的方法,循环

aaa = 1
Do While aaa=1
try 
 #icon("@res:0n7rl7ig-btfk-7o6b-lkdr-lf6q4o14cg1f.png")
Image.Click(mb,fw,@res"0n7rl7ig-btfk-7o6b-lkdr-lf6q4o14cg1f.png",0.9,"left","dbclick",1000,{"bContinueOnError":false,"iDelayAfter":10,"iDelayBefore":10,"bSetForeground":true,"sCursorPosition":"Center","iCursorOffsetX":0,"iCursorOffsetY":0,"sKeyModifiers":[],"sSimulate":"simulate"})
try 
 #icon("@res:h3fa49m8-e0ff-89p0-n73f-57ps1rkmae8f.png")
Image.Click(mb,fw,@res"h3fa49m8-e0ff-89p0-n73f-57ps1rkmae8f.png",0.9,"left","dbclick",1000,{"bContinueOnError":false,"iDelayAfter":10,"iDelayBefore":10,"bSetForeground":true,"sCursorPosition":"Center","iCursorOffsetX":0,"iCursorOffsetY":0,"sKeyModifiers":[],"sSimulate":"simulate"})
try 
 #icon("@res:u5eit84i-2sn0-3pbm-72gt-8i0n3iuakc8b.png")
Image.Click(mb,fw,@res"u5eit84i-2sn0-3pbm-72gt-8i0n3iuakc8b.png",0.9,"left","dbclick",1000,{"bContinueOnError":false,"iDelayAfter":10,"iDelayBefore":10,"bSetForeground":true,"sCursorPosition":"Center","iCursorOffsetX":0,"iCursorOffsetY":0,"sKeyModifiers":[],"sSimulate":"simulate"})
try 
 #icon("@res:ustjl912-hi76-3sp9-vl5c-uf522b2k0h58.png")
Image.Click(mb,fw,@res"ustjl912-hi76-3sp9-vl5c-uf522b2k0h58.png",0.9,"left","click",1000,{"bContinueOnError":false,"iDelayAfter":10,"iDelayBefore":10,"bSetForeground":true,"sCursorPosition":"Center","iCursorOffsetX":0,"iCursorOffsetY":0,"sKeyModifiers":[],"sSimulate":"simulate"})
aaa=2
catch 
 Mouse.Move(1226, 717, false)
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
end try
catch 
 Mouse.Move(1075, 717, false)
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
end try
catch 
 Mouse.Move(925, 717, false)
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
end try
catch 
 Mouse.Move(775, 717, false)
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
Mouse.Click("left", "dbclick", [])
end try
 
Loop

通过截图判断,误差小,同时不会遍历所有下拉框,唯一要注意的两点就是截图判断的下拉框目标与截图范围,使用UiBot抓取是不会抓取到正确的,这块需要自己修改,这可能也是UiBot存在的一点不足。

目标:{"wnd":[{"app":"EPPortalnew","cls":"TApplication","title":"自然人税收管理系统扣缴客户端"},{"aaname":"FrmVertListControl","cls":"TFrmVertListControl","title":"FrmVertListControl"},{"cls":"TPanel"}]}
范围:{"height":1040,"width":1920,"x":0,"y":0}

你可能感兴趣的:(uibot)