Ich habe diese Frage im Internet gesehen, aber noch keine funktionierende Lösung gefunden. Grundsätzlich möchte ich meine App laden und eine Taste drücken. Die Schaltflächenaktion gibt dann einen Benutzernamen und ein Kennwort in eine Website ein, die bereits in der Webansicht geladen ist (oder wartet auf onPageFinished). Schließlich wird der Submit-Button auf der Login-Seite aktiviert.
Nach meinem Verständnis kann dies durch eine Java-Injektion mit der loadUrl (Javascript) durchgeführt werden, aber ich weiß nicht, wie die Java-Befehle die Felder ausfüllen sollen. Die gleiche Frage wurde nach iOS gestellt, aber die Befehle unterscheiden sich geringfügig.
Ist es möglich, das zu tun, was ich mit Javascript in einem Webauftritt frage, oder muss ich einen http-Post ohne Webansicht wie this oder this machen?
Vielen Dank für jede Hilfe, die Sie geben können!
Sie müssen nicht "Java-Befehle" verwenden ... sondern stattdessen JavaScript ... zum Beispiel:
String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");
Im Grunde müssen Sie also eine große Zeichenfolge von JavaScript-Code verwenden, die diese Felder erhält und mit Werten belegt. Sie können auch die Schaltfläche "Senden" in JavaScript aktivieren/deaktivieren.
Vielen Dank für Ihre Antwort, es hat mir geholfen, aber es hat nicht funktioniert.
Es wurde immer eine weiße Seite geöffnet, bis ich das gefunden habe:
https://stackoverflow.com/a/25606090/3204928
Hier also eine vollständige Lösung, die alle hier und dort gefundenen Informationen mischt:
1) Zuerst müssen Sie den DOM-Speicher aktivieren. Wenn Sie dies nicht tun, gibt .GetElementByXXX nichts zurück (Sie müssen es vorher die Seite laden).
myWebView.getSettings().setDomStorageEnabled(true);
2) Ihr letzter Javascript-Aufruf über GetElementByXXXMUSSdas Ergebnis in einer Variablen speichern
Beispiel 1:
_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");
hier nur ein Anruf (nur ein Semikolon), daher speichern wir das Ergebnis sofort in 'uselessvar'
Beispiel 2: Siehe Antwort von user802467
hier gibt es 3 Anrufe (einen für das Login-Feld, einen für das Passwort-Feld, einen für den Absenden-Button), nur der letzte Anruf muss gespeichert werden, dies erfolgt in 'frms'.
Javascript-Programmierer sollten dieses Verhalten leicht erklären ...
hoffe das wird helfen
Dies funktionierte für mich, um Formularwerte auszufüllen und das Formular zu senden:
webView.loadUrl("javascript: {" +
"document.getElementById('username').value = '"+uname +"';" +
"document.getElementById('password').value = '"+password+"';" +
"var frms = document.getElementsByName('loginForm');" +
"frms[0].submit(); };");
Hier ist der vollständige Code, der für mich funktioniert ( 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);
}
}
});
Ich habe versucht, @ user802467 Lösung. Aber es gab ein anderes Verhalten in 2 Sachen
Hier ist, was ich verwendet habe (aber nicht funktioniert)
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(); ");
Hier ist der Code, der für mich funktioniert hat
view.loadUrl("javascript: document.getElementById('username').value = '" + username + "';" +
" document.getElementById('password').value = '" + password + "';" +
"var z = document.getElementById('submitbutton').click();"
);
Für mich geht das
webView.loadUrl("javascript:var uselessvar =document.getElementById('regno').value='"+mob+"';",null);
webView.loadUrl("javascript:var uselessvar =document.getElementById('passwd').value='"+pass+"';",null);