按键精灵使用外部插件(xml全分辨率插件jsd插件)
大家好,我是公众号3分钟学堂的郭立员~
在处理界面上文字提取的问题,我通常会选择使用jsd插件,感觉用起来挺方便,以往在使用jsd插件的时候就是按照命令提供例子的方法直接使用,这次想自己分析一下每个命令。
jsd插件主要是对节点的处理,我也只分析和节点相关的命令,并且这篇文章不是关于怎么使用jsd插件的,仅仅是记录我在使用时遇到的一些问题,或者觉得有意思的地方。
(1)jsdvip.Findnode 查找节点
①参数:一共是4个参数
参数1:必选,字符串型,节点信息。
参数2:字符串型,可选,保存变量。
参数3:可选,数值型,节点下标,节点初始下标为0
参数4:可选,数值型,执行超时时间,单位毫秒,默认执行10毫秒。
参数2,3,4不区分顺序
②返回值
布尔值,成功返回true,失败返回null。
这里边值得分析的地方是参数2,“字符串”当做变量保存节点信息。
jsdvip.FindNode("By.text('雷电游戏中心')","node")
这个node里面到底存放了什么?后面说~
经过测试是16位的十六进制字符串,类似这样0210A5C80EC32786
这个内容是可以用GetNodeInfo命令“解析”出了
(2)jsdvip.GetNodeInfo 获取节点所有信息
jsdvip.FindNode("By.text('雷电游戏中心')","node")
dim tb=jsdvip.GetNodeInfo("node")
命令介绍例子中是遍历返回值,说明返回值是数组或者字典形式,直接转json查看。
Import "jsdvip.luae"
jsdvip.StartServer
jsdvip.FindNode("By.text('雷电游戏中心')","node")
dim tb=jsdvip.GetNodeInfo("node")
TracePrint encode.tabletojson(tb)
输出结果:
{
"1": "雷电游戏中心",
"2": [208, 202],
"3": [147, 138, 270, 267],
"clickable": true,
"checkable": false,
"checked": false,
"longClickable": true,
"point": [208, 202],
"focusable": true,
"desc": "雷电游戏中心",
"focused": false,
"res": "",
"rect": [147, 138, 270, 267],
"pkg": "com.android.launcher3",
"scrollable": false,
"selected": false,
"enabled": true,
"text": "雷电游戏中心",
"clazz": "android.widget.TextView"
}
这种json结果可以一目了然的知道所有值,以及怎么去提取它。
(3)jsdvip.FindNodeS和jsdvip.GetNodeInfoAll
这两个命令是上面两个命令的“复数”,之前的命令时获取第一个符合要求的节点信息,这两个是获取所有符合的节点信息。
Import "jsdvip.luae"
jsdvip.StartServer
jsdvip.FindNodes("By.text('下载')","node")
dim tb=jsdvip.GetNodeInfoAll("node")
TracePrint encode.tabletojson(tb)
分析方法一样看结果:
[
["下载", "下载", "下载", "下载", "下载", "下载", "下载", "下载", "下载"],
[
[821, 24],
[72, 421],
[189, 421],
[306, 421],
[423, 421],
[540, 421],
[657, 421],
[774, 421],
[891, 421]
],
[
[809, 17, 833, 31],
[48, 412, 96, 430],
[165, 412, 213, 430],
[282, 412, 330, 430],
[399, 412, 447, 430],
[516, 412, 564, 430],
[633, 412, 681, 430],
[750, 412, 798, 430],
[867, 412, 915, 430]
]
]
输出结果是3维数组,并且只有3组数据,分别是文字、中心坐标,范围坐标。
(4)jsdvip.ForeachNodes 遍历结果集
上面说node这个变量是什么时,并没有说它怎么来的,因为我是通过这个命令获取到的,下面是遍历所有节点信息,用复数形式nodes,这个没有强制要求就是为了区分一下。
Import "jsdvip.luae"
jsdvip.StartServer
jsdvip.FindNodes("By.text('下载')","nodes")
dim tb=jsdvip.ForeachNodes("nodes")
TracePrint encode.TableToJson(tb)
输出结果:
[
"C803A1C0055D7B72",
"BA0C238A50E33351",
"74B09CB1843640E8",
"EAA551527BFF7063",
"7FDA3526F94EE9C6",
"1F8C860CEAF77FFC",
"70C2C94E400DD268",
"BD01F5BC2D773B9E",
"630A8CAA81642DA1"
]
看输出结果,猜测每一个字符串应该是一个节点信息,为了验证猜测是否正确,直接把字符串当做node使用。
Import "jsdvip.luae"
jsdvip.StartServer
dim tb=jsdvip.GetNodeInfo("C803A1C0055D7B72")
TracePrint encode.TableToJson(tb)
输出结果:
{
"1": "下载",
"2": [821, 24],
"3": [809, 17, 833, 31],
"longClickable": false,
"text": "下载",
"focused": false,
"clickable": false,
"enabled": true,
"checked": false,
"selected": false,
"clazz": "android.widget.TextView",
"checkable": false,
"rect": [809, 17, 833, 31],
"res": "com.android.flysilkworm:id\/title_view",
"point": [821, 24],
"pkg": "com.android.flysilkworm",
"scrollable": false,
"focusable": false,
"desc": ""
}
这个结果和findnode获取的node是一样的,所以猜测node是这个16位的十六进制字符串。
除了上面说的这些命令以外,比较有意思的还有父级节点、同级节点、子级节点。
举个例子:根据QQ群消息获取用户名称
Import "jsdvip.luae"
jsdvip.StartServer
jsdvip.FindLv "By.text('len命令')", 2, "node"
jsdvip.FindChlid("node","By.res('com.tencent.mobileqq:id/chat_item_nick_name')","chlid")
TracePrint jsdvip.GetText("chlid")
输出结果:
当前脚本第5行:郭立员
每一个层级关系在获取后都用我上面说的方法先输出节点信息,确认没问题了,在继续层级关系处理。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com