ATX webview 研究踩到的坑

codeskyblue · 2019年09月10日 · 最后由 codeskyblue 回复于 2019年09月11日 · 2771 次阅读

前言

很多人吵着闹着要我支持 WebView,可是这玩意坑也不少,不然怎么可能这么久了,还是老样子。

曾经写过的文章

设计变更之路

2017 年的时候用的是chromedriver的方案。就连现在的 Google 还是用的这个方案。不过这个方案有个最头疼的地方是 手机上的 webkit 版本要对应不同的 ChromeDriver。

2018 年的时候,开始翻 chromedriver 的实现原理,多谢 @ 思寒 大佬的指点。

2019 年的时候,发现 FAutoTest 横空出世,虽然代码写的不怎么好看(绕的我头晕),但是思路很不错。

今年 9 月花了几天时间又研究了下。记录下其中遇到的坑。

卡住的截图

截图是通过 Page.captureScreenshot() 实现的,这个函数也可以传参数。Page.captureScreenshot(format="jpeg", quality=70)
这个函数在手机 Chrome 浏览器空界面截图的时候回卡住,正常界面可以截图。
在雪球 平安证券 极速开户 界面也会卡住

Go 语言中 net.Dial("unix", "@webview_devtools_remote_xxxx") 提示连接失败

$ 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 暂时是绕不开了。

chrome://inspect/#devices 一段时间后手机 adb devices 就是发现设备断开

虽然会有这个问题,不过确实好用。屏幕同屏一直没研究出来,这东西是怎么做的。反正速度很快。看了下也不是通过 WebSocket 弄的,完全不知道怎么搞出来的。

开明的谷歌还把原理贴出来了。 https://chromedevtools.github.io/devtools-protocol/

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞
思寒_seveniruby [该话题已被删除] 中提及了此贴 09月11日 21:38

公开课哎,今晚吗?我要听听。chromedriver 的逻辑复杂的我已经看不懂了
https://testerhome.com/topics/15915#chromedriver 到底在做什么?续:分析

Fat 也是 cdp 协议,走的 websocket

其实完全可以去掉 chromedriver 的依赖,FAT 使用的 websocket 直接连接,这个方法更好点,chromedriver 的 bug 还是挺多的。
这块做好了,将来貌似可以反向合并给 appium 让他们改进下。前阵子我也在研究 websocket 通讯,也想手痒痒写个 js 去直连。
期待你研究出更省事的技术,明天我也有公开课要讲 webview。

养肥了再看

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册