【3分钟学堂】jsd不是插件的处理方法及分析

大家好,我是公众号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

图片[1]-【3分钟学堂】jsd不是插件的处理方法及分析-老王博客

这两个命令是上述两个命令的“复数”。上一条命令获取第一个满足要求的节点信息,这两条是获取所有满足要求的节点信息。

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行:郭立员

得到每个层级关系后,使用我上面提到的方法,先输出节点信息,确认没有问题,继续层级关系处理。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论