千里之行
始于足下

绘枫和畅

千里之行,始于足下

Tues.

金曜日

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

29CF7047A45F0163E1F59D2D8C610454.png

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

42586336afc379319fee3cade3c4b74541a911dc.jpg


我要找的是同时支持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(不管什么bug,你都给老子升级ios-webkit-debug-proxy,劳资的Macaca才没有bug)。试了很久都没有解决,只好自己动手,下面说说坑一。


坑一: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行加上:

2D645B7A-1EE2-4FFB-B30A-FFEFCA2C0B76.png

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


坑二:论官方实例的严肃性。

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


坑三:理想与现实:

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


小结:

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

Master之令咒:

带我飞

©2016-2018 Powerd by Alchemy's Spruche 鄂ICP备14020745号