Jay
Jay

Reputation: 281

Fill form in WebView with Javascript

I'm trying to fill Webforms from a Webview in Android. I've already found this piece of code here: Fill fields in webview automatically

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

Unfortunatly I dont understand where I have to open the page I want to fill in.

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+"';");

When I try it this way, the site gets displayed but without any values in the forms.

Thanks in advance for helping

Upvotes: 14

Views: 20723

Answers (4)

Denish Rana
Denish Rana

Reputation: 101

Just Enable DomStorage and write "var x=" to string:

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);
}
});

Upvotes: 2

awind
awind

Reputation: 361

Android 4.4 new WebView have the issue with use loadUrl("javascript:") method, the paramter string will be url-decode before execution. You can try use evaluateJavascript() for API >= 19 and loadUrl() for API < 19. The code below is work for me.

    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);
            }
       });
    }

please refer: loadUrl("javascript:....") behaviour changed incompatibly in Android 4.4

Upvotes: 25

Edess Elder
Edess Elder

Reputation: 1501

I had the same issue, and after following different explanations on stackOverflow, I succeed to make mine working.

here is my approach

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 things : 1) you need to add this line webView.getSettings().setDomStorageEnabled(true); (reference: Android WebView always returns null for javascript getElementById on loadUrl)

2) you need to access the variable in your php code by using this view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';"); as you can see in my code I used the solution proposed by @gnpaolo, but it didn't work for me so I commented it and use this one. (reference: How to inject a String into Android WebView)

Finally, just want to add that you do not need to create a special javascript.

one more thing the forms[0] is the position of the variable in the php form, and in my case, I have the email of the user, so I wrote view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';");

Hope, this can help others.

Upvotes: 1

gnpaolo
gnpaolo

Reputation: 350

You should fill the values after the page has been loaded. This is an example using your code:

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+"';");
    }
});

Upvotes: 22

Related Questions