内容简介:记录一下省的忘记了,遍看源码,边猜测,边实验目前Android WebView支持主要还是靠ChromeDriver来实现的。Chromedriver貌似一定要ADB才行。其中用到了命令有
记录一下省的忘记了,遍看源码,边猜测,边实验
chromedriver用了哪些命令和资源
目前Android WebView支持主要还是靠ChromeDriver来实现的。
Chromedriver貌似一定要ADB才行。其中用到了命令有 ps
, grep
, adb forward
, am start
等等
既然还用到了 adb forward .. localabstract
, 先打开一个带webview的app(这里用了微信)
查看下有哪些服务监听了localabstract
$ cat /proc/net/unix | grep @ 0000000000000000: 00000002 00000000 00010000 0001 01 32803 @bthcitraffic 0000000000000000: 00000002 00000000 00010000 0001 01 3789231 @chrome_devtools_remote 0000000000000000: 00000002 00000000 00010000 0001 01 32963 @/data/misc/bluedroid/.a2dp_ctrl 0000000000000000: 00000002 00000000 00010000 0001 01 76 @time_genoff 0000000000000000: 00000002 00000000 00010000 0001 01 88 @android:debuggerd 0000000000000000: 00000002 00000000 00010000 0001 01 4640516 @webview_devtools_remote_13680 0000000000000000: 00000002 00000000 00010000 0001 01 17596 @jdwp-control 0000000000000000: 00000003 00000000 00000000 0001 03 4453235 @jdwp-control 0000000000000000: 00000003 00000000 00000000 0001 03 4250761 @jdwp-control
其中 @
符号代码监听的本地Unix socket
这里看到有两个 @chrome_devtools_remote
和 @webview_devtools_remote_13680
比较吸引人。
chrome_devtools_remote
应该对应的是浏览器。
webview_devtools_remote_13680
对应的应该是应用内的WebView,根据源码感觉这个13680应该是个pid
odin:/ $ ps | grep 13680 USER PID PPID VSIZE RSS WCHAN PC NAME u0_a280 13680 591 2522104 168072 SyS_epoll_ 0000000000 S com.tencent.mm:tools
com.tencent.mm
这个应该就是微信了。
先把这个forward到本地
$ adb forward tcp:5000 localabstract:webview_devtools_remote_13680
看chromedriver的代码,里面自带一些http接口,具体看下面的代码
https://github.com/bayandin/chromedriver/blob/33218feb63bc972c7175390ee2302fe5a2f25056/chrome/devtools_http_client.cc#L92有个比较简单的接口获取浏览器的版本号,以此来确定该使用的chromedriver版本。
$ curl localhost:5000/json/version { "Android-Package": "com.tencent.mm", "Browser": "Chrome/57.0.2987.132", "Protocol-Version": "1.2", "User-Agent": "Mozilla/5.0 (Linux; Android 7.1.1; OD103 Build/NMF26F; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044205 Mobile Safari/537.36", "V8-Version": "5.7.492.72", "WebKit-Version": "537.36 (@user1128ad40ab2e3d761c06d1)" }
从这个链接里面可以看到没有Chrome Version( 57 )对应的应该使用的chromedriver版本号( 2.29 ) https://chromedriver.storage.googleapis.com/2.41/notes.txt
去这个地址下载 https://npm.taobao.org/mirrors/chromedriver
继续更新
猜测:除了微信有个调试的按钮,其他的H5的应用应该也是可以的吧。
先试了试Appium自带的demo apk
安装到手机上之后,进入 Views
-> WebView
,然后看到这么一个简单的界面
图层结构显示也有Hierarchy
Chrome浏览器打开 chrome://inspect
更多相关的内容参考谷歌的Chrome-Devtools文档 https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?hl=zh-cn
使用VXP强制开始WebView
那有没有强制开启的方法呢? 很快谷歌出来一篇文章
强制开启android webview debug模式使用Chrome inspect看来手机需要Root才行,还用到了高端的Xposed(不对呀,我明明记得可以不用root的呀),继续谷歌了下发现还有个VirtualXposed可以不用root
相关的VirtualXposed(简称VXP)简介 https://github.com/android-hacker/VirtualXposed
安装很简单,跟普通的App一样,下载apk到手机,安装就ok了。
接下来用VXP自带的安装器,安装 ApiDemos-debug.apk
然后再安装个插件 WebViewDebugHook 同样是个Apk下载,用VXP安装上就好了。
关于那个插件的原理可以在这里看到 https://www.jianshu.com/p/d6699cd4505e
安装上之后,先打开
进入到 模块 中,勾选
返回,然后向下滑动,进入到这个界面,点击箭头位置
拖到最下面点击 重启
是插件更改生效。
PS: 使用VXP安装的应用 pm list packages
是看不到的,只有在运行的时候用 ps
才可以查看到
回到应用界面,点击刚才安装的APK API Demos
, 重新进入到WebView,然后打开 chrome://inspect
这个时候终于看到了,期望的界面。
应用使用的Chrome版本是 62.0.3202.84
Appium的代码里面有个对应的表可以直接查改用哪一个 chromedriver https://github.com/appium/appium-chromedriver/blob/master/lib/chromedriver.js#L20
PS D:\Temp> .\chromedriver.exe -h Usage: D:\Temp\chromedriver.exe [OPTIONS] Options --port=PORT port to listen on --adb-port=PORT adb server port --log-path=FILE write server log to file instead of stderr, increases log level to INFO --log-level=LEVEL set log level: ALL, DEBUG, INFO, WARNING, SEVERE, OFF --verbose log verbosely (equivalent to --log-level=ALL) --silent log nothing (equivalent to --log-level=OFF) --version print the version number and exit --url-base base URL path prefix for commands, e.g. wd/url --whitelisted-ips comma-separated whitelist of remote IPv4 addresses which are allowed to connect to Chr omeDriver
chromedriver默认监听9515端口。
先来段简单的代码试试。获取WebView中显示的内容
# coding: utf-8 from selenium import webdriver options = {'androidPackage': 'com.appium.android.apis', 'androidUseRunningApp': True} d = webdriver.Remote("http://localhost:9515", {"chromeOptions": options}) # /html/body/a el = d.find_element_by_xpath("/html/body/a") print(el.text)
运行,之后就报错了,提示
WebDriverException: Message: unknown error: com.appium.android.apis is not installed on device 3578298f (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.16299 x86_6 4)
估计是通过 pm path <package)name>
判断的有没有安装,也罢,再安装一遍好了。然后给options加了 androidProcess
参数
options = { 'androidPackage': 'io.appium.android.apis', 'androidUseRunningApp': True, 'androidProcess': 'io.appium.android.apis' }
重新再运行代码终于出来了
Hello World! - 1
哎,真是麻烦。。 -~~
参考
- chromedriver官方简短的使用说明
- 微信 webview 的自动化技术
- chromedriver源码
- ATX 文档 - Android WebView 支持说明
- ATX-uiautomator2 实现 webview 的操作
- 使用Xposed强制android WebView开启debug模式
- 谷歌文档-远程调试 WebView
- Appium的chromedriver库 https://github.com/appium/appium-chromedriver
- NB的VXP项目 https://github.com/android-hacker/VirtualXposed
- 通过ADB控制VXP
- Chromedriver淘宝镜像
以上所述就是小编给大家介绍的《Android WebView 研究笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Golang 热更新研究笔记
- 吴恩达《机器学习》笔记,哥大研究生献上
- 安全研究 | 传真机的攻击面研究报告
- IBM将建新AI研究中心,旨在开展“颠覆性研究项目”
- 清华人工智能研究院成立「知识智能研究中心」,发布四大知识平台
- 姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
React Native:用JavaScript开发移动应用
【美】Truong Hoang Dung(张皇容) / 奇舞团 / 电子工业出版社 / 2015-9 / 65.00
React Native是当前移动端开发中的优秀解决方案。《React Native:用JavaScript开发移动应用》围绕着如何将一个完整App提交到App Store,讲解了使用React Native开发iOS应用所涉及的方方面面。首先介绍了Flexbox布局,教大家从零开始搭建一个初始应用,以此阐明React Native的基础运行机理;然后介绍了Flux的设计思想,怎么理解和使用Pro......一起来看看 《React Native:用JavaScript开发移动应用》 这本书的介绍吧!