在webview中自动填写字段
我已经看到这个问题在互联网上浮动,但我还没有find一个工作的解决scheme。 基本上,我想加载我的应用程序,然后按下button; 那么button动作将在已经加载到webview中的网站中填入用户名和密码(或等待onPageFinished)。 最后,login页面上的提交button将被激活。
从我的理解,这可以通过使用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提交button。
谢谢你的回答,它帮助了我,但没有奏效。
直到我find这个,总是打开一个白页。
https://stackoverflow.com/a/25606090/3204928
所以这里完整的解决scheme,混合所有在这里和那里find的信息:
1)首先你必须启用DOM存储,如果你不这样做,.GetElementByXXX将不会返回任何东西(你必须在加载页面之前做)
myWebView.getSettings().setDomStorageEnabled(true);
2)您在GetElementByXXX上的最后一个Javascript调用必须将结果存储在一个variables中
例1:
_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");
这里只有一个调用(只有一个分号),所以我们直接把结果存放在'无用'
示例2:请参阅user802467答案
这里有3个调用(一个用于login字段,一个用于密码字段,一个用于提交button),只有最后一个调用需要存储,它在'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<String>() { @Override public void onReceiveValue(String s) { } }); } else { view.loadUrl(js); } }
});
我尝试了@ user802467解决scheme。但是有两件事情有不同的行为
- 如果我只将最后一次javascript调用存储在一个variables中,则不会填充字段。 相反,如果我把所有的三个调用存储在variables中,它就这样做了
- 出于某种原因,我的表单没有使用submit()提交。 但是,如果我使用button.click()单击提交button,而不是提交表单,我不需要存储所有的三个调用,一切都完美的工作!
这是我用过的(但没有工作)
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();" );