WebView動態注入JavaScript腳本


Demo地址:https://gitee.com/chenyangqi/YouMeDai
背景介紹

Android與JavaScript交互一文中學習了原生和JS交互,但是如果我們想和別人開發好的web頁面交互呢,很明顯這個web端並沒有為我們定義好的jsBridge,就是很流氓的抓取其他網頁的數據。
完整的案例,功能如下圖,webview加載在如下網頁,當用戶點擊獲取驗證碼時,獲取用戶輸入的手機碼,同樣在其他頁面獲取用戶名和身份證號碼。
image.png
把終獲得的數據上傳雲服務器結果如下
抓取到的用戶信息

實現思路

1.webview加載完后,打印HTML文本,定義到需要獲取數據的dom節點
2.編寫Javascript獲取dom數據,並通過JSBridge返回Android端
3.Android通過WebView.loadUrl("javascript: js_str")注入編寫好的js

1.打印Html文本

定義JavaScriptInterface

import android.util.Log;
import android.webkit.JavascriptInterface;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.SaveListener;

public class MyJavaScriptBridge {
    @JavascriptInterface
    public void showSource(String html) {
        //TODO 打印HTML
        System.out.print(html);
    }
    @JavascriptInterface
    public void showDescription(String str) {
        //TODO 描述
    }
}
2.注入打印HTML文本的js

webView中頁面加載完回調后注入javascript

 webView.setWebViewClient(new WebViewClient() {
          
            @Override
            public void onPageFinished(WebView view, String url) {
                    view.loadUrl("javascript:window.ANDROID_CLIENT.showSource("
                            + "document.getElementsByTagName('html')[0].innerHTML);");
                    view.loadUrl("javascript:window.ANDROID_CLIENT.showDescription("
                            + "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')"
                            + ");");
                super.onPageFinished(view, url);
            }
        });
3.編寫操作dom的js,注入webview中

上述可以在showSource()中打印html文本,將文本拷貝到本地,定位到dom的id,編寫JavaScript操作dom獲取數據再通過WebView.loadUrl("javascript: js_str")注入,完工直接看代碼
如下是我寫的js,監聽button點擊事件獲取手機號碼input內容,返回給android。

public void onPageFinished(WebView view, String url) {
                    // 注入Javascript實現監聽點擊事件獲取電話號碼的功能
                    view.loadUrl("javascript:\t$(document).ready(function () {\n" +
                            "\t\t$(\"#dtmbtn\").click(function () {\n" +
                            "\t\t\tvar phone = $(\"#mobile\").val();\n" +
                            "\t\t\tif (phone.length > 0) {\n" +
                            "\t\t\t\twindow.ANDROID_CLIENT.showLoginPhone(phone);\n" +
                            "\t\t\t} else {\n" +
                            "\t\t\t}\n" +
                            "\t\t});\n" +
                            "\t});");
                }

本博文僅用於學習


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM