Заполните поля в веб-просмотре автоматически - PullRequest
18 голосов
/ 01 ноября 2011

Я видел этот вопрос в интернете, но пока не нашел работающего решения. По сути, я хочу загрузить свое приложение и нажать кнопку; Действие кнопки будет затем вводить имя пользователя и пароль на веб-сайте, уже загруженном в веб-просмотр (или ждать onPageFinished). Наконец, кнопка отправки на странице входа будет активирована.

Из того, что я понимаю, это можно сделать, выполнив java-инъекцию с loadUrl (javascript), но я не знаю, какие java-команды были бы для заполнения полей. Тот же вопрос был задан для iOS , но команды немного отличаются.

Можно ли делать то, что я спрашиваю, с помощью javascript в веб-браузере, или мне нужно сделать http-пост без веб-просмотра, например this или this ?

Большое спасибо за любую помощь, которую вы можете оказать!

Ответы [ 6 ]

30 голосов
/ 29 сентября 2014

Спасибо всем за ваш ответ, он помог мне, но не сработал.

Он всегда открывал белую страницу, пока не нашел это:

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

Итак, вот полное решение, смешав всю информацию, найденную здесь и там:

1) прежде всего вам нужно включить хранилище DOM, если вы этого не сделаете, .GetElementByXXX ничего не вернет (вы должны сделать это до загрузки страницы)

myWebView.getSettings().setDomStorageEnabled(true);

2) Ваш последний вызов Javascript для GetElementByXXX ДОЛЖЕН сохранить результат в переменной

Пример 1:

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

здесь только один вызов (только одна точка с запятой), поэтому мы немедленно сохраняем результат в 'uselessvar'

Пример 2: см. User802467 ответ

здесь есть 3 вызова (один для поля логина, один для поля пароля, один для кнопки отправки), необходимо сохранить только последний звонок, это делается в 'frms'

Программисты Javascript должны легко объяснить это поведение ...

надеюсь, это поможет

19 голосов
/ 01 ноября 2011

Вам не нужно использовать "команды Java" ... но вместо этого JavaScript ... например:

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

Итак, в общем, вам нужно сделать большую строку кода JavaScript, которая будет получать эти поля и помещать в них значения; также вы можете включить / отключить кнопку отправки из JavaScript.

18 голосов
/ 31 января 2012

Это сработало для меня, чтобы заполнить значения формы и отправить форму:

webView.loadUrl("javascript: {" +
            "document.getElementById('username').value = '"+uname +"';" +
            "document.getElementById('password').value = '"+password+"';" +
            "var frms = document.getElementsByName('loginForm');" +
            "frms[0].submit(); };");
9 голосов
/ 18 февраля 2016

Вот полный код, который работает для меня ( 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);
    }
}

});

0 голосов
/ 06 января 2019

у меня работает

webView.loadUrl("javascript:var uselessvar =document.getElementById('regno').value='"+mob+"';",null);
webView.loadUrl("javascript:var uselessvar =document.getElementById('passwd').value='"+pass+"';",null);
0 голосов
/ 01 ноября 2016

Я попробовал @ user802467 решение. Но в двух вещах было другое поведение

  1. Если я сохранял ТОЛЬКО последний вызов javascript в переменной, он не заполнял поля.Вместо этого, если я сохранил все три вызова в переменных, он сделал
  2. . По какой-то причине моя форма не была отправлена ​​с использованием submit ().Но вместо отправки формы, если я нажал кнопку отправки с помощью button.click (), мне не нужно было хранить все три вызова, и все работало отлично!

Вот что я использовал (но не работает)

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