前言
最近接了个单子,刚好就遇到了这个问题,也是第一次遇到这种问题,上百度都没有找出个所以然来,所以就去问chatgpt了。
当然,chatgpt也没有给出能直接运行的代码,但是他给我指明了研究的方向:窗口过滤。
于是,没有学过java的我去查找相关资料,然后就修改整理出了解决办法~
问题描述
这是软件的主界面,系统会自动推送单子,以弹出窗口的方式显示抢单的界面
这是弹出的抢单窗口界面,你会发现点击布局后显示的依然是主界面
其实对于控件的采集是很好解决的,在布局生成后可以点击 窗口选择
然后选择下面的弹出式窗口即可
此时就可以获取到控件的识别元素了
但是,问题来了,比如上方的时间控件id是tv_time
在脚本运行的时候无论是使用
id("tv_time").exists()
或者是
id("tv_time").findOne(1000)
返回的都是false
这就是本文要解决的问题,原因就是窗口没有通过过滤器。
解决
设置窗口过滤器。
下面代码是一段将窗口过滤器设置为一个恒定返回 true 的函数,表示所有窗口都符合过滤条件,可以被操作。
auto.setWindowFilter(function (window) {
return true;
});
上面的代码只需要调用一次,就可以解决多窗口下控件无法找到的问题。
但是如果,因为所有窗口都被过滤,而导致识别速度变慢了。
那可以通过添加条件只过滤我们需要的窗口,下面是以窗口名过滤窗口的例子:
这软件运行起来主要就只需要2个窗口:弹窗界面(抢单界面)、等待接驾界面(抢单成功界面),那么就只需要获取下窗口的title值即可,title值可以通过 窗口选择 查看
第一个参数就是title值,获取到两个窗口的title值分别为 “弹出式窗口” “等待接驾”
那么代码就修改如下:
auto.setWindowFilter(function (window) {
return ["等待接驾", "弹出式窗口"].indexOf(window.getTitle()) != -1;
});
这样就可以只过滤我们需要的窗口了。
如果有更多的窗口需要过滤,可以直接在数组里面添加成员即可。