跳到主要内容

zm.ElementFindTap 超级查找元素点击

🎯功能

zm.ElementFind 超级查找元素相比, 仅多了一个找到后立即点击的功能, 其它都相同, 点击会受zm.SetTap 设置超级点击设置影响.

根据条件查找元素节点并点击, 返回元素节点表信息与中心坐标等数据. 比 Element.Find() 更加强大, 具体特色如下

  • 找到后内部会调用zm.SetTap 设置超级点击点击找到的坐标
  • 除了返回抓抓上显示的元素特征信息外, 还有中心坐标, index等数据
  • 支持指定范围查找, 再也不用担心找到范围外的元素节点了, 甚至直接获取指定范围内的节点
  • 支持指定坐标查找, 直接获取该坐标点的元素节点, 不用再考虑特征串之类的了
  • 支持抓抓上的五大元素特征串, 分别是 text, resource-id, class, package, content-desc, 这5个元素特征串可自由填写任意数量, 且没有顺序要求, 每个特征串之间为 And 关系
  • 除了支持普通的完整匹配外, 还支持正则匹配模式, 让元素特征串更加灵活
  • 默认仅获取最终子节点, 避免干扰, 但你也可以改为获取任意一个符合条件的节点
  • 担心查找的时候节点还没出现? 限时循环查找完美解决这个问题
  • 大量可选参数, 减少不必要的代码量
  • 支持对象参数写法, 将所有参数保存到一张表里, 直接传入该表, 方便优化代码结构

📜语法

结果 = zm.ElementFindTap([对象, ...][x1,y1,x2,y2,][元素特征, ...][指定坐标x,指定坐标y,][是否最终元素,][匹配模式][,超时时间])

📥参数

参数数据类型解释
对象可选, 对象是指把查找一个元素用到的参数全部放到数组中, 然后用该数组做对象参数. 若要填写对象参数, 则必须写在最前面, 填写后将忽略除超时参数以外的其他普通参数. 支持多个对象参数, 每个对象为 OR 关系, 找到任何一个对象立即返回结果
x1数值型可选, 查找范围左上角x, 元素节点必须完全在范围内, 不能超出范围, 省略默认为0, 范围0,0,0,0表示全屏
y1数值型可选, 查找范围左上角y, 元素节点必须完全在范围内, 不能超出范围, 省略默认为0, 范围0,0,0,0表示全屏
x2数值型可选, 查找范围右下角x, 元素节点必须完全在范围内, 不能超出范围, 省略默认为0, 范围0,0,0,0表示全屏
y2数值型可选, 查找范围右下角y, 元素节点必须完全在范围内, 不能超出范围, 省略默认为0, 范围0,0,0,0表示全屏
元素特征字符串可选, 抓抓上获取到的元素特征值, 支持 text, resource-id, class, package, content-desc这5个对应特征值, 可自由填写0到5个元素特征参数, 无顺序要求, 同个对象每个特征之间为 AND 关系, 内部忽略特征名, 只判断特征值, 详见例子
指定坐标x数值型可选, 直接获取指定坐标上的元素特征串, 省略默认为0, 指定坐标0,0表示不使用本参数
指定坐标y数值型可选, 直接获取指定坐标上的元素特征串, 省略默认为0, 指定坐标0,0表示不使用本参数
是否最终元素布尔型可选, 是否只获取没有子节点的最终元素节点, 省略默认为true, 表示只获取没有子节点的最终元素元素
匹配模式数值型可选, 元素特征的匹配模式, -1表示直接比较是否相等的完整匹配模式, -2表示正则匹配是否符合的正则模式, 省略默认为-1
超时时间数值型可选, 最大查找时间, 如果每个对象内都有超时时间的话, 将仅使用最大的时间做判断

📤返回

, 找到返回元素特征表, 没找到返回 null, 元素特征表格式为 {"x":0,"y":0,"id":0,"xy":[0,0]"index":0,"text":"","resource-id":"","class":"","package":"","content-desc":"","checkable":true,"checked":true,"clickable":true,"enabled":true,"focusable":true,"focused":true,"scrollable":true,"long-clickable":true,"password":true,"selected":true,"bounds":[0,0,0,0],"left":0,"top":0,"right":0,"bottom":0,"pos":[0,0]} , 其中 "x", "y" 代表找到元素节点的中心位置坐标, 可用于tap点击, "id" 代表多个对象情况下找到的那个序号

💡示例

Import "zm.luae" //导入插件,只需执行一次
zm.Init //初始化插件,只需执行一次

//本命令与zm.ElementFind()类似, 仅多了一个找到后立即点击功能, 故详细例子请去查看zm.ElementFind()命令

//下面演示打开京东搜索电脑, 获取第一件商品价格的例子
RunApp "com.jingdong.app.mall"

If zm.ElementFindTap("^搜索框.*", "com.jingdong.app.mall", "android.widget.TextView", -2, 5000) Then
TracePrint "找到搜索框, 并已点击"
Else
TracePrint "没找到搜索框"
End If

Delay 1000
InputText "电脑"
Delay 1000
If zm.ElementFindTap("搜索", "android.widget.TextView", "com.jingdong.app.mall") Then
TracePrint "找到搜索按钮, 并已点击"
Else
TracePrint "没找到搜索按钮"
End If

Dim 价格对象 = {"%d+", "%d+元", "android.widget.TextView","com.jingdong.app.mall", -2, 10000}
Dim 价格元素 = zm.ElementFind(价格对象)
If 价格元素 Then
TracePrint "找到第一件商品的价格为:", 价格元素["text"]
Else
TracePrint "没找到商品"
End If

📘备注

  • 关于参数填写顺序说明
    • 本插件所有参数都是可选的, 绝大多数参数对顺序没有要求, 但以下3个参数有顺序要求
    • ( 查找范围, 指定坐标, 超时时间 )
    • 这3个参数均为可选参数, 中间也可以填写其他参数, 但是前后关系不能打乱, 下面举几个例子
    • 正确例子: ( 查找范围, 超时时间), (指定坐标, 元素特征, 超时时间), (查找范围, 元素特征)
    • 错误例子: (超时时间, 查找范围), (查找范围, 超时时间, 指定坐标), (指定坐标, 元素特征, 查找范围)
    • 如果无法理解的话, 建议按照语法说明的参数顺序填写
  • 关于对象参数
    • 对象参数必须从第1个位置开始填写, 并且填写后除了超时时间外的其他普通参数全都忽略
    • 多个对象为 OR 关系, 内部依次循环查找每一个对象, 任何一个被找到则立即返回
    • 当存在多个超时时间时, 仅最大的时间会生效, 限时内会不断查找每一个对象
  • 关于元素特征串
    • 支持抓抓上的text, resource-id, class, package, content-desc
    • 填写数量自定义, 你可以只写1个, 也可以写3个, 甚至都不写或者全都写.
    • 查找时忽略特征名, 只找特征值, 例如你填写了 "微信", 那么有可能找到 text微信 的元素, 或者 content-desc微信 的元素.
    • 查找时要求填写的特征全都要找到才算符合条件, 包括填写空字符串 "", 也会要求找到对应空字符串
    • 两个特征值一样的也会查找, 例如你填写了 "微信", "微信", 那么查找的时候就会去找元素特征里存在两个 微信 的元素
  • 关于最终元素
    • 最终元素是指没有子节点的元素, 也就是抓抓里看到前面没有 +- 的元素
  • 关于旋转横屏坐标处理
  • 需按键精灵V3.5.8以上版本支持本命令
  • V4.2111: 初次加入