jQuery选择器可能与AngularJS有关

时间:2015-09-11 16:25:05

标签: android jquery angularjs

我在我们的应用中的Android网页浏览中显示此第三方网页。我想执行一些javascript来自动登录,因为应用程序知道第三方网站的凭据。

https://qs-beta.emfit.com/#!/user/presence

问题在于我无法选择我需要的元素。有一个id为id =“login”的div,我可以用$(“#login”)看到。但是,我需要使用的输入元素没有运气:

$(“#checkbox”),$(“#username”)或$(“#password”)

我唯一能想到的是AngularJS布局DOM的方式存在一些问题。

代码:

btnCheck.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        String js = "javascript:(function () {" +
                "return $(\"#username\").length;" +  //returns 0. $("#login").length returns 1
                "})()";
        wvBrowser.evaluateJavascript(js, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {
                Log.d("", s);
            }
        });

    }
});

当我通过桌面浏览器的Javascript控制台检查DOM时,我看到了缺少的元素。当我从Android使用chrome:// inspect来检查webview的内容时,它们不会出现。这是从我可以在页面加载后按下的按钮启动的,因此我知道页面已完全呈现。这几乎就像webview没有完整的DOM图片。

我的简单测试代码:

public class MainActivity extends Activity {

    WebView wvBrowser;
    Button btnCheck;
    Activity theActivity;

    String url = "https://qs-beta.emfit.com/#!/user/presence";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_browser);

        theActivity = this;

        btnCheck = (Button) findViewById(R.id.btnCheck);
        wvBrowser = (WebView) findViewById(R.id.wvBrowser);
        wvBrowser.getSettings().setJavaScriptEnabled(true);

        wvBrowser.setWebContentsDebuggingEnabled(true);

        wvBrowser.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.d("Test", "Page finished");
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(theActivity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
            }
        });

        wvBrowser.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                //Required functionality here
                return super.onJsAlert(view, url, message, result);
            }
        });

        btnCheck.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                String js = "javascript:(function () {" +
                        "return $(\"#checkbox\").html();" +
                        "})()";
                //js = "javascript:return $('#login').length";  //works

                wvBrowser.evaluateJavascript(js, new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String s) {
                        Log.d("", s);
                    }
                });

            }
        });
        // TODO add parameters here
        String params = String.format("");
        try {
            params = URLEncoder.encode(params, "UTF-8").replace("+", "%20");
        } catch (Exception e) {
            Log.d("Test", "Program error: " + e.getMessage());
        }

        wvBrowser.loadUrl(url);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您在浏览器中评估$("#username").length,则会看到您正确获得1作为结果。

我希望可能发生的事情是你在加载整个角度页面之前通过android运行JavaScript。页面的某些部分是动态加载的,因此您无法利用常用的浏览器事件来完成页面加载。

我发现代码中同时包含ng-viewng-include,在页面完成后,这两个DOM都可以获取更多动态插入的DOM&#34;加载,登录表单位于其中一个。

你可以通过延迟运行的代码来做一个快速而肮脏的健全性检查,但是一个页面完全加载后,一个更强大的长期方法是通过JavaScript界面​​将网页与android通信。 / p>