Kotlin中WebView无法加载网页、执行JS填表单点按钮无响应如何解决
问题原因及修复方案
核心错误点
- JS功能未实际开启:你写的
webViewLogin.settings.javaScriptEnabled、webViewLogin.settings.domStorageEnabled仅为读取属性值的操作,没有赋值为true,等同于未开启JS权限,注入的JS代码完全无法执行。 - WebViewClient设置时机错误:你在
btnLogin的点击回调中才给WebView设置WebViewClient,但页面在Activity初始化时就已经调用loadUrl完成加载了,首次加载的回调完全不会触发你写的自动填充逻辑。 - 注入的JS代码存在语法和逻辑问题:
- 账号、密码赋值语句后的
null缺少分号分隔,会直接抛出JS语法错误 getElementsByClassName返回的是匹配元素的集合,需要取下标为0的首个元素才能调用click()方法,直接对集合调用方法完全无效
- 账号、密码赋值语句后的
- JS执行方式不规范:Android 4.4及以上版本推荐使用
evaluateJavascript执行JS代码,比loadUrl兼容性更高,也不会触发不必要的页面刷新。
修正后代码
val webViewLogin = findViewById<WebView>(R.id.webViewLogin) // 提前配置WebView参数 webViewLogin.settings.apply { javaScriptEnabled = true domStorageEnabled = true } // 提前设置WebViewClient,标记页面加载状态 var isPageLoaded = false webViewLogin.webViewClient = object : WebViewClient() { override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { println("Page loading...") isPageLoaded = false } override fun onPageFinished(view: WebView, url: String) { isPageLoaded = true println(webViewLogin.title.toString()) } } // 加载目标页面 webViewLogin.loadUrl("https://mail.metropolitan.ac.rs/?loginOp=logout") // StrictMode放行仅用于本地调试,线上版本禁止使用 val policy = ThreadPolicy.Builder().permitAll().build() StrictMode.setThreadPolicy(policy) btnLogin.setOnClickListener { // 确保页面加载完成后再执行JS if (!isPageLoaded) return@setOnClickListener // 使用evaluateJavascript执行JS webViewLogin.evaluateJavascript(""" (function() { document.getElementById('username').value = 'myUsername'; document.getElementById('password').value = 'myPassword'; document.getElementsByClassName('ZLoginButton DwtButton')[0].click(); })() """.trimIndent(), null) }
注意:如果目标页面存在动态渲染的情况,可在JS代码中适当增加延迟执行逻辑,避免元素还未渲染完成就执行操作。
内容的提问来源于stack exchange,提问作者Nikola
相关产品推荐
相关产品推荐

