AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

选择器 (UiSelector) 作为变量 长时间运行是不是有问题?

Open photkey opened this issue 2 years ago • 7 comments

由于脚本很多地方都要用到同一个UiSelector,所以就把他作为一个变量,脚本运行时间稍微长一点 就会出现找不到的情况,但是如果使用的不是变量 直接写UiSelector的话,就没有这个问题,这个是什么情况?

photkey avatar Jul 31 '23 22:07 photkey

首先确保保存的本地变量类型是 UiSelector (而不是 UiObject 或 UiObjectCollection 等).

如果确实是 UiSelector, 请提供一下 UiSelector 变量的表达式.

SuperMonster003 avatar Aug 02 '23 08:08 SuperMonster003

const us = className("android.view.ViewGroup").clickable(true).indexInParent(0)

photkey avatar Aug 03 '23 06:08 photkey

再举个例子,下面两个函数的区别,就只是一个UiSelector是变量,一个不是,运行结果就不一样,没有变量的能找到控件,有变量的就找不到控件,是我的写法有问题么?

// 找不到控件
function copyList(numList){
    numList = numList || [6,7,8,9,10];
    const list_selector = visibleToUser().className("android.view.ViewGroup").clickable(true).boundsInside(0, 0.3, -1, -1);
    for(let i=0;i<numList.length;i++){
        let o = list_selector.childCount(numList[i]).findOnce()
        if(o){return {o,num:numList[i]};}
    }
    return null;
}

//能找到控件
function copyList(numList){
    numList = numList || [6,7,8,9,10];
    for(let i=0;i<numList.length;i++){
        let o = visibleToUser().className("android.view.ViewGroup").clickable(true).boundsInside(0, 0.3, -1, -1).childCount(numList[i]).findOnce()
        if(o){return {o,num:numList[i]};}
    }
    return null;
}

photkey avatar Aug 05 '23 05:08 photkey

错在list_selector变量那里,for循环里面的list_xxx.childCount(i),会拼接成

list_xxx.childCount(0).childCount(1).childCount(2).findOnce()

而不是 list_xxx.childCount(0).findOnce() list_xxx.childCount(1).findOnce() list_xxx.childCount(2).findOnce()

sucutey avatar Aug 29 '23 11:08 sucutey

const t =text("text").id("id")
for(let i =0;i<3;i++){  
 let o =t.childCount(i);
 log(o);
    }
//猜猜o打印的是啥😹

sucutey avatar Aug 29 '23 11:08 sucutey

for(let i =0;i<3;i++){  
 let o =text("text").id("id").childCount(i);
 log(o);
    }
//再猜猜o打印的是什么😳

sucutey avatar Aug 29 '23 11:08 sucutey

没错, 正如 @sucutey 所述, selector 在进行链式调用时, 是会拼接的.

let sel = text('a').desc('b');
sel.className('c');
console.log(sel); // text("a").desc("b").className("android.widget.c")

SuperMonster003 avatar Nov 03 '23 07:11 SuperMonster003