查找控件
昨天有人提到说查找控件的函数有点少,希望跟 Auto.js 似的加上什么点击子控件、父控件之类的。
说实话在市场调研初期,我试用了好几款免 ROOT 的软件,都不怎么满意。
不可否认的是,Auto.js 把能想到的和控件相关的可能性列得特别全,也算是无障碍权限免 ROOT 自动化脚本工具的代表产品。
可是我真的没弄明白它为什么要把函数拆的那么分散,如果你没用过 Auto.js,可以去它的官方文档看看。
我最近几年有个习惯就是,先得我这个零基础的人学的会,我才有信心能让开发者学的会,毕竟大部分人不是科班出身。
Auto.js 光控件就有几十个函数真的很让我头疼,况且我还得把它变成可视化的函数?
我的目标不说做个比其他产品功能强大的,起码要做到简单、上手容易,而且最好要沿用触动函数的开发习惯,毕竟我也只会写触动脚本。
换个开发方式我自己都适应不了。
后来和开发、测试同事讨论了下,也参考了触动函数的开发经验,最后我们决定使用 table 作为参数格式,也就有了 widget.find 函数。
![]()
常用的参数,想用几个就用几个,配合 rule 参数,差不多也就够用了。
控件不能点击怎么办
在测试过程中,我发现能找到特征的无非就是 text 文本和 desc 描述,id 大多数情况下都是空,即使有,也不能保证唯一。
但是问题又出现了,有 text 的控件吧,经常 clickable 参数都是 false。
简直让人崩溃有木有,文字不能点击,但是文字外面的父控件可以点击。
我又跟开发同事讨论了下,能不能在找到控件的时候返回下这个控件的区域坐标?
这样就可以根据坐标计算控件的中心点了,有了坐标不就能够点击了吗!
于是又多了一个函数叫 widget.region.
![]()
点击不生效怎么办
测试过程中我还发现,怎么明明开着无障碍权限,有时候就是不点击呢?
后来发现,无障碍权限的状态它有可能是假的!
明明开关开着,但其实是没有获取到权限的。
是不是很崩溃?
然后我们利用获得无障碍权限就可以自动打开程序这个特性,当你打开无障碍权限开关,看到自动跳转到了积木编程界面,那么恭喜你,真的成功获得了权限。
如果没有,那就关闭再重新打开下咯。
总结
![]()
在 IDE 里获取 text 或者 desc 特征的时候先看看到底能不能点击,如果可以那就简单了:
|
1 2 3 4 5 6 |
local lingqu = widget.find({["text"]="去领取",["type"]="Button"}) if lingqu ~= nil then toast("签到") widget.click(lingqu) mSleep(3000) end |
如果不能点击,就稍微复杂一点点:
|
1 2 3 4 5 6 7 8 9 10 11 |
local baba = widget.find({["text"]="农场",["path"]="/FrameLayout/LinearLayout/FrameLayout/LinearLayout/FrameLayout/FrameLayout/FrameLayout/RelativeLayout/LinearLayout/RecyclerView/FrameLayout/FrameLayout/RecyclerView/FrameLayout/TextView"}) if baba ~= nil then x1,y1,x2,y2 = widget.region(baba) if x1 ~= -1 then x = (x1+x2)/2 y = (y1+y2)/2 toast("打开农场,请手动点击【集肥料】按钮") event.tap(x,y) mSleep(3000) end end |
画了个简单的流程图
![]()