Заполните поля в веб-просмотре автоматически

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

fooobar.com/questions/94014/...

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

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

myWebView.getSettings().setDomStorageEnabled(true);

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

Пример 1:

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

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

Пример 2: см. ответ пользователя802467

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

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

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

Ответ 3

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

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

Ответ 4

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

});

Ответ 5

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

  • Если я сохранил ТОЛЬКО последний javascript-вызов в переменной, он не заполнял поля. Вместо этого, если я сохранил все три вызова в переменных, он сделал
  • По какой-то причине моя форма не была отправлена ​​с помощью 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();"
           );