关于 iOS 的自动化可用的框架不是很多,黑盒的更少,不过好在还是可以搞的,除了苹果自动的 UIAutomation,另外一个新出的测试框架就是 WebDriverAgent(由鼎鼎大名的 Facebook 出品)。目前只开放出来了 HTTP 的请求协议,Client 库的代码都需要自己实现,但这难不倒我们。
经过一段时间的努力,纯 python 版的 WDA 库就被我们写出来了。
目前项目的地址 https://github.com/openatx/facebook-wda
Balabala 这么久,可能更多的人还是更关心怎么使用吧。道路稍微有点艰辛,不过比 Appium 的 iOS 自动化要简单的多。
可能还是有人会问 ATX 跟 Appium 到底什么关系,我负责任的说,没有任何关系,这是两个不同的测试框架,ATX 是用 Python 写的,而 Appium 主要是 Nodejs 写的。当然区别不止这么点。
那 ATX 比 Appium 优秀在哪里呢?
你一定需要一台 mac,因为还需要 xcode,最好不要用黑苹果,比起解决黑苹果遇到的问题所花的时间,你还不如直接弄台 mac 呢。
WDA 支持模拟器和真机,你若是能把真机的安装搞定了,模拟器肯定也是没问题的。
iPhone 手机不需要越狱,所以用自己的手机就可以。
Mac 上的软件最好全部用 brew 安装,省心省力。
请根据 https://github.com/facebook/WebDriverAgent 上的描述,将 WebDriverAgent 安装到手机上,直到发现手机上多了一个名叫 WebDriverAgent 的 App,就说明安装成功了。熟话说一张图片胜千言,如果是一张 gif 图,是不是就天下无敌了。WDA 的启动方式参考我的截图
命令行的话可以用这个命令
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=$(idevice_id -l)" test
$(idevice_id -l)
是为了方便获取连接手机的 UDID 的一种简写
随后打开 127.0.0.1:8100/inspector 这个地址,就可以看到一个酷炫的界面(我来截个图)
左边屏幕图像,右边具体的元素信息,所有这些东西都是我们写脚本的时候需要用到的。
下面需要安装 python 库 atx,还有一些额外的依赖需要安装在 mac 上,直接参考 github 上的指引比较好一些。指引我也是花了不少时间去写的。
https://github.com/codeskyblue/AutomatorX
最后要说的是输入法,测试之前需要将输入法却换到系统默认的英文输入法。某狗输入法是不可以的。
一切就绪后我们就可以开始写脚本了
首先要知道应用的 bundle_id,如果不知道,可以使用命令 ideviceinstaller -l 获取所有已安装的应用,进而把应用的 bundle_id 查出来。
com.netease.cloudmusic, "464", "网易云音乐"
脚本其实很好写,来段很简单的代码,用来测试下 WDA 是否正常工作了
# coding: utf-8
import atx
d = atx.connect('http://localhost:8100', 'com.netease.cloudmusic')
print d.status()
这里我们把 DEVICE_URL 写成了 localhost:8100,如果是真机的话,需要根据实际情况改成对应的手机 IP 和 Port。
下面我们使用脚本来完成一个 账户登录登出的例子,将其具体化成以下几步
相应的代码
1 import atx
2 d = atx.connect('http://localhost:8100', platform='ios')
3 d.start_app('com.netease.cloudmusic')
4 d(text=u'网易邮箱').click()
5 d(xpath=u"//TextField").set_text("someone@163.com\n")
6 d(xpath=u"//SecureTextField").set_text("password")
7 d(text=u'登录').click()
8 d(text=u'帐 号').click()
9 d(text=u'退出登录').scroll().click()
10 d(text=u'确定').click()
有几行需要特殊说明下
因为 ATX 集成了测试报告,所以生成响应的测试报告也很简单
在第 3 行代码之后加入以下代码
from atx.ext.report import Report
rp = Report(d)
rp.patch_wda()
再次运行一遍代码,在当前目录下就可以看到一个 report 目录,里面有一个 index.html,用浏览器打开,效果如下,这里为了方便说明,只截了几个图(实际的报告也比这个详细点)
到这里,介绍就结束了。如果你真的打算做自动化,可能还需要看更多的资料,不要担心,不要害怕,虽然成功的道路有一些坎坷,但成功的喜悦也难以忘怀。
Author: hzsunshx 2016-08-10
命令执行的速度如何?Appium 在 iOS 上执行速度太慢,正好想换个框架试试
#2 楼 @codeskyblue 那我果断换一个用起来啊
这必须顶啊,哈哈
关注量有点低呀,是我的错觉吗?
厉害!
可以测试第三方应用,能说下吗?
atx 可以多生产一些文章。testerhome 欢迎优秀的开源框架
#11 楼 @Lihuazhang 渐渐的会多起来的,是不是可以帮忙开个专题?
自己的 app 是需要开发者签名的嘛通过 xpath 去定为元素的嘛?三方的 app 是通过图像识别去定为元素的嘛?
#14 楼 @codeskyblue iOS 的也可以嘛?你知道原理嘛,我只知道 appium 是可以得到 source 然后通过 xpath 定位的,三方非开发者签名的是怎么做到的呢?
不错的样子,支持~
支持这样的开源项目
#17 楼 @davidyang 快去 star
@codeskyblue 非常赞
https://github.com/facebook/WebDriverAgent xcode 中 build failed 瞬间就不想玩了
#22 楼 @zuiniao123 有点耐心,这已经是最简单的了,折腾别的更难
学习了
#22 楼 @zuiniao123 codeskyblue 说的对,这个已经很容易了,要慢慢跨坑,相信你一定可以的
请问,在真机上跑的速度也很快吗???
#26 楼 @tingting823 反正比 appium 快很多
小白一枚,没太理解笔者所说的 ATX 和 wda 的关系~求指教
支持 Hybird app 吗?
赞~~~··
赞👍,非常感谢你们!
哈哈,又来了一个新用户
安装时报错:ImportError: No module named cv2,用 pip 手动安装也报错 pip install opencv2
build failed,
瞬间懵逼,没找到文件。。。。
#35 楼 @amber_cheng 看安装说明,opencv 专门写了怎么安装的
#36 楼 @466895041 这个需要耐心,不耐心搞不定的
#38 楼 @codeskyblue 想不通为什么下载后,没有文件。。
#36 楼 @466895041 这个错误我也有的 你要现在 wda 的工程文件夹里执行一下终端命令./Scripts/bootstrap.sh
@codeskyblue 请问一下,你是怎么在 IOS 的模拟器上安装网易云音乐的?
是一定要.app 包吗?还是你用.ipk 包在模拟器上安装成功的。
#41 楼 @issac2015 模拟器上只能用 app 包,没有别的办法
嗯,好的。谢谢你了
楼主@codeskyblue ,我再求教一下:
有没有其他的方法在 iphone 上安装 WebDriverAgent APP? 我看 ATX 对 WebDriverAgent 的依赖主要是在 iphone 中安装好 WebDriverAgent APP。
由于我没有 IOS 的开发者账号,所以无法用 WebDriverAgent 运行真机。
没有的话,我自己再想其他的办法。谢谢
#44 楼 @issac2015 剁手买一个呀
麻烦问一下,WDA 编译成功后手机访问本地http://localhost:8100/inspectormac 电脑通过手机 ip 访问手机一直无法连接,大神有遇到这种问题么~可以成功显示,但用
ios 真机 遇到以下问题 另外安装 wda 可以修改 build id 进行无证书签名吗?
请问 wda 必须要 99 美元买的证书运行才行吗?
请问 wda 必须要 99 美元买的证书运行才行吗?
请问 wda 必须要 99 美元买的证书运行才行吗?
#50 楼 @xiaobai_haha 竟然发这么多遍,是的必须签名。淘宝上也有便宜的 15 块钱的证书可以买
ATX 支持坐标点击吗?
s.tap(200, 200)
看到这个方法。。
#53 楼 @codeskyblue 但是 XCUITest API 里面好像不支持坐标点击,那么封装 XC 的 WDA 应该也做不到坐标点击,ATX 是如何办到的?还是我哪里理解的不对,请指教
前些时间调通了 macaca 的真机测试,现在感觉 ATX 也是个好东西啊~
#57 楼 @codeskyblue 跟 OC 关系不大,macaca 我也是折腾了很久,论坛有个 xdf 的,看看他发的几个帖子,里面有填坑记
已收藏,回头研究
真机 ios9 可以跑通 但是同样换到 ios10 编译 wda 时 老是报这个错误 :
2016-12-29 20:07:23.862204 XCTRunner[1195:363094] Running tests...
2016-12-29 20:07:24.716526 XCTRunner[1195:363094] Continuing to run tests in the background with task ID 1
Test Suite 'All tests' started at 2016-12-29 20:07:25.505
Test Suite 'WebDriverAgentRunner.xctest' started at 2016-12-29 20:07:25.506
Test Suite 'UITestingUITests' started at 2016-12-29 20:07:25.506
Test Case '-[UITestingUITests testRunner]' started.
t = 0.00s Start Test at 2016-12-29 20:07:25.509
t = 0.00s Set Up
2016-12-29 20:07:25.512319 XCTRunner[1195:363166] [User Defaults] Failed to write value for key AutomationDisableFauxCollectionCells in CFPrefsPlistSource<0x1740f6980> (Domain: com.apple.Accessibility, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access, switching to read-only
2016-12-29 20:07:25.513151 XCTRunner[1195:363094] Built at Dec 27 2016 18:03:35
2016-12-29 20:07:25.533965 XCTRunner[1195:363094] ServerURLHere->http://10.2.215.58:8100<-ServerURLHere
2016-12-29 20:07:25.534737 XCTRunner[1195:363094] Listening on USB
大神好,我在真机上,启动后,提示 listening on usb,但是通过 IP+ 端口访问不了,有知道怎么回事的吗?
#61 楼 @y693055797 这个貌似很正常的样子
#62 楼 @lrw3716740 IP+ 端口国产的机器都不行了,配合 iproxy 一起用,才好使
#64 楼 @codeskyblue 谢谢,我试下,我用的是 iphone 6 真机。
#65 楼 @lrw3716740 这个文章稍微有点老了,因为 iOS 不断更新的缘故,所以以前的文章可以会有一些问题。这个在 ATX 的项目的 wiki 里面,大部分都可以找到解答
请问我用这个框架最后生成测试报告时可以多条用例生成一个报告么,还有图片对比功能在测试脚本中应该如何启动该功能,这些在 wiki 中都没有提到,麻烦大神帮忙解答
#67 楼 @yundanfengqing007 图片对比,默认就有。多个报告的那个,还没写,你可以写个试试 提提 pr
其实不用 99 美元的开发者账号。个人免费的就行了,不过一周只能 10 部机子和 10 个证书。自动签名证书和改下工程目录的 bundleid 就行了
有木有遇到过运行一切正常,但是访问 xcode 控制台打印的地址一直失败(http://192.168.31.163:8100/inspector)
2017-11-27 14:37:41.146108+0800 WebDriverAgentRunner-Runner[4509:2030279] ServerURLHere->http://192.168.31.163:8100<-ServerURLHere
@yundanfengqing007 关于输出多个报告的 可以使用 from Lib import HTMLTestRunner 输出报告
问个问题哈,运行 case 的同时是不是要在后台持续运行 webdriveragent?
atx 是否会像 appium 一样去自动检测 webdriveragent 是否运行?
from atx.ext.report import Report,ios 自动化运行的时候,调不到 display 方法. 'Session' object has no attribute 'display'
不是很明白,是写死尺寸吗 ? return namedtuple('Size', ['width', 'height'])(414, 736) ?
我浏览器访问 127.0.0.1:8100/status 时正常,但是访问 127.0.0.1:8100/inspector 就失败了,大佬们知道什么原因么?