我在我们的应用中的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);
}
}
答案 0 :(得分:0)
如果您在浏览器中评估$("#username").length
,则会看到您正确获得1
作为结果。
我希望可能发生的事情是你在加载整个角度页面之前通过android运行JavaScript。页面的某些部分是动态加载的,因此您无法利用常用的浏览器事件来完成页面加载。
我发现代码中同时包含ng-view
和ng-include
,在页面完成后,这两个DOM都可以获取更多动态插入的DOM&#34;加载,登录表单位于其中一个。
你可以通过延迟运行的代码来做一个快速而肮脏的健全性检查,但是一个页面完全加载后,一个更强大的长期方法是通过JavaScript界面将网页与android通信。 / p>