自动填写webview中的字段

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

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

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

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

您不需要使用“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();" );