Android WebView 和 JavaScript 以编程方式单击按钮不起作用
Android WebView and JavaScript programmtically clicking button not working
我有一个非常简单的用例,即以编程方式调用我的 webview 中加载的网页的按钮。下面是代码
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 上并且不安全,不确定它是否相关。
我尝试了另一个带有登录字段的 public 页面,同样的代码有效,按钮被成功点击。
你可以这样处理webview按钮点击
@JavascriptInterface
public void handleClick(String id) {
startActivity(new Intent(mContext, MainActivity.class));
}
在javascript
Android.handleClick(_id);
好的,我找到原因了。因此 onPageFinished
在所有 DOM 元素未加载时被调用,因此 javascript 失败。暂时它可以工作,我添加了一个延迟 5 秒的延迟处理程序并且它起作用了。正确的解决方案应该是检查页面是否完成加载(可以使用 jquery 来检查文档何时准备好)。
我有一个非常简单的用例,即以编程方式调用我的 webview 中加载的网页的按钮。下面是代码
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 上并且不安全,不确定它是否相关。
我尝试了另一个带有登录字段的 public 页面,同样的代码有效,按钮被成功点击。
你可以这样处理webview按钮点击
@JavascriptInterface
public void handleClick(String id) {
startActivity(new Intent(mContext, MainActivity.class));
}
在javascript
Android.handleClick(_id);
好的,我找到原因了。因此 onPageFinished
在所有 DOM 元素未加载时被调用,因此 javascript 失败。暂时它可以工作,我添加了一个延迟 5 秒的延迟处理程序并且它起作用了。正确的解决方案应该是检查页面是否完成加载(可以使用 jquery 来检查文档何时准备好)。