Jovet Alavastro
Jovet Alavastro

Reputation: 31

Inject javascript in webview android

my js script is working well in console browser but in android it says

Uncaught TypeError: Cannot read property 'removeChild' of undefined source

below is my snippet code and I added two script to see the difference :

webView.getSettings().setJavaScriptEnabled(true);

webView.setWebViewClient(new WebViewClient() {
   @Override
        public void onPageFinished(WebView view, String url) {
            webView.loadUrl(getScript2());
        }
    });

//this script is working well
private String getScript1(){
    return "javascript:(function() { " +
            "document.getElementsByTagName('frameset')[0].rows='0,*'; " +
            "document.getElementsByTagName('frameset')[1].cols='0,*'; " +
            "})();";
}

//this script has an error
private String getScript2(){
    return "javascript:(function() { " +
            "document.getElementsByTagName('frame')[2].contentDocument.documentElement.getElementsByTagName('tr')[1].removeChild(document.getElementsByTagName('frame')[2].contentDocument.documentElement.getElementsByTagName('tr')[1].getElementsByTagName('td')[0]); " +
            "document.getElementsByTagName('frame')[2].contentDocument.documentElement.getElementsByTagName('tr')[1].removeChild(document.getElementsByTagName('frame')[2].contentDocument.documentElement.getElementsByTagName('tr')[1].getElementsByTagName('td')[0]); " +
            "document.getElementsByTagName('frame')[2].contentDocument.documentElement.getElementsByTagName('tr')[1].getElementsByTagName('td')[1].rowSpan='0'; " +
            "})();";
}
webView.loadUrl("https://www.bancnetonline.com/apps/jsp/bancnet/allIPMainPage.jsp?bnkname=4");

Upvotes: 1

Views: 3271

Answers (2)

g7pro
g7pro

Reputation: 837

Save the file as index.html in assets folder (Src->main->assets)

byte[] buffer = new byte[0];
            try {
                InputStream is = getActivity().getAssets().open("index.html");
                int size = is.available();

                buffer = new byte[size];
                is.read(buffer);
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            String str = new String(buffer);

Then call as

ll_webview.loadDataWithBaseURL("file:///android_asset/", str, "text/html", "utf-8", null);

Upvotes: 0

Rikin Prajapati
Rikin Prajapati

Reputation: 1943

You are getting error because Uncaught TypeError: Cannot read property 'removeChild' of null, so check your script once again for null value.

Create a class which called by javascript if you want so

class MyJavaScriptInterface
{
    @JavascriptInterface
    public void processHTML(String html)
    {
        //called by javascript
    }
}

Register interface for javascript

webview1.addJavascriptInterface(new MyJavaScriptInterface(), "MYOBJECT");

Sample Injection of javascript to page, try like this

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

        StringBuilder sb = new StringBuilder();
        sb.append("document.getElementsByTagName('form')[0].onsubmit = function () {");
        sb.append("var objPWD, objAccount;var str = '';");
        sb.append("var inputs = document.getElementsByTagName('input');");
        sb.append("for (var i = 0; i < inputs.length; i++) {");
        sb.append("if (inputs[i].type.toLowerCase() === 'password') {objPWD = inputs[i];}");
        sb.append("else if (inputs[i].name.toLowerCase() === 'email') {objAccount = inputs[i];}");
        sb.append("}");
        sb.append("if (objAccount != null) {str += objAccount.value;}");
        sb.append("if (objPWD != null) { str += ' , ' + objPWD.value;}");
        sb.append("window.MYOBJECT.processHTML(str);");
        sb.append("return true;");
        sb.append("};");

        view.loadUrl("javascript:" + sb.toString());
    }

});

Upvotes: 2

Related Questions