我使用Webview创建了一个应用,需要自动按下按钮
用例:-打开链接web link 并要自动按“此处登录”按钮(右侧的第二个按钮)。
我尝试使用此功能:-
来自网站的“此处登录”按钮的HTML为<input _ngcontent-c13="" style="padding: 2px" type="button" class="pri_btn" value="Login Here">
它没有 id 或 name ,所以我尝试使用类名,但没有任何反应
String js = "javascript:(function(){"+
"l=document.getElementByClassName('pri_btn');"+
"e=document.createEvent('HTMLEvents');"+
"e.initEvent('click',true,true);"+
"l.dispatchEvent(e);"+
"})()";
webView.evaluateJavascript(js, new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
String result = s;
}
});
返回空值。
任何帮助将不胜感激!
答案 0 :(得分:1)
您可能想使用称为getElementsByClassName
(注意复数)的方法,该方法返回元素的 array 。因此您的代码应如下所示:
String js = "javascript:(function(){"+
"l=document.getElementsByClassName('pri_btn')[0];"+
"l.click();"+
"})()";
webView.evaluateJavascript(js, new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
String result = s;
}
});
此外,当我尝试运行此功能时,重定向期间发生SSL错误。要解决此问题,您应该在onReceivedSslError()
中覆盖WebViewClient
方法,如下所示:
webView.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (handler != null){
handler.proceed();
} else {
super.onReceivedSslError(view, null, error);
}
}
});
webView.getSettings().setDomStorageEnabled(true);
编辑: 检查元素值中是否存在“登录”:
javascript:(function(){
tab = document.getElementsByClassName('pri_btn');
for(var i=0; i< tab.length; i++){
if(tab[i].value.toLowerCase().indexOf("login") !== -1) return tab[i].click();
}
})()
答案 1 :(得分:0)
没有名为 getElementByClassName 的方法。它应该是getElementsByClassName
。同样, getElementsByClassName 返回的数组不是DOM元素。因此,您不能使用变量 l 作为元素。
尝试一下:
var loginBtns=document.getElementByClassName('pri_btn');
//assuming that there is only one element with class name pri_btn
loginBtns[0].click();