我有一个非常简单的用例,即以编程方式调用加载到我的Web视图中的网页的按钮。下面是代码
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAppCacheEnabled(false);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
//super.onPageFinished(view, url);
switch (view.getOriginalUrl()){
case Properties.LOGIN_URL:
webView.evaluateJavascript(
"javascript:" +
"var usernameField = document.getElementById('loginUserName');" +
"usernameField.value = '" + Properties.USERNAME + "';" +
"var passwordField = document.getElementById('loginPassword');" +
"passwordField.value = '" + Properties.PASSWORD + "';", null
);
webView.evaluateJavascript(
"javascript:" +
"document.getElementById('loginButton').click();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
}
);
break;
}
}
});
view.loadUrl(Properties.LOGIN_URL);
用户名和密码字段注入工作正常,但是执行按钮单击的代码不起作用。 我搜索了很多东西,做了很多实验,但是没有运气,这有可能吗?
编辑: 我访问的URL对我们组织是私有的,位于http上,并且不安全,不确定是否相关。
我尝试了另一个带有登录字段的公共页面,并且使用相同的代码,并且成功单击了按钮。
答案 0 :(得分:1)
好的,我找到了原因。因此,在未加载所有DOM元素的情况下调用了var a = ['barclays', 'google', 'vod'];
var b = [];
var dataLength = 4;
for (let i = 0; i < a.length; i++) {
for(let j=0;j<dataLength;j++) {
b.push(a[i])
}
}
,因此javascript失败了。我暂时添加了一个延迟处理程序,延迟时间为5秒,并且可以正常工作。正确的解决方案应该是检查页面是否完成加载(可以使用jquery来检查文档何时准备就绪)。
答案 1 :(得分:0)
您可以通过这种方式处理webview按钮
@JavascriptInterface
public void handleClick(String id) {
startActivity(new Intent(mContext, MainActivity.class));
}
在javascript中
Android.handleClick(_id);