按钮找不到时的两种点法
它解决什么问题
有些按钮在界面里读不到控件信息 —— 自绘按钮、WebView 里的元素、游戏界面、Flutter/Unity 画出来的东西。这类地方「按控件找」行不通,只能按「屏幕上长什么样」找。
触控魔方本来就不读控件 id,它只有两种定位方式:按文字找、按图标找。这条配方讲清楚什么时候用哪个。
先说清楚一件容易误会的事
应用里没有「元素 id」这个概念。所有定位最终都落在屏幕坐标上:
- 按文字找 → 得到文字所在的坐标
- 按图标找 → 得到图标所在的坐标
所以「按钮找不到」的正确问法是:这个按钮上有可读的文字吗? 有就按文字,没有就按图标。
做法 A:按钮上有文字 —— 用「查找文本节点」
加「查找文本节点」,关键参数:
| 参数 | 填什么 |
|---|---|
查找区域 searchRegion |
默认全屏;确定在底部就框底部,能少认错 |
白名单 whiteList |
想找的文字,比如「下一步」「确认」 |
黑名单 blackList |
明确不要的文字,比如列表里同名的其他项 |
它的价值在于改版不怕:按钮挪到屏幕另一边照样能找到。
但注意:文字一样的不同按钮它分不清。列表里三个「编辑」按钮,它就不知道你要哪个 —— 这时候用区域限定,或者用做法 B。
做法 B:按钮是图标/图片 —— 用「图像匹配检测节点」
先在目标应用里截一张按钮的图,存到手机里。然后加「图像匹配检测节点」:
| 参数 | 填什么 | 说明 |
|---|---|---|
模板图 selectedTemplatePaths |
你截的那张按钮小图 | 只要按钮本身,别把周围背景一起截进去 |
相似度 similarityThreshold |
0.85 |
低了乱认,高了认不出;先 0.85,不行再微调 |
最多匹配数 maxMatches |
1 |
只想点一个就设 1 |
方法 method |
默认即可 | 界面没变形就用默认 |
坐标系方向 coordinateNameDirection |
按屏幕方向选 | 横屏任务要改 |
模板图的两个硬要求:
- 只截按钮本身。 带上周围背景,换个页面就匹配不上。
- 同一个分辨率截。 换机型后模板图要重截。
接点击
两种做法的输出都是坐标(或坐标列表),接到「点击节点」的 x、y,或者接到「点击列表节点」的 positions。
只有一条要注意:先确认找到了再点。 两个节点都有成功/失败输出口,把「失败」那条接去别的分支,别让没找到的坐标直接喂给点击 —— 不然它会点在 (0,0),即屏幕左上角,而且日志还写「点击成功」。
什么时候两个都不合适
- 按钮位置固定、样式固定 → 直接「记一步」录坐标最快,别绕这一圈。
- 界面是视频/动画 → 图像匹配会持续失败,只能靠固定坐标。
- 加密/混淆的界面 → 只能按坐标,且要接受改版就要重录。
用到的节点
| 节点 | 干什么 |
|---|---|
| 查找文本节点 | 按文字定位,改版后照样找得到 |
| 图像匹配检测节点 | 按图标/图片定位,适合无文字的按钮 |
| 点击节点 | 用得到的坐标点下去 |
| 点击列表节点 | 有多个匹配时逐个点 |
| 条件判断节点 | 判断「找到了没有」再决定下一步 |
容易踩的坑
- 相似度 0.85 不是万能的。 半透明遮罩、深色模式、系统字号变化都会拉低相似度。改了主题要重截模板图。
- 匹配失败时坐标是空的。 直接接点击会点到左上角,且不报错。
- 模板图别截太大。 截一整块区域去匹配,命中率反而低,还慢。
- 同一段文字在不同页面含义不同。 白名单只管文字内容,不管在哪 —— 用查找区域限定范围。