Заполнить форму в WebView с помощью Javascript

Я пытаюсь заполнить Webforms из Webview в Android. Я уже нашел здесь этот фрагмент кода: Заполнять поля в веб-просмотре автоматически

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

К сожалению, я не понимаю, где мне нужно открыть страницу, которую я хочу заполнить.

setContentView(R.layout.web);
final WebView mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(url);
String user="u";
String pwd="p";
mWebView.loadUrl("javascript:document.getElementById('username').value = '"+user+"';document.getElementById('password').value='"+pwd+"';");

Когда я пытаюсь это сделать, сайт отображается, но без каких-либо значений в формах.

Заранее благодарим за помощь

Ответ 1

Вы должны заполнить значения после загрузки страницы. Это пример использования вашего кода:

mWebView.loadUrl(url);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        String user="u";
        String pwd="p";
        view.loadUrl("javascript:document.getElementById('username').value = '"+user+"';document.getElementById('password').value='"+pwd+"';");
    }
});

Ответ 2

У Android 4,4 новый WebView есть проблема с использованием метода loadUrl("javascript:"), строка параметров будет url-decode перед выполнением. Вы можете попробовать использовать evaluateJavascript() для API >= 19 и loadUrl() для API < 19. Код ниже работает для меня.

    mWebView.loadUrl(url)
    WebSettings settings = mWebView.getSettings();
    settings.setJavaScriptEnabled(true);

    String js = "javascript:document.getElementById('username').value = '"+user+"';document.getElementById('password').value='"+pwd+"';";
    mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            if (Build.VERSION.SDK_INT >= 19) {
                view.evaluateJavascript(js, new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String s) {

                    }
                });
            } else {
                view.loadUrl(js);
            }
       });
    }

см. ниже: поведение loadUrl ( "javascript:...." ) изменено несовместимо в Android 4.4

Ответ 3

У меня была такая же проблема, и после следующих различных объяснений в stackOverflow мне удалось сделать мою работу.

вот мой подход

webView.loadUrl(url);
        webView.getSettings().setDomStorageEnabled(true);
        webView.setWebViewClient(new WebViewClient(){
            public void onPageFinished(WebView view, String url) {
                String email="[email protected]";

                //view.loadUrl("javascript:document.getElementById('email').value = '"+email+"'");
                view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';");
                Log.d("email", "can not add email");
            }
        });

2 вещи: 1) вам нужно добавить эту строку webView.getSettings().setDomStorageEnabled(true); (ссылка: Android WebView всегда возвращает null для javascript getElementById на loadUrl)

2) вам нужно получить доступ к переменной в вашем php-коде, используя этот view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';"); как вы можете видеть в моем коде, я использовал решение, предложенное @gnpaolo, но для меня это не сработало, поэтому я прокомментировал его и воспользовался этим. (ссылка: Как вставить строку в Android WebView)

Наконец, просто хочу добавить, что вам не нужно создавать специальный javascript.

еще одна вещь forms[0] - это позиция переменной в php-форме, и в моем случае у меня есть адрес электронной почты пользователя, поэтому я написал view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';");

Надеюсь, это может помочь другим.

Ответ 4

Просто включите DomStorage и напишите "var x =" в строку:

webview.getSettings().setJavaScriptEnabled(true);
web.getSettings().setDomStorageEnabled(true);

webview.loadUrl(urlString);
webview.setWebViewClient(new WebViewClient(){

public void onPageFinished(WebView view, String url){  
super.onPageFinished(view, url);
String js = "javascript:var x=document.getElementById('username').value = '"+user+"';var y=document.getElementById('password').value='"+pass+"';";

if (Build.VERSION.SDK_INT >= 19) {
        view.evaluateJavascript(js, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {

            }
        });
    } else {
        view.loadUrl(js);
    }

view.loadUrl(js);
}
});