给公司的微信小程序写自动化检测代码,业务逻辑蛮简单,就是由于微信反脚本检测很到位,实现一些功能时要绕绕弯子。比如微信搜索框输入文本。
之前的微信,在主页面,搜索按键(就是一个放大镜图标那个)desc为“搜索”。通过desc获取控件,再点击这个控件,就会进入搜素模式。再用setText(),就可以输入文本。
现在的微信,搜索按键的desc为空,且其他属性也不稳定,于是用坐标点击。
代码如下
微信搜索(p1){
打开微信主界面()
setClip(p1);
click(600/720*device.width,100/1612*device.height)
sleep(800);
let x = 400/720*device.width
let y = 100/1612*device.height
swipe(x,y,x,y,600)
sleep(800);
点击区域内文本(0,device.height*0.5,device.width,device.height*0.5,p1)
},
打开微信主界面(){
launchApp("微信")
let nvt = id("nvt").findOne(2000)
while(nvt===null){
back()
sleep(800)
nvt = id("nvt").findOne(2000)
}
while(!nvt.click());
},
点击区域内文本(p1,p2,p3,p4,p5){
let img = captureScreen0()
let img2 = images.clip(img,p1,p2,p3,p4)
let ocr = $ocr.create()
let result = ocr.detect(img2)
img.recycle()
img2.recycle()
ocr.release()
//log(result)
for(let i=0;i<result.length;i++){
if(result[i].text===p5){
let b = result[i].bounds
let x = (b.left+b.right)/2 + p1
let y = (b.top+b.bottom)/2 + p2
log("点击区域内文本x,y完全匹配",x,y)
click(x,y)
sleep(1000)
return
}
}
for(let i=0;i<result.length;i++){
if(result[i].text.indexOf(p5)!=-1){
let b = result[i].bounds
let x = (b.left+b.right)/2 + p1
let y = (b.top+b.bottom)/2 + p2
log("点击区域内文本x,y部分匹配",x,y)
click(x,y)
sleep(1000)
return
}
}
throw "区域内未找到"+p5
},
captureScreen0(){
let img
try{
ui.run(()=>{this.setMenuVisible(0);console.hide();})
sleep(500)
return automator.takeScreenshot()
}
catch(err){
log(err)
}
finally{
ui.run(()=>{this.setMenuVisible(1)})
}
},
点击进入搜索模式后,用setClip()设置粘贴板内容。
下一步,就是长按搜索框。试了下longClick(x,y),无效,想到用swipe(x,y,x,y,time),注意swipe方法执行效果是,在时间time内,从(x1,y1)滑动到(x2,y2),这里x1=x2,y1=y2,就相当于长按。我取的time是600ms,各位小可爱可以自己修改。
长按搜索框后,界面会出现“粘贴 剪切板”tip小窗,我尝试用ocr识别出“粘贴”再点击,很遗憾点到了旁边的位置,行不通,于是继续思考。
长按搜索框后,键盘上方浮现了粘贴板内的内容。于是屏幕截图,用clip方法剪下下半部分,再用ocr识别文本。点击文本坐标,于是输入搜索框就完成了。