【问题标题】:Kotlin - Inject JavaScript into WebView to fill in formKotlin - 将 JavaScript 注入 WebView 以填写表单
【发布时间】:2021-05-23 16:25:21
【问题描述】:

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

到目前为止,我设法使用与 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 Logs 打印的内容。这适用于 iOS 和浏览器控制台。

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

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

在我的 webview 中启用了 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

还有其他人问了完全相同的问题,答案正是我想要做的,但是......

fill form programmatically in Android Webview - JavaScript

有什么想法吗?

【问题讨论】:

    标签: javascript kotlin webview


    【解决方案1】:

    终于搞定了。 相同的代码,不同的方法。

    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!!)
    

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      相关资源
      最近更新 更多