我已经看到这个问题浮现在互联网上,但我还没有找到可行的解决方案。基本上,我想加载我的应用程序并按下按钮;然后按钮操作将在已经加载到webview中的网站中填写用户名和密码(或等待onPageFinished)。最后,将激活登录页面上的提交按钮。
根据我的理解,这可以通过使用loadUrl(javascript)进行java注入来完成,但我不知道填写字段的java命令是什么。同样的问题被问到iOS,但命令略有不同。
是否有可能在webivew中使用javascript执行我要求的操作,或者我是否必须在没有this或this等网络视图的情况下执行http帖子?
非常感谢您提供任何帮助!
答案 0 :(得分:28)
感谢大家的回答,这对我很有帮助,但没有成功。
总是打开一个白页,直到我发现:
https://stackoverflow.com/a/25606090/3204928
所以这里有完整的解决方案,混合所有在这里和那里找到的信息:
1)首先你必须启用DOM存储,如果不这样做,.GetElementByXXX将不返回任何内容(你必须在之前加载页面)
myWebView.getSettings().setDomStorageEnabled(true);
2)您在GetElementByXXX上的最后一次Javascript调用必须将结果存储在变量中
例1:
_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");
这里只有一个电话(只有一个分号)所以我们立即将结果存储在'uselessvar'中
示例2:请参阅user802467答案
这里有3个电话(一个用于登录字段,一个用于密码字段,一个用于提交按钮),只有最后一个电话需要存储,它是在'frms'中完成的
Javascript程序员应该很容易解释这种行为......
希望这会有所帮助
答案 1 :(得分:19)
您不需要使用“java命令”......而是使用JavaScript ...例如:
String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");
所以基本上,你需要做的是一大串JavaScript代码,它们将获取这些字段并将值放在它们上面;此外,您可以从JavaScript启用/禁用提交按钮。
答案 2 :(得分:18)
这对我填写表单值并提交表单非常有用:
webView.loadUrl("javascript: {" +
"document.getElementById('username').value = '"+uname +"';" +
"document.getElementById('password').value = '"+password+"';" +
"var frms = document.getElementsByName('loginForm');" +
"frms[0].submit(); };");
答案 3 :(得分:9)
以下是适合我的完整代码(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);
}
}
});
答案 4 :(得分:0)
我尝试了@ user802467解决方案。但是在2件事上有不同的行为
这是我使用的(但没有用)
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();"
);
答案 5 :(得分:0)
对我有用
webView.loadUrl("javascript:var uselessvar =document.getElementById('regno').value='"+mob+"';",null);
webView.loadUrl("javascript:var uselessvar =document.getElementById('passwd').value='"+pass+"';",null);