For @lihuazhang
Web 技术大势所趋,随着移动端浏览器引擎性能的持续优化以及移动设备硬件持续增强,web 技术在移动设备上的的春天在离我们越来越近。
Crosswalk 虽然只是针对安卓平台,但是由于低于 android 4.4 的 webview 是一个蹩脚的 Android WebKit 浏览器内核(android 版本越低性能就越差,android 4.4 以上已经使用了 Chromium ),所以英特尔公司发布了 Crosswalk 引擎,可以让 Android 4.0-4.3 的手机上的应用打包 Chromium 引擎而不是 Android WebKit。基于此,有蛮多应用还是选择了 crosswalk 作为 app 自带的浏览器引擎。
@lihuazhang 在上篇文章中抛砖引玉介绍了 crosswalk,我接着这边文章简单介绍下基于 Crosswalk app UI 自动化,部分内容来自互联网。
在介绍如何使用 Crosswalk WebDriver 实现应用控制自动化之前,我们先为希望对 Crosswalk WebDriver 实现感兴趣的读者介绍一下 Crosswalk WebDriver 的具体实现。Crosswalk 基于 Chromium 浏览器项目,Chromium 浏览器已经对 WebDriver 有相当稳定的支持,但对于以应用程序见长的 Crosswalk 来说,还是需要额外的开发工作来支持原始 Chromium WebDriver 针对应用程序所做的增强和优化。
Crosswalk WebDriver 核心模块主要分为 HttpHandler 模块、DeviceManager 模块以及 DevToolsClient 模块。首先测试人员使用 Selenium 编写基于 WebDriver 的测试脚本,测试脚本通过 W3C 规定的标准 JSON over HTTP Wire Protocol 与 Crosswalk WebDriver 的 HttpHandler 模块通信,解析接收到的测试命令,之后由 DevToolsClient 模块调用 WebSocket 通过 Devtools Protocol 协议与终端上 Web Application 进行通信,其中涉及到对实际硬件或者模拟器的操作部分则由抽象的 DeviceManager 模块来完成,截至目前 DeviceManager 模块实现了对 Android 设备和 Tizen 设备的支持,最后 Web Application 实际执行的反馈数据再以相反的方向流回 Selenium 测试端,整个流程的测试细节都会以 Log 的形式记录下来供测试人员分析。
题外话:我在 13 年底的时候就接触到了 crosswalk 这个框架,我们的 android 版本的 app 也经历了从原生的 webview 切换到 crosswalk 的过程当中,整个应用的体验有了一定的提升,但是额外附带的 crosswalk 以及一些插件使得 app 达到了几十兆,相对应的 UI 自动化框架为了能兼容 crosswalk 版本的 app 也集成了 crosswalk 的 driver,配合 uiautomator 也算是一种组合。
简单实践:
xwalkdriver server
xwalkdriver 的 linux 版本的 binary 可以在其github网站上下载。
selenium remote driver
从 selenium(http://docs.seleniumhq.org/download/) 上下载你熟悉的语言包. 例如, 安装 python 的 binaries 可以使用 pip:
$ pip install selenium
Android SDK
需要下载 android SDK: http://developer.android.com/sdk/index.html
Run xwalkdriver server
2.确保 adb shell 有对 device 上 /data/local 读写权限:
adb shell su -c chmod 777 /data/local
3.启动 xwalkdriver,默认监听 9515 端口:
$ ./walkdriver
Sample Test
from selenium import webdriver
capabilities = {
'xwalkOptions': {
'androidPackage': 'YOUR_PACKAGE_NAME',
'androidActivity': '.YOUR_ACTIVITY_NAME',
'adb-port': 5037(default option if not selected),
}
}
driver = webdriver.Remote('http://**.**.**.**:9515', capabilities)
"""
Your regular python-webdriver code.
"""
driver.quit()
在这里我没有过多的分享,是因为本身 crosswalk 这块我也只是集成到了项目框架里,没有过多去研究它,其次如果你熟悉 webdriver,其实也没有太多学习的成本,如果你的 app 有多个 webview,自己 window handle 切换下,如果要做 native 操作,和 uiautomator 结合下,效果也不错。