使用Sonic进行跨网段部署,助力海外业务的公司进行专项检测。提供定时任务充分利用无人值守时间回归UI测试,省时省力。自研随机事件测试与UI遍历测试,支持打通Jenkins的DevOps流程,Sonic提供图像识别,后续还会添加poco控件,助力游戏公司测试效率。趣味交互让用户不再感到繁琐。丰富图表展示,用户实时洞察用例执行情况,把控产品质量。
感谢各大公司对Sonic的支持,感谢霍格沃兹的大力赞助~今后sonic必将继续努力!
通过架构图可以看到,用户可以通过 Sonic 平台,轻松访问跨网段的 Agent 下的设备,执行远控或测试,如果公司资金充足的情况下,全球分布多个机房是 ok 的,这样可以满足部分公司有海外业务测试的需求。
Agent 通过图中的方式与设备进行交互,同时自身加入了图像算法与 webSocket 服务。
springboot WebSocket(WebSocket 基础)
ddmlib(ADB 通信)
appium java client(Appium 交互)
thumbnailator(图片压缩)
testNG(测试框架与断言)
jsoup(解析 xml)
javacv(图像算法基础)
opencv(图像算法核心)
tesseract(图片文字识别)
leptonica(图像算法)
openblas(图像算法)
众所周知,minitouch 已经不兼容安卓 10 以上了,gif 图中那种流畅的触控交互是怎么实现的呢?在这里十分感谢 STF,给我提供了思路。
具体做法如下:
1、调用安卓内部的 android.hardware.input.InputManager
2、因为安卓 10 以上是 minitouch 被禁用了/dev/device/input 权限,思路就是把 minitouch 的调用方式,改造成用 apk 调用第一步的内部 api
3、在 apk 暴露 socket 服务,当然这里参考了 STF 的做法,但是去除了一些不必要的服务与二开优化。
4、剩下的兼容 minitouch 的数据格式即可,STF 在这里限定了多点触控只能两个点,其实可以根据自己的需求二开,增加更多
MotionEvent.PointerProperties pointerProps0 = new MotionEvent.PointerProperties();pointerProps0.id = 0;pointerProps0.toolType = MotionEvent.TOOL_TYPE_FINGER;MotionEvent.PointerProperties pointerProps1 = new MotionEvent.PointerProperties();pointerProps1.id = 1;pointerProps1.toolType = MotionEvent.TOOL_TYPE_FINGER;pointerProperties[0] = pointerProps0;pointerProperties[1] = pointerProps1;
5、因为支持多点触控,前端将键盘 wasd 按键关联到摇杆坐标就可以了,当然是自定义区域与按键的多点触控指令
d 0 10 10 50cd 1 20 20 50cu 0cu 1c
过去,我们调试设备 webview 确实麻烦,adb 连接手机后,需要在谷歌进入 chrome://inspect 页面,然后找到对应的 webview,点击【inspect】按钮即可进行调试。
1、远程的设备怎么办?并不能连接到我的 inspect 页面
2、webview 调试工具首次使用需要能访问 developer.chrome 官网(搭梯子),不然调试页面会报 404,这无疑是个门槛。如果直接使用上述文章的 devtoolsFrontendUrl 的话更是需要每次都搭梯子。
3、adb forward 只能 127.0.0.1 或 localhost 访问,不能暴露给 ipv4
1.主要使用 chrome 去连接远程 webview 的 ws,达到远程 ws 交互,大家可以参考这篇文章(Chrome 远程调试协议分析与实战 - 灰信网(软件开发博客聚合))
2.将 adb forward 之后,本地再起一个 websocket 进行转发请求,相当于自己实现内网穿透
3.自己将谷歌协议加一层代理转发,类似 nginx 功能。来实现 ip 访问
4.这种方式就不需要访问外网,直接用 agent 本地浏览器的 devtools 去请求,所以缺点是不能很好地兼容谷歌协议(会造成有时候调试大约15分钟~30分钟左右过程会断开),而岩鼠是如何兼容的,还得继续深究下去…
随着iOS远控的面世,我本着测试用户反馈的效果。获得的反馈基本是iOS的投屏清晰度高,FPS能达到30,但是触控延迟也比较高
这是因为跟安卓触控原理不一致。
iOS的触控体验我是监听鼠标点击与松开完成一次滑动事件,才发送一个滑动指令给Agent执行,里面包含两次移动的坐标信息。但是安卓的触控经过调用API的方式,实时监听鼠标移动轨迹来发送指令给手机,所以触控体验会更佳、更流畅。
但是iOS的话,这种方式在webdriveragent里面很不好实现,目前也在探索之中。
TouchAction ta = new TouchAction(iosStepHandler.getDriver());String xy1 = msg.getString("pointA");String xy2 = msg.getString("pointB");int x1 = Integer.parseInt(xy1.substring(0, xy1.indexOf(",")));int y1 = Integer.parseInt(xy1.substring(xy1.indexOf(",") + 1));int x2 = Integer.parseInt(xy2.substring(0, xy2.indexOf(",")));int y2 = Integer.parseInt(xy2.substring(xy2.indexOf(",") + 1));ta.press(PointOption.point(x1, y1)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(300))).moveTo(PointOption.point(x2, y2)).release().perform();
滑动触控有个坑,两个坐标滑动动作之间,要预留大约300毫秒的停顿,不然很容易造成滑动失效或者设备不动的情况。
在本版本,iOS的支持只有投屏跟控件获取,这是我的一次尝试,看看Sonic在用户里面的兼容性达到什么水平,最后在用户的反馈中,我决定v1.3.0-beta1中加入:
5.iOS自动化与在线调试
6.siri命令
7.iOS远程装包
功能逐渐往安卓模块靠齐,后面也会将iOS版的在线webview一起做了。
至于调整FPS和清晰度,后面也会开放给用户自定义,目前是通过Appium Setting对wda内置的mjpegserver做调整。
iosDriver.setSetting(Setting.MJPEG_SERVER_FRAMERATE, 30);
所以说,用iOS打王者,体验就没安卓那么好咯~
在某些用户反馈,机器长时间插着usb充电容易造成鼓包等等安全问题,经过我一番研究后发现,改善这类问题只能从硬件级别入手,或搭配专门定制的usbhub来控制,但是这成本对于中小企业无疑是巨大的,因此在v1.3.0中,我会加入电池温度监控,当温度过高时,我们的维护人员就要进行物理干涉啦!
电池温度的监控,主要使用adb的方式去获取。输入
adb shell dumpsys battery
我们获取的信息应该有以下几项
Current Battery Service state:AC powered: falseUSB powered: trueWireless powered: falseMax charging current: 500000Max charging voltage: 5000000Charge counter: 4230000status: 5health: 2present: truelevel: 100scale: 100voltage: 4303temperature: 270technology: Li-ionmUsbStatus: 0PhoneTemp: 300
其中temperature 字段就是我们需要的,单位是0.1摄氏度。
随着用户量的增多,我们也有车载设备、视频测试的用户在其中,他们一个共同的需求是投屏远远满足不了,他们更希望可以音频也远程传输过来,同时希望兼容更多安卓设备。
目前sonic的安卓投屏解决方案是minicap,我也做过对比
8.Minicap将部分压力放在agent处理,对手机负荷不高,兼容性不太好,小米尤其严重
9.Scrcpy将投屏处理集中在手机端,渲染压力放在了前端上,兼容性较好,不支持安卓5.0以下,比较适合车载、智能手表等等。
各有优缺点,sonic如何选择呢?Sonic:我全都要
在不久的版本中,很快迎来scrcpy与minicap都可以使用,将选择权交给了用户,用户对自己的设备性能、兼容性等等自己选择投屏方案,并且远程音频传输方案已经本地开启分支,相信很快也面世~