Заполнение полей в webview автоматически
Я видел этот вопрос, плавающий по интернету,но я еще не нашел рабочего решения. В принципе, я хочу загрузить свое приложение и нажать кнопку; Действие кнопки затем заполнит имя пользователя и пароль на веб-сайте, уже загруженном в webview (или дождитесь onPageFinished). Наконец, кнопка Отправить на странице входа в систему будет активирована.
из того, что я понимаю, это можно сделать, выполнив инъекцию java с помощью loadUrl (javascript), но я не знаю, что команды java будут заполнять поля. Тот же вопрос был задан для iOS, но команды немного отличаются.
можно ли сделать то, что я прошу с javascript в webivew, или мне нужно сделать http-сообщение без webview, как этой или этой?
огромное спасибо за любую помощь вы можете дать!
5 ответов
вам не нужно использовать "команды java"... но вместо этого JavaScript-код... например:
String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");
Итак, в основном, вам нужно сделать большую строку кода JavaScript, которая получит эти поля и поместит на них значения; кроме того, вы можете включить/отключить кнопку отправки из JavaScript.
спасибо всем за ваш ответ, это помогло мне, но не сработало.
Он всегда открывал белую страницу, пока я не нашел это:
https://stackoverflow.com/a/25606090/3204928
Итак, здесь полное решение, смешивая всю информацию, найденную здесь и там:
1) Прежде всего, вы должны включить хранение DOM, если вы этого не сделаете .GetElementByXXX ничего не вернет (вы должны это сделать до загрузка страница)
myWebView.getSettings().setDomStorageEnabled(true);
2) Ваш последний вызов Javascript на GetElementByXXX должны сохранить результат в переменной
Exemple 1:
_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");
здесь только один вызов (только одна двоеточие), поэтому мы немедленно сохраняем результат в 'uselessvar'
Пример 2: см. ответ user802467
здесь есть 3 вызова (один для поля входа в систему, один для поля пароля, один для кнопки отправки), только последний вызов должен быть сохранен, это сделано в 'frms'
программисты Javascript должны легко объяснить это поведение...
надеюсь, что это поможет
это сработало для меня, чтобы заполнить значения формы и отправить форму:
webView.loadUrl("javascript: {" +
"document.getElementById('username').value = '"+uname +"';" +
"document.getElementById('password').value = '"+password+"';" +
"var frms = document.getElementsByName('loginForm');" +
"frms[0].submit(); };");
вот полный код, который работает для меня (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);
}
}
});
я попробовал решение @user802467.Но было другое поведение в 2 вещах
- если я сохранил только последний вызов javascript в переменной, он не заполнял поля. Вместо этого, если я сохранил все три вызова в переменных, это сделало
- по какой-то причине моя форма не была отправлена с помощью submit(). Но вместо отправки формы, если я нажал на кнопку отправки с помощью кнопки.нажмите (), мне не нужно хранить все три вызова и все отлично сработало!
вот что я использовал (но не работал)
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();"
);