Joaquin Grunert
Joaquin Grunert

Reputation: 59

Using Javascript in webview

So, reading around i read that i could "inject" javascript into a loaded webpage to programatically fill a website's form, so i tried the following:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    WebView WebView;
    WebView = (WebView) findViewById(R.id.webview);
    WebView.setWebViewClient(new HelloWebViewClient());
    WebView.getSettings().setJavaScriptEnabled(true);
    WebView.getSettings().setBlockNetworkImage(false);
    WebView.loadUrl("http://www.kingsage.es");
    String username = "XXX";
    String Password = "YYY";
    WebView.loadUrl("javascript:document.getElementById('login_player').value='"+username+"';javascript:document.getElementById('login_passwd').value = '"+Password+"';");
}

However, when i run this on the emulator i get an error as if the website could not be found. if i turn off the second loadUrl method i load the website, but i need to fill the login form programatically!, i figure i am doing something wrong but i haven't found and answer reading around. Any help would be appreciated!!

Upvotes: 4

Views: 7791

Answers (3)

TalhaAhmed
TalhaAhmed

Reputation: 70

Here is how I acheived it in my scenario where I had to browse a page, fill text boxes and submit.

WebView webView = FindViewById<WebView>(Resource.Id.webEspView);
webView.SetWebViewClient(new Client());
webView.Settings.JavaScriptEnabled = true;
webView.LoadUrl("http://192.168.4.1")

Then added the Client class and overloaded onPageFinished() method.

public class Client : WebViewClient
{
    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        string ssid = Variables.GetInitialUsername();        
        ssid = ssid.Trim(new char[] {'\"'});
        string pass = Variables.GetInitialPassword();   

        var script = $"document.getElementById(\"clientId\").value = \"{ssid}\";" +
                     $"document.getElementById(\"branchId\").value = \"{pass}\";" +                        
                     "document.querySelector('button[type=\"submit\"]').click()";           
        view.LoadUrl($"javascript: {script}");


    }
}

Hope it helps.

Upvotes: 0

timv
timv

Reputation: 3366

I like JeanLuc's suggestion and it worked for me 98% of the way. I still needed to automatically log the user into the web page once their username and password had been entered so I did the following and its worked well, except for trying to remove the "do you want to remember the password' message.

@Override
            public void onPageFinished (WebView webView, String url)
            {
                  webView.loadUrl("javascript:document.getElementById('Login1_UserName').value='"+userName+"';javascript:document.getElementById('Login1_Password').value = '"+password+"';");
                  webView.loadUrl("javascript:document.getElementById('Login1_LoginButton').click();");
            }

The second line selected the 'login' button and logged them in automatically. Hope it helps someone else.

Upvotes: 1

JeanLuc
JeanLuc

Reputation: 4893

you need to wait until the webpage is loaded (use WebViewClient) then execute your javascript

webView.setWebViewClient(new WebViewClient(){
   @Override
   public void onPageFinished (WebView webView, String url)
   {
         webView.loadUrl("javascript:document.getElementById('login_player').value='"+username+"';javascript:document.getElementById('login_passwd').value = '"+Password+"';");
   }
});

make also sure that you execute only once, not on every onPageFinished Event

Upvotes: 6

Related Questions