Kotlin-将JavaScript注入WebView以填写表单



我正试图在网络视图中显示的网页中填写表单。

到目前为止,我使用与iOS版应用程序相同的JS代码:成功隐藏了原始网页登录按钮

senseLoginButtonDisplayStatus = "document.getElementById('loginbtn').style.display = 'none';"
wvMainView!!.loadUrl("javascript:(function f() { ${senseLoginButtonDisplayStatus} } )()")

但是,我无法填写表格。JS代码在iOS版本的应用程序和浏览器控制台中运行良好,但在这里不行:

override fun onPageFinished(view: WebView?, url: String)
{
val currentURL: String? = wvMainView!!.url
if(userIsLoggedIn == false)
{
userIsLoggedIn = true
checkLoginURL()
}
if(currentURL!!.contains("targetId"))
{
senseLoginButtonDisplayStatus = "document.getElementById('loginbtn').style.display = 'none';"
wvMainView!!.loadUrl("javascript:(function f() { ${senseLoginButtonDisplayStatus} } )()")
}
}

fun checkLoginURL()
{
val currentURL: String? = wvMainView!!.url
val result: Boolean? = currentURL!!.contains("form")
if(result == true)
{
senseSubmitJS = "document.getElementById('login-form').submit();"
senseUserJS = "document.getElementsByName('username')[0].value = '${serverSettings!!.serverUser}';"
sensePassJS = "document.getElementsByName('pwd')[0].value = '${serverSettings!!.serverPassword}';"
Log.i("MyApp","MainActivity > checkLoginURL > ${senseSubmitJS}")
Log.i("MyApp","MainActivity > checkLoginURL > ${senseUserJS}")
Log.i("MyApp","MainActivity > checkLoginURL > ${sensePassJS}")
wvMainView!!.loadUrl("javascript:(function f() { ${senseUserJS} } )()")
wvMainView!!.loadUrl("javascript:(function f() { ${sensePassJS} } )()")
btnLogin!!.isVisible = true
}
}

这是3日志打印的内容。这适用于iOS和浏览器控制台。

MainActivity > checkLoginURL > document.getElementById('login-form').submit();
MainActivity > checkLoginURL > document.getElementsByName('username').value = 'domainusername';
MainActivity > checkLoginURL > document.getElementsByName('pwd')[0].value = 'password';

我不太清楚我做错了什么。我已经有一段时间没有使用Kotlin了,所以我很确定我错过了一些简单的东西,但我仍然想不出来。

JS是在我的网络视图中启用的,我确实试着遵循一些指南,试图弄清楚它。

wvMainView!!.settings.domStorageEnabled = true;
wvMainView!!.settings.javaScriptEnabled = true
wvMainView!!.settings.loadWithOverviewMode = true
wvMainView!!.settings.useWideViewPort = true

https://medium.com/@skywall/inject-js-into-androids-webview-8845fb5902b7

还有人问同样的问题,答案正是我想做的,但。。。

在Android Webview中以编程方式填写表单-JavaScript

有什么想法吗?

终于开始工作了。相同的代码,不同的方法。

override fun onPageFinished(view: WebView?, url: String)
{
Log.i("MyApp","MainActivity > onPageFinished")
val currentURL: String? = wvMainView!!.url
if(currentURL!!.contains("form"))
{
if(userIsLoggedIn == false)
{
userIsLoggedIn = true
}
senseSubmitJS = "document.getElementById('login-form').submit();"
senseUserJS = "document.getElementsByName('username')[0].value = '${serverSettings!!.serverUser}';"
sensePassJS = "document.getElementsByName('pwd')[0].value = '${serverSettings!!.serverPassword}';"
btnLogin!!.isVisible = true
view?.let { webView ->
webView.evaluateJavascript(senseUserJS + sensePassJS) { result ->
Log.i("MyApp", "form > ${result}")
}
}
}
}
wvMainView!!.loadUrl(url!!)

最新更新