AutoJs6
AutoJs6 copied to clipboard
找不到控件
App:慢慢买 com.manmanbuy.bijia 4.3.60 上传到网盘了:https://pan.huang1111.cn/s/eXqZug
问题:停止App,在启动App之前先运行下面脚本,然后再启动,过了一段时间会超时提示没有找到(使用findUiCollection的①或②),重试使用findUiCollection的③提示找到了。在App页面直接使用findUiCollection的①、②、③都提示找到了
没有发现其他App有这种情况。昨天使用autojs pro8运行①可以找到,不过今天autojs pro用不了转用autojs6才发现这个问题
功能:点击慢慢买主页右上角的签到按钮
if (1) {
var r = className('android.view.ViewGroup').indexInParent(0).depth(29).drawingOrder(1).childCount(1);
// 超时时间10秒
r = findUiCollection(r,10000);
if (r == null || r.size() < 1) {
toast("没有找到");
} else {
toast("找到了");
clickUiObjectCenter(r[1]);
}
}
function findUiCollection(pUs, pTimeOut) {
let tUc = null;
/* // ① 找不到控件
var r = pUs.findOne(pTimeOut);
if (r) {
tUc = pUs.find();
}
*/
/* // ② 猜测:可能是页面变动,autojs6没有获取到新的布局,尝试循环使用findOne。结果:找不到控件
var start = SystemClock.uptimeMillis();
while (true) {
if (SystemClock.uptimeMillis() - start > pTimeOut) {
break;
}
var r = pUs.findOne(100);
if (r) {
tUc = pUs.find();
break;
}
}
*/
// ③ 尝试:不断创建悬浮窗让autojs6察觉到页面变动。结果:可以找到
var start = SystemClock.uptimeMillis();
while (true) {
if (SystemClock.uptimeMillis() - start > pTimeOut) {
break;
}
// ########
var w = floaty.rawWindow(
<frame bg="#64ff0000"
/>
);
w.setSize(200, 200);
w.setTouchable(false);
var r = pUs.findOne(100);
// close放在findOne后,不然也会找不到
w.close();
// ########
if (r) {
tUc = pUs.find();
break;
}
}
return tUc;
}
function clickUiObjectCenter(pUb) {
var x = pUb.bounds().centerX();
var y = pUb.bounds().centerY();
click(x, y);
}
1是找控件10秒和2/3是等待10秒后找,超过10秒什么也找不到了,既用超时又不用循环,还想随时找控件? 不用循环的话,还不如直接在方法里面 return pUs.findOne().find()
我特意下载并安装了上述应用, 使用方案 1 测试后, 可以找到指定控件.
你可以确定一下无障碍服务是正常运行的, 且相关功能函数也能正常执行, 如 click(100, 100) 等.
另外点击签到按钮, 可以结合 wait 和 clickBounds 方法进行代码简化. 一个简单的改写示例:
wait(/签到领积分|连续签到\d+天/, {
then(w) {
toast('查找成功');
w.clickBounds();
},
else() {
toast('查找超时');
},
});