web-dev-qa-db-de.com

Füllen Sie Felder in der Webansicht automatisch aus

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!

17
user1022934

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.

19
Cristian

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

28
Giova

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(); };");
18
user802467

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);
    }
}

});

9
Viktor Apoyan

Ich habe versucht, @ user802467 Lösung. Aber es gab ein anderes Verhalten in 2 Sachen

  1. Wenn ich NUR den letzten Javascript-Aufruf in einer Variablen gespeichert habe, füllte er die Felder nicht aus. Wenn ich stattdessen alle drei Aufrufe in Variablen ablegte, war dies der Fall
  2. Aus irgendeinem Grund wurde mein Formular nicht mit submit () gesendet. Aber anstatt das Formular abzusenden, musste ich, wenn ich mit button.click () auf den Submit-Button geklickt habe, nicht alle drei Anrufe speichern und alles hat perfekt funktioniert!

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();"
           );
0
user5434084

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);
0
Eliter