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!
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.
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
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(); };");
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);
}
}
});
J'ai essayé la solution @ user802467.Mais il y avait un comportement différent dans 2 choses
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();"
);
Ç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);