大家好,我是公众号3分钟学校的郭丽媛~
在处理界面上的文本提取问题时,我一般会选择使用jsd插件,使用起来非常方便。以前在使用jsd插件的时候,我是直接按照命令提供的方法使用的。这次我想自己分析每个命令。
jsd插件主要是处理节点的,我只分析了节点相关的命令按键精灵如何按时间调用子程序,而本文不是关于如何使用jsd插件,只是记录一下我在使用过程中遇到的一些问题,或者我发现有趣的东西。
(1)jsdvip.FindNode 找到一个节点
①参数:共有4个参数
参数1:必选,字符串型,节点信息。
参数2:字符串型,可选,保存变量。
参数3:可选,数值型,节点下标,节点初始下标为0
参数4:可选,数值型,执行超时时间,单位毫秒,默认执行10毫秒。
参数2,3,4不区分顺序
②返回值
布尔值,成功返回true,失败返回null。
这里值得分析的地方是参数2,“string”作为变量保存节点信息。
jsdvip.FindNode("By.text('雷电游戏中心')","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 遍历结果集
当我说变量节点是什么的时候按键精灵如何按时间调用子程序,我并没有说它是怎么来的,因为我是通过这个命令得到的。下面是遍历所有节点信息,使用节点的复数形式。这不是强制性的,只是为了区分它。
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"
]
查看输出结果,猜测每个字符串应该是一个节点信息。为了验证猜测是否正确,直接使用字符串作为节点。
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位的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行:郭立员
得到每个层级关系后,使用我上面提到的方法,先输出节点信息,确认没有问题,继续层级关系处理。
请登录后发表评论
注册
社交帐号登录