自动填写webview中的字段

我已经看到这个问题浮现在互联网上,但我还没有find一个有效的解决方案。 基本上,我想加载我的应用程序并按下按钮; 然后,按钮操作将在已经加载到webview中的网站中填写用户名和密码(或等待onPageFinished)。 最后,将激活登录页面上的提交按钮。

根据我的理解,这可以通过使用loadUrl(javascript)进行java注入来完成,但我不知道填写字段的java命令是什么。 针对iOS提出了同样的问题,但命令略有不同。

是否有可能在webivew中使用javascript做我要求的事情,或者我是否必须在没有像这样或这样的webview的情况下做一个http-post?

非常感谢您提供任何帮助!

  • 带有嵌入式YouTubevideo的Android WebView,全屏按钮冻结video
  • webview的自定义字体
  • 在Android上显示一个有很好performance的巨大地图?
  • 在返回WebView之前,WebView下载打开浏览器窗口一会儿
  • Android WebView错误地处理预格式化文本中的换行符
  • WebView摆脱双击缩放。
  • 了解Android的webview addjavascript接口
  • Android - 从WebView绘制到PDFcanvas
  • 您不需要使用“java命令”……而是使用JavaScript …例如:

    String username = "cristian"; webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';"); 

    所以基本上,你需要做的是一大串JavaScript代码,它们将获取这些字段并将值放在它们上面; 此外,您可以从JavaScript启用/禁用提交按钮。

    谢谢大家的回答,它对我有所帮助,但没有奏效。

    它总是打开一个白页直到我发现这个:

    https://stackoverflow.com/a/25606090/3204928

    所以这里有完整的解决方案,混合所有在这里和那里find的信息

    1)首先你必须启用DOM存储,如果你不这样做,.GetElementByXXX将不返回任何内容(你必须加载页面之前这样做)

     myWebView.getSettings().setDomStorageEnabled(true); 

    2)你在GetElementByXXX上的最后一次Javascript调用必须将结果存储在一个variables中

    例1:

     _webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';"); 

    这里只有一个调用(只有一个分号)所以我们立即将结果存储在’uselessvar’中

    示例2:请参阅user802467答案

    这里有3个电话(一个用于登录字段,一个用于密码字段,一个用于提交按钮),只有最后一个电话需要存储,它是在’frms’完成的

    Javascript程序员应该很容易解释这种行为……

    希望这会有所帮助

    这有助于我填写表单值并提交表单:

     webView.loadUrl("javascript: {" + "document.getElementById('username').value = '"+uname +"';" + "document.getElementById('password').value = '"+password+"';" + "var frms = document.getElementsByName('loginForm');" + "frms[0].submit(); };"); 

    这是完整的代码,适合我( Bitbucket ):

     webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDomStorageEnabled(true); webView.loadUrl("http://example.com/"); webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); final String password = "password"; final String username = "username"; final String answer = 5; final String js = "javascript:" + "document.getElementById('password').value = '" + password + "';" + "document.getElementById('username').value = '" + username + "';" + "var ans = document.getElementsByName('answer');" + "ans[0].value = '" + answer + "';" + "document.getElementById('fl').click()"; if (Build.VERSION.SDK_INT >= 19) { view.evaluateJavascript(js, new ValueCallback() { @Override public void onReceiveValue(String s) { } }); } else { view.loadUrl(js); } } 

    });

    我尝试了@ user802467解决方案。但是在两件事情中有不同的行为

    1. 如果我只在variables中存储了最后一个javascript调用,那么它就不会填充字段。 相反,如果我将所有三个调用存储在variables中,它就会这样做
    2. 出于某种原因,我的表单没有使用submit()提交。 但是,如果我使用button.click()点击提交按钮,而不是提交表单,我不需要存储所有三个调用,一切都完美!

    这是我使用的(但没有工作)

     view.loadUrl("javascript: var x = document.getElementById('username').value = '" + username + "';" + "var y = document.getElementById('password').value = '" + password + "';" + "var form1 = document.getElementById('loginform');" + "form1[0].submit(); "); 

    这是适合我的代码

     view.loadUrl("javascript: document.getElementById('username').value = '" + username + "';" + " document.getElementById('password').value = '" + password + "';" + "var z = document.getElementById('submitbutton').click();" );