ATX ATX 系列-如何测试网易云音乐 (iOS 篇)

codeskyblue · 2016年08月10日 · 最后由 codeskyblue 回复于 2019年10月13日 · 15447 次阅读
本帖已被设为精华帖!

名词简称

  • ATX:AutomatorX 简称,专门为手机自动化而生。
  • WDA: WebDriverAgent 的简称,是 Facebook 为苹果开发的一个自动化测试框架

前言

关于 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 优秀在哪里呢?

  1. ATX 依赖比较少,安装快,上手也快
  2. 可以测试第三方应用,比如微信,网易新闻之类
  3. 更新方便,可以使用 pip 直接更新应用
  4. 集成图像识别,可以解决仅靠 UI 无法定位识别的问题
  5. 集成测试报告
  6. 由知名企业网易的游戏测试开发团队开发(其实就是我们开发的),可以比 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. 打开网易云音乐
  2. 使用网易通行证帐号登录
  3. 输入用户名密码,确认登录
  4. 进入账户设置,跳转到退出登录按钮
  5. 点击退出登录,并点击确认按钮

相应的代码

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()

有几行需要特殊说明下

  • 第 5 行,本来应该是可以用 d(class_name="TextField") 来查找元素的,似乎 WDA 还在完善中,这种方法并不好使,只能用 xpath,set_text 后面多出来一个换行符是为了隐藏掉自动补全部分,防止其影响密码的输入
  • 第 8 行中的帐号中间需要有一个空格,不如会出现匹配不到的错误
  • 第 9 行多了一个 scroll() 它的功能是滑动屏幕是其按钮可见

测试过程报告

因为 ATX 集成了测试报告,所以生成响应的测试报告也很简单
在第 3 行代码之后加入以下代码

from atx.ext.report import Report
rp = Report(d)
rp.patch_wda()

再次运行一遍代码,在当前目录下就可以看到一个 report 目录,里面有一个 index.html,用浏览器打开,效果如下,这里为了方便说明,只截了几个图(实际的报告也比这个详细点)





到这里,介绍就结束了。如果你真的打算做自动化,可能还需要看更多的资料,不要担心,不要害怕,虽然成功的道路有一些坎坷,但成功的喜悦也难以忘怀。

相关项目

关于

Author: hzsunshx 2016-08-10

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

命令执行的速度如何?Appium 在 iOS 上执行速度太慢,正好想换个框架试试

#1 楼 @shljsh 快的飞起

#2 楼 @codeskyblue 那我果断换一个用起来啊

这必须顶啊,哈哈

关注量有点低呀,是我的错觉吗?

厉害!

可以测试第三方应用,能说下吗?

#7 楼 @testerwp 可以啊,我本来就不是测试网易云音乐的,只是拿它来介绍下工具的使用

#6 楼 @lihe1986 我还以为这个帖子再也没人关注了呢

恒温 将本帖设为了精华贴 08月19日 19:38

atx 可以多生产一些文章。testerhome 欢迎优秀的开源框架

#11 楼 @Lihuazhang 渐渐的会多起来的,是不是可以帮忙开个专题?

自己的 app 是需要开发者签名的嘛通过 xpath 去定为元素的嘛?三方的 app 是通过图像识别去定为元素的嘛?

#13 楼 @Jinggit 第三方 App 也可以 xpath

#14 楼 @codeskyblue iOS 的也可以嘛?你知道原理嘛,我只知道 appium 是可以得到 source 然后通过 xpath 定位的,三方非开发者签名的是怎么做到的呢?

不错的样子,支持~

支持这样的开源项目

#15 楼 @Jinggit 苹果的 XCTest 自己本来就支持的。苹果开放了两种测试框架,其中的 UIAutomation 并不支持

62楼 已删除

https://github.com/facebook/WebDriverAgent xcode 中 build failed 瞬间就不想玩了

#22 楼 @zuiniao123 有点耐心,这已经是最简单的了,折腾别的更难

学习了

#22 楼 @zuiniao123 codeskyblue 说的对,这个已经很容易了,要慢慢跨坑,相信你一定可以的

请问,在真机上跑的速度也很快吗???

