AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

找不到控件

Open mhsjzsq opened this issue 2 years ago • 2 comments

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);
    
}

mhsjzsq avatar Nov 28 '23 02:11 mhsjzsq

1是找控件10秒和2/3是等待10秒后找,超过10秒什么也找不到了,既用超时又不用循环,还想随时找控件? 不用循环的话,还不如直接在方法里面 return pUs.findOne().find()

sucutey avatar Dec 04 '23 01:12 sucutey

我特意下载并安装了上述应用, 使用方案 1 测试后, 可以找到指定控件.

你可以确定一下无障碍服务是正常运行的, 且相关功能函数也能正常执行, 如 click(100, 100) 等.

另外点击签到按钮, 可以结合 waitclickBounds 方法进行代码简化. 一个简单的改写示例:

wait(/签到领积分|连续签到\d+天/, {
    then(w) {
        toast('查找成功');
        w.clickBounds();
    },
    else() {
        toast('查找超时');
    },
});

SuperMonster003 avatar Apr 04 '24 11:04 SuperMonster003