使用 JavaScript 控制台日志进行调试

本文档介绍了查看 JavaScript 控制台日志以调试 WebView 内的内容的不同方法。

通过访问 JavaScript 控制台,您可以查看 JavaScript console.log() 语句中的错误、警告和自定义消息,从而诊断 WebView 中发生的情况。您可以通过以下三种不同的方式查看 WebView 生成的 JavaScript 控制台消息:

  • Chrome DevTools将 WebView 连接到 Chrome DevTools。打开控制台标签页,查看 WebView JavaScript 控制台消息。

  • WebView 开发者工具应用:使用 WebView 开发者工具应用在设备上启用 webview-log-js-console-messages 标志,以便在 Logcat 中查看控制台日志

  • 消息拦截:通过在 WebChromeClient 中实现 onConsoleMessage() 来拦截 JavaScript 控制台消息。下一部分将详细介绍此方法。

如果您要从开发机器上的本地 Web 服务器提供内容,请参阅从 WebView 访问本地开发服务器,了解如何从设备或模拟器连接到该服务器。

拦截包含 onConsoleMessage() 的消息

在调试 WebView 时,控制台 API 受支持。您必须提供实现 onConsoleMessage() 方法的 WebChromeClient,才能在 Logcat 中显示控制台消息。然后,通过 setWebChromeClient()WebChromeClient 应用到 WebView

WebChromeClientWebView 的辅助类。它处理 Web 内容中发生的与界面相关的事件,例如显示 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