这篇文章主要是记录,在webview中实现自动点击按钮,和内容填充。遇到一些问题,希望能对你有所帮助
Webview 与 JS交互:
Webview 与 JS交互,可以查看这篇文章Android:你要的WebView与 JS 交互方式 都在这里了
下面的JS代码实现的功能是:点击帐号登陆,输入账号密码,登陆
String js = "javascript:{document.getElementById('switcher_plogin').click();" +
"document.getElementById('u').value = '" + QQ + "';" +
"document.getElementById('p').value='" + pwd + "';" +
"document.getElementById('login_button').click();};";
在 Android 应用的webview中始终报错,
报错:
Uncaught TypeError: Cannot read property 'click' of null
找不到switcher_plogin这个控件,但是在网页能看到这个控件
网上看了很多答案,大部分说是添加下面的代码
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
但是我添加了,这个设置后,依旧是没有效果
分析:
问题一:
在网页端使用上面的js代码,可以实现想要的效果。但是需要在console中选择对应的iframe,否则也是出现同样的错误
我把这个网址在postman请求一下,看到返回的代码,果然是没有switcher_plogin,但是界面上有显示这个控件。是因为这个iframe是在另一个网址请求返回的。
解决:
每一个iframe都有一个window对象,也就有document对象,想对其中的控件进行操作,就需要这个document。
那顺理成章就应该是获取这个iframe的document,进行操作
window.frames["iframe的name值"].document.getElementById("iframe中控件的ID").click();
问题二:
在获取到控件后,在执行click()操作,报错了
Uncaught DOMException: Blocked a frame with origin "https://graph.qq.com" from accessing a cross-origin frame.
at <anonymous>:1:56
因为这个iframe和主界面的,不同源,所以互相不能进行访问,这是浏览器进行的限制
解决:
因为这个html和js文件,我无法修改,所以想通过这种方式实现我的需求,是不可能了。打算换一种思路,Android 基于坐标的模拟点击等
如果你可以修改html和js文件,通过跨域,是可以实现需求的。可参考这篇文章详解js跨域问题
参考:
[疑难杂症] Android WebView 无法打开天猫页面
Enabling general JavaScript in WebViewClient
WebView, problems with JavaScript clicking button
详解js跨域问题
Android Webview: “Uncaught TypeError: Cannot read property ‘getItem’ of null”
Android:你要的WebView与 JS 交互方式 都在这里了