web-dev-qa-db-fra.com

Remplacer les champs dans la vue

J'ai vu cette question flotter sur Internet, mais je n'ai pas encore trouvé de solution efficace. En gros, je veux charger mon application et appuyer sur un bouton. L'action du bouton remplira ensuite un nom d'utilisateur et un mot de passe dans un site Web déjà chargé dans la vue Web (ou attendra onPageFinished). Enfin, le bouton d'envoi de la page de connexion sera activé. 

D'après ce que je comprends, cela peut être fait en effectuant une injection Java avec loadUrl (javascript), mais je ne sais pas quelles seraient les commandes Java pour renseigner les champs. La même question a été posée pour iOS , mais les commandes sont légèrement différentes.

Est-il possible de faire ce que je demande avec javascript dans une webivew, ou dois-je faire un post-http sans une vue web telle que ceci ou ceci ?

Merci beaucoup pour toute aide que vous pouvez donner!

17
user1022934

Vous n'avez pas besoin d'utiliser des "commandes Java" ... mais plutôt du JavaScript ... par exemple:

String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");

En gros, vous devez donc créer une grande chaîne de code JavaScript qui obtiendra ces champs et leur attribuera des valeurs; De plus, vous pouvez activer/désactiver le bouton d'envoi à partir de JavaScript.

19
Cristian

Merci à tous pour votre réponse, cela m'a aidé, mais n'a pas fonctionné.

C'était toujours ouvrir une page blanche jusqu'à ce que j'ai trouvé ceci:

https://stackoverflow.com/a/25606090/3204928

Donc voici la solution complète, mélangeant toutes les infos trouvées ici et là:

1) Tout d’abord, vous devez activer le stockage DOM. Si vous ne le faites pas, .GetElementByXXX ne renverra rien (vous devez le faire avant chargement de la page)

myWebView.getSettings().setDomStorageEnabled(true);

2) Votre dernier appel Javascript sur GetElementByXXXDOIT/ stocker le résultat dans une variable

Exemple 1:

_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");

ici un seul appel (un seul point-virgule), nous stockons donc immédiatement le résultat dans 'uselessvar'

Exemple 2: voir la réponse de l'utilisateur802467

ici il y a 3 appels (un pour le champ de connexion, un pour le champ de mot de passe, un pour le bouton d'envoi), seul le dernier appel doit être mémorisé, c'est fait dans 'frms'

Les programmeurs Javascript devraient facilement expliquer ce comportement ...

espérons que cela aidera

28
Giova

Cela m'a permis de remplir les valeurs du formulaire et de le soumettre:

webView.loadUrl("javascript: {" +
            "document.getElementById('username').value = '"+uname +"';" +
            "document.getElementById('password').value = '"+password+"';" +
            "var frms = document.getElementsByName('loginForm');" +
            "frms[0].submit(); };");
18
user802467

Voici le code complet qui fonctionne pour moi ( 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

J'ai essayé la solution @ user802467.Mais il y avait un comportement différent dans 2 choses

  1. Si je stockais UNIQUEMENT le dernier appel javascript dans une variable, les champs n'étaient pas renseignés. Au lieu de cela, si j'ai stocké les trois appels dans des variables,
  2. Pour une raison quelconque, mon formulaire n'était pas soumis à l'aide de submit (). Mais au lieu de soumettre le formulaire, si je cliquais sur le bouton d'envoi en utilisant button.click (), je n'avais pas besoin de stocker tous les trois appels et tout fonctionnait parfaitement!

Voici ce que j'ai utilisé (mais n'a pas fonctionné)

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

Voici le code qui a fonctionné pour moi

view.loadUrl("javascript:  document.getElementById('username').value = '" + username + "';" +
                           " document.getElementById('password').value = '" + password + "';" +
                           "var z = document.getElementById('submitbutton').click();"
           );
0
user5434084

Ça marche pour moi

webView.loadUrl("javascript:var uselessvar =document.getElementById('regno').value='"+mob+"';",null);
webView.loadUrl("javascript:var uselessvar =document.getElementById('passwd').value='"+pass+"';",null);
0
Eliter