《SeleniumBasic 3.141.0.0 - 在VBA中操作瀏覽器》高級技術之十:利用ExecuteScript解析JSON


JavaScript中的JSON,指的是數組和字典形式的字符串。JSON解析是把字符串轉換為對象,或者把對象轉換為字符串的過程。

其中JavaScript的parse函數用於把字符串轉換為對象,stringify則可以把對象輸出為格式良好的字符串。

下面以處理瀏覽器的信息為例講解。

IWebDriver對象的Capabilities返回一個JSON對象,如果要從中得到某個屬性值,需要借助ExecuteScript執行腳本。

在VBA執行如下代碼:

WD.New_ChromeDriver Service:=Service, Options:=Options
WD.URL = "https://www.baidu.com"
Debug.Print WD.Capabilities.ToString

立即窗口中打印出如下互相嵌套的字符串:

{
  "acceptInsecureCerts": false,
  "browserName": "chrome",
  "browserVersion": "85.0.4183.121",
  "chrome": {
    "chromedriverVersion": "85.0.4183.87 (cd6713ebf92fa1cacc0f1a598df280093af0c5d7-refs/branch-heads/4183@{#1689})",
    "userDataDir": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\scoped_dir8752_2084918897"
  },
  "goog:chromeOptions": {
    "debuggerAddress": "localhost:59968"
  },
  "networkConnectionEnabled": false,
  "pageLoadStrategy": "normal",
  "platformName": "windows",
  "proxy": {},
  "setWindowRect": true,
  "strictFileInteractability": false,
  "timeouts": {
    "implicit": 0,
    "pageLoad": 300000,
    "script": 30000
  },
  "unhandledPromptBehavior": "dismiss and notify",
  "webauthn:virtualAuthenticators": true
}

這些信息中,有的信息只有一層,例如browserVersion,可以直接讀出對應的值。

有一些信息,還有下一層花括號包含。例如userDataDir,它的JPath是:chrome.userDataDir,也就是說,需要先得到外層的chrome。

Dim beautiful As String

beautiful = WD.ExecuteScript("var J=JSON.parse(arguments[0]);return J.browserVersion", WD.Capabilities.ToString)
Debug.Print beautiful

beautiful = WD.ExecuteScript("var J=JSON.parse(arguments[0]);return J.chrome.userDataDir", WD.Capabilities.ToString)
Debug.Print beautiful

上述程序中J是一個JavaScript中的內部變量,通過parse函數把Capabilities字符串轉換為JSON對象。打印結果分別為:

85.0.4183.121
C:\Users\ADMINI~1\AppData\Local\Temp\scoped_dir8752_2084918897

接下來體會一下stringify的魅力。該函數可以把JSON對象按指定的縮進量進行輸出,下面的程序設置8個空格的縮進。

beautiful = WD.ExecuteScript("var J=JSON.parse(arguments[0]);return JSON.stringify(J,null,8)", WD.Capabilities.ToString)
Debug.Print beautiful

可以看到上下級節點的縮進空白很寬。

SeleniumBasic中的ICapabilities是一個特殊的JSON,它具有GetCapability和Item方法,可以返回指定名稱的JSON對象。這樣就不需要使用parse函數就能處理。

beautiful = WD.ExecuteScript("return arguments[0].pageLoad", WD.Capabilities.GetCapability("timeouts"))
Debug.Print beautiful

上述程序的結果是30000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM