Macaca Macaca 踩坑一 (可能有续集)

CNO · 2016年11月11日 · 4507 次阅读

​ ​本人不是专业干测试的,只是一只小小的前端弱鸡,前一阵子领导让人研究一下 “UI 自动化”,这是我第一次听到这个名词,但是掉了 “测试” 两个字,我踏马半天不知道是干啥的。

​ ​百度一下才知道是自动化测试,整个 UI 自动化,这样没次版本发布,都不需要人工去回归了,跑一套脚本就 OK,怠惰势力登场。

​ ​我要找的是同时支持 iOS 和 Andorid 的,最开始接触了 Appium,网上都说好,好是好可惜我生错了年代,升级了 XCode8,只用过 iOS10 的我兴冲冲地去安装 Appium,npm 安装时各种失败,下了客户端不会用,文档还时英文的,又花了几天折腾 npm 安装,安装好了测试例子跑了几下挂了。于是在 GitHub 上用机翻的英文问作者,大神说没有了 UIAutomation,对 iOS10 支持不好。于是我就放弃了,在 TesterHome 上遇到了 Macaca,虽然 Macaca 的官网也和我一样崇洋媚外用了英文(一个中文都没有的那种),但是别人的网站的外观甩了 Appium 几条街,还贴心地配上了短小的演示视频,格外适合我这种天真的小白。

​ ​然后我就和 Appium 说拜拜,安装了 Macaca,命令一敲,碰上 WebView 就挂(我要测试就是挂载在 WebView 上的 Hybrid 页面),给作者提 bug,大神甩了我一条链接(我估计他都没看我描述的问题,我写的那么幸苦那么认真),进去没有我的问题,徐大就让你升级 ios-webkit-debug-proxy。试了很久都没有解决,只好自己动手,下面说说坑一。

坑一:ios-webkit-debug-proxy 和 Macaca 谁更厉害?

ios-webkit-debug-proxy 隶属的组织是 Google,Google 说:我永远是你们的大爷。所以他就给所有的 Simulator 的 deviceId 都用个"Simulator",因此当我启动模拟器,在命令行输入:
ios_webkit_debug_proxy
​ ​然后访问 localhost:9221/json ,你看到的都是这个模拟器设备数组:

[{ 
"deviceId": "SIMULATOR", 
"deviceName": "SIMULATOR",
"url": "localhost:9222"
}]

​ ​当你连上真机,待遇马上就不一样了:

[{
   "deviceId": "SIMULATOR",
   "deviceName": "SIMULATOR",
   "url": "localhost:9222"
},{
   "deviceId": "a11a05063f40bf7a730800045e7dbd1c76ea5121",
   "deviceName": "不好用的iPhone",
   "url": "localhost:9223"
}]

​ ​ios_webkit_debug_proxy 明显长着资本家丑恶的嘴脸,这些模拟器我都不承认你是有 deviceId 的 iPhone,不管你是跑着疯 5 疯 7 的模拟器,我都叫你模拟器。而 Macaca 比较耿直,从不把模拟器当模拟器看,就像老板从来不把员工当人看,就用编号给你起了个名字,所以就有 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX 这么长的编号。
当我们要从 Native 切换到 WebView 时,呵呵,你的脚本就挂了:

>>     #4 should display webview (8584ms)
ios_webkit_debug_proxy path: /usr/local/bin/ios_webkit_debug_proxy
  Error: Device: D9C8ACB9-0A5E-42A2-92AA-A52243429AAD does not exist.
      at request.get.then.then.devices (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/remote-debugger/lib/remote-debugger.js:39:17)
      at tryCatcher (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/util.js:26:23)
      at Promise._settlePromiseFromHandler (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/promise.js:510:31)
      at Promise._settlePromiseAt (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/promise.js:584:18)
      at Promise._settlePromises (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/promise.js:700:14)
      at Async._drainQueue (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/async.js:123:16)
      at Async._drainQueues (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/async.js:133:10)
      at Immediate.Async.drainQueues (/Users/Cononico/.nvm/versions/node/v6.9.1/lib/node_modules/macaca-ios/node_modules/bluebird/js/main/async.js:15:14)
      at runCallback (timers.js:637:20)
      at tryOnImmediate (timers.js:610:5)
      at processImmediate [as _immediateCallback] (timers.js:582:5)
>>

​ ​ios_webkit_debug_proxy 非要叫它模拟器,Macaca 非要叫编号,倒霉的就我这样的无辜群众。不管谁对谁错,反正没人解决我的问题,最后只好自己动手改改代码了,在全局安装的 Macaca-ios 中加点佐料,路径大概是
xxxxxx/macaca-ios/node_modules/remote-debugger/lib/remote-debugger.js
第 34 行加上:

if(devices[0].deviceId === 'SIMULATOR') {
    devices[0].deviceId = this.deviceId;
}

​ ​管你那多,我只有一个模拟器(神特么老板给你搞十几台 iPhone 让你个傻屌测试),这样也就够用了。

坑二:论官方实例的严肃性。
Macaca 官方的例子多久没更新了,小看即可,懂怎么写脚本就行了,不要抄他的例子,因为例子也会挂。最后 Macaca-wd 的文档有点简陋:贴出方法名,用四五个单词解释,最后甩出一个链接直接去看 WebDriver 的解释了,看不懂就是你的水平问题了,另外 WebDriver 根本就不会教你怎么用这个方法。总而言之,都是你的问题,谁让你弱鸡去哪都被踩。

坑三:理想与现实:
理想的是你跑作者的例子,而实际到了我司,情况大不一样。作为一个正规渠道发布的 APP,当你第一次打开,会提醒你允许本 APP 联网吗,要本 APP 推送消息吗,你得用脚本去同意;然后就是每个 APP 都要的,进去后的滑动页面,展示这个 APP 如何牛逼如何有优势,你得用脚本一个个划过去;好不容易进了 APP,迎面而来就是双十一的活动弹框,没错,你还是得用脚本去关......到这里你就会发现进入你要测试的地方比你的测试代码写的还多。

小结:
Macaca 是我用过最好用的 UI 自动化工具(虽然我只用过两个),支持 PC,iOS,Android,用起来也是一颗 Promise 一股脑走下去。如果你想一次性测试多个平台,可以写分别几个不同平台的测试用例,使用 Generator 函数 next() 下去。
重要:作者别打我!!!!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 15 条回复 时间 点赞

哈哈,强势围观

哈哈, 打赏二维码在哪, 我要打赏.

同在踩坑,楼主要一直写下去哦

CNO #11 · 2016年11月12日 Author

#4 楼 @shenle 😂 看还有没有掉进坑里

CNO #10 · 2016年11月12日 Author

#3 楼 @Lihuazhang 别打我,我只是说说我的感受,我写的地方还是很多赞美的😂

CNO #9 · 2016年11月12日 Author

#2 楼 @seveniruby 娱乐大众,不求回报

哈哈,不打你啊。

ios_webkit_debug_proxy 这里的实现的确有问题,已修复,请升级 iOS 驱动。原因是之前统一 Android 端 udid 参数改动导致的,改动点见issue,另外模拟器和真机原理差别比较多,分开处理也是正常的,就不要诟病 google 的实现了。

官方示例一定没问题的。每个流程都有配置travis-ci,排查本地环境时可以与 CI 上的 log 做个对比。

@Cononico 你这边遇到的问题被我搞混淆了,因为最近频发的 webview 问题都是 lockdown 中.操作权限导致的,需要升级 libimobiledevice 库。移动端的环境准备是要复杂一些,可以用个脚本统一处理弹窗,前端开发也是需要多了解测试的基础实践的。欢迎继续吐槽,更欢迎持续性的高质量问题,路漫漫,加油!

CNO #12 · 2016年11月14日 Author

#11 楼 @xdf 感谢!!!

吃了英文不好的亏,唉,走国际路线的 macaca 确实需要点详细的中文例子说明,以便新手上路

匿名 · #15 · 2018年11月22日
仅楼主可见
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册