Заполнение полей в 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 вещах

  1. если я сохранил только последний вызов javascript в переменной, он не заполнял поля. Вместо этого, если я сохранил все три вызова в переменных, это сделало
  2. по какой-то причине моя форма не была отправлена с помощью 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();"
           );