#26 楼 @tingting823 反正比 appium 快很多

匿名 #54 · 2016年09月07日

小白一枚,没太理解笔者所说的 ATX 和 wda 的关系~求指教

支持 Hybird app 吗?

#29 楼 @heyyuyu 不支持,还没思路该怎么搞

#28 楼 @wowotou wda 是驱动层,atx 上层的封装

赞~~~··

赞👍,非常感谢你们!

哈哈,又来了一个新用户

安装时报错: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 剁手买一个呀

codeskyblue [该话题已被删除] 中提及了此贴 11月10日 00:08

ios 真机 遇到以下问题 另外安装 wda 可以修改 build id 进行无证书签名吗?

请问 wda 必须要 99 美元买的证书运行才行吗?
请问 wda 必须要 99 美元买的证书运行才行吗?
请问 wda 必须要 99 美元买的证书运行才行吗?

#50 楼 @xiaobai_haha 竟然发这么多遍,是的必须签名。淘宝上也有便宜的 15 块钱的证书可以买

ATX 支持坐标点击吗?

Simulate touch

s.tap(200, 200)
看到这个方法。。

#52 楼 @pieceone 就是这个

#53 楼 @codeskyblue 但是 XCUITest API 里面好像不支持坐标点击,那么封装 XC 的 WDA 应该也做不到坐标点击,ATX 是如何办到的?还是我哪里理解的不对,请指教
前些时间调通了 macaca 的真机测试,现在感觉 ATX 也是个好东西啊~

#54 楼 @pieceone 支持坐标点击呀,从 WDA 刚出来的时候就支持了

#54 楼 @pieceone 也是厉害,我搞了一天都没搞定 macaca 的真机测试,但是模拟器上倒是成功了

#54 楼 @pieceone 我 OC 不是很熟,希望有一天我也能看懂 XCUI Test

#57 楼 @codeskyblue 跟 OC 关系不大,macaca 我也是折腾了很久,论坛有个 xdf 的,看看他发的几个帖子,里面有填坑记

已收藏,回头研究

codeskyblue ATX 支持 iOS10 手机测试 方法说明 中提及了此贴 12月09日 10:13

真机 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

匿名 #20 · 2016年12月30日

大神好,我在真机上,启动后,提示 listening on usb,但是通过 IP+ 端口访问不了,有知道怎么回事的吗?

#61 楼 @y693055797 这个貌似很正常的样子

#62 楼 @lrw3716740 IP+ 端口国产的机器都不行了,配合 iproxy 一起用,才好使

匿名 #65 · 2017年01月03日

#64 楼 @codeskyblue 谢谢,我试下,我用的是 iphone 6 真机。

#65 楼 @lrw3716740 这个文章稍微有点老了,因为 iOS 不断更新的缘故,所以以前的文章可以会有一些问题。这个在 ATX 的项目的 wiki 里面,大部分都可以找到解答

请问我用这个框架最后生成测试报告时可以多条用例生成一个报告么,还有图片对比功能在测试脚本中应该如何启动该功能,这些在 wiki 中都没有提到,麻烦大神帮忙解答

#67 楼 @yundanfengqing007 图片对比,默认就有。多个报告的那个,还没写,你可以写个试试 提提 pr

其实不用 99 美元的开发者账号。个人免费的就行了,不过一周只能 10 部机子和 10 个证书。自动签名证书和改下工程目录的 bundleid 就行了

蓝畔湖光 回复

是的,我测试了下,确实个人证书就可以了。

codeskyblue ATX 资料快速索引 中提及了此贴 06月21日 19:39

有木有遇到过运行一切正常,但是访问 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'

回复

window_size

codeskyblue 回复

不是很明白,是写死尺寸吗 ? return namedtuple('Size', ['width', 'height'])(414, 736) ?

wolfgao 移动客户端 /UI 开源测试框架梳理和大比拼 中提及了此贴 02月27日 21:03
Aya 回复

我也遇到的这个问题,有解决办法么

我浏览器访问 127.0.0.1:8100/status 时正常,但是访问 127.0.0.1:8100/inspector 就失败了,大佬们知道什么原因么?

yunliu123 回复

试试 weditor

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册