很多人吵着闹着要我支持 WebView,可是这玩意坑也不少,不然怎么可能这么久了,还是老样子。
2017 年的时候用的是chromedriver的方案。就连现在的 Google 还是用的这个方案。不过这个方案有个最头疼的地方是 手机上的 webkit 版本要对应不同的 ChromeDriver。
2018 年的时候,开始翻 chromedriver 的实现原理,多谢 @ 思寒 大佬的指点。
2019 年的时候,发现 FAutoTest 横空出世,虽然代码写的不怎么好看(绕的我头晕),但是思路很不错。
今年 9 月花了几天时间又研究了下。记录下其中遇到的坑。
截图是通过 Page.captureScreenshot()
实现的,这个函数也可以传参数。Page.captureScreenshot(format="jpeg", quality=70)
这个函数在手机 Chrome 浏览器空界面截图的时候回卡住,正常界面可以截图。
在雪球 平安证券 极速开户 界面也会卡住
$ adb shell cat /proc/net/unix | grep --binary-file=text devtools
0000000000000000: 00000002 00000000 00010000 0001 01 88982 @webview_devtools_remote_8495
0000000000000000: 00000002 00000000 00010000 0001 01 72527 @chrome_devtools_remote
用一段简单的 Go 代码测试下,能够连接
package main
import (
"log"
"net"
"os"
)
func main() {
log.Println("dial:", os.Args[1])
_, err := net.Dial("unix", os.Args[1])
log.Println(err)
}
保存为dialunix.go
, 使用下面的命令编译,并推送到手机上
GOOS=linux GOARCH=arm go build -o a.out dialunix.go
adb push a.out /data/local/tmp
adb shell chmod 755 /data/local/tmp/a.out
adb shell /data/local/tmp/a.out @webview_devtools_remote_8495
然后就出现了这么头疼的一幕
2019/09/10 02:58:59 dial: @webview_devtools_remote_8495
2019/09/10 02:58:59 dial unix @webview_devtools_remote_8495: connect: permission denied
换种方式再试试
adb forward tcp:6000 localabstract:webview_devtools_remote_8495
curl localhost:6000/json/version
这次无比正常的输出了
{
"Android-Package": "com.xueqiu.android",
"Browser": "Chrome/62.0.3202.84",
"Protocol-Version": "1.2",
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0.1; SM901 Build/MXB48T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36",
"V8-Version": "6.2.414.37",
"WebKit-Version": "537.36 (@957d898f0f6e46cd9661d91d2bae899f34c1c4b6)",
"webSocketDebuggerUrl": "ws://localhost:6000/devtools/browser"
}
哎,我就不明白了,凭什么 adb 能访问 @webview_devtools_remote_8495
为什么我用 adb 启动的程序,就不用访问这个 socket 端口了,难道不应用跟 adb 有同样的权限吗? 还是想不通。
看来这个 adb 暂时是绕不开了。
虽然会有这个问题,不过确实好用。屏幕同屏一直没研究出来,这东西是怎么做的。反正速度很快。看了下也不是通过 WebSocket 弄的,完全不知道怎么搞出来的。
开明的谷歌还把原理贴出来了。 https://chromedevtools.github.io/devtools-protocol/