使用 JavaScript 控制台記錄進行偵錯

本文說明查看 JavaScript 控制台記錄的不同方法,以便在 WebView 中偵錯內容。

存取 JavaScript 控制台,即可查看 JavaScript console.log() 陳述式中的錯誤、警告和自訂訊息,診斷 WebView 內發生的情況。您可以透過三種方式查看 WebView 產生的 JavaScript 控制台訊息:

  • Chrome 開發人員工具將 WebView 連線至 Chrome 開發人員工具。開啟「控制台」分頁,即可查看 WebView JavaScript 控制台訊息。

  • WebView 開發人員工具應用程式:使用 WebView 開發人員工具應用程式在裝置上啟用 webview-log-js-console-messages 標記,即可在 Logcat 中查看控制台記錄

  • 訊息攔截:在 WebChromeClient 中實作 onConsoleMessage(),即可攔截 JavaScript 控制台訊息。下節將詳細說明這個方法。

如果您是從開發機上的本機網頁伺服器提供內容,請參閱「從 WebView 存取本機開發伺服器」,瞭解如何從裝置或模擬器連線至該伺服器。

攔截來自「onConsoleMessage()」的訊息

偵錯 WebView 時,系統支援控制台 API。您必須提供實作 onConsoleMessage() 方法的 WebChromeClient,才能在 Logcat 中顯示控制台訊息。然後將 WebChromeClient 套用至 WebView,方法是使用 setWebChromeClient()

WebChromeClientWebView 的輔助類別。處理網頁內容中發生的 UI 相關事件,例如顯示 JavaScript 警告、變更網頁標題,以及處理傳送至瀏覽器控制台的訊息。

下列程式碼會設定 WebChromeClient,攔截 JavaScript 控制台輸出內容,並將其重新導向至 Logcat,方便進行偵錯。

Kotlin

val myWebView: WebView = findViewById(R.id.my_webview)
myWebView.webChromeClient = object : WebChromeClient() {
    // Override onConsoleMessage to intercept JavaScript console messages
    override fun onConsoleMessage(message: ConsoleMessage): Boolean {
        // Log JavaScript console messages to Logcat
        Log.d("WebViewConsole", "${message.message()} -- From line ${message.lineNumber()} of ${message.sourceId()}")
        // Return true to indicate that the message has been handled
        return true
    }
}

Java

WebView myWebView = findViewById(R.id.webview);
myWebView.setWebChromeClient(new WebChromeClient() {
    // Override onConsoleMessage to intercept JavaScript console messages
    @Override
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        // Log JavaScript console messages to Logcat
        Log.d("MyApplication", consoleMessage.message() + " -- From line " +
        consoleMessage.lineNumber() + " of " + consoleMessage.sourceId());
        // Return true to indicate that the message has been handled
        return true;
    }
});

使用 onConsoleMessage() 後,自訂記錄邏輯會成為 JavaScript 錯誤的主要處理常式,取代 webview-log-js-console-messages 標記的預設行為,並讓您隨意設定記錄格式。

ConsoleMessage 也包含 MessageLevel 物件,用於指出傳送的控制台訊息類型。您可以使用 messageLevel() 查詢郵件層級,判斷郵件的嚴重程度,然後使用適當的 Log 方法或採取其他適當行動。

在網頁中執行控制台方法時,Android 會呼叫 onConsoleMessage(ConsoleMessage) 方法,方便您回報錯誤。舉例來說,使用範例程式碼時,系統會列印類似下列內容的 Logcat 訊息:

Hello World -- From line 82 of http://www.example.com/hello.html