close

大家好,我是郭立員~

在處理界面上文字提取的問題,我通常會選擇使用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('有需要聯眾圖像識別的嗎?')", 2, "node"jsdvip.FindChlid("node","By.res('com.tencent.mobileqq:id/chat_item_nick_name')","chlid")TracePrintjsdvip.GetText("chlid")

輸出結果:

當前腳本第5行:聯眾客服丫丫找我6.5折

每一個層級關係在獲取後都用我上面說的方法先輸出節點信息,確認沒問題了,在繼續層級關係處理。

=正文完=
我個人微信


----------------------------------
推薦:
進入公眾號主頁,回復「jsd」即可獲得jsd插件。
推薦QQ交流群11群:936858410
更多內容進入公眾號查看。


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()