xcode8升级后基于XCUITest进行自动化测试的踩坑之旅

自从xcode8与ios10发布之后,使用appium做ios自动化测试的就苦逼了。appium团队在连续发布1.6的三个beat版本试用之后总是有这样那样的问题,不过还是怀着一颗兴奋的心情迫不及待的投入试用过程中,试用过程如下:

首先需要强调的是,由于这个还是beta版本,很多东西都需要源码进行,所以重要的事情强调三遍:安装新版appium请翻墙!安装新版appium请翻墙!安装新版appium请翻墙!

appium 1.6的npm安装

1
npm install -g appium@beta
  • 安装新版appium首先需要将本地的老版本appium删除
  • 新版appium安装需要依赖的node版本需要是最新版的(我也不知道为什么,网上也没有找到原因,但是升级了最新的node后安装就莫名其妙的搞定了)
    我本地的版本如下所示:
    1
    2
    3
    4
    ~ npm --version
    3.10.8
    ~ node --version
    v7.0.0

appium1.6的底层依赖

appium1.6会用到webdriverAgent,按照如下链接安装
WebDriverAgent

修改所依赖的jar包

实际在跑case的时候,总会遇到各种各样的报错,当时着急找方案解决,忘记记录下报错信息了,尴尬ing。。。
总结起来appium升级后对于本地的影响最大的还是做依赖的jar包版本,特别是基于某些内部的框架进行编写时,需要修改的jar包主要是selenium相关的各种jar包,具体修改的jar包与版本如下:

1
2
3
4
5
6
7
8
9
10
-rw-r--r-- 1 didi staff 94973 11 28 19:03 selenium-api-3.0.1.jar
-rw-r--r-- 1 didi staff 9567 11 28 19:05 selenium-chrome-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 4907 11 28 19:06 selenium-edge-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 764941 11 28 19:07 selenium-firefox-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 9816 11 28 19:07 selenium-ie-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 379 11 28 19:08 selenium-java-3.0.1.jar
-rw-r--r-- 1 didi staff 7829 11 28 19:08 selenium-opera-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 310403 11 28 19:10 selenium-remote-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 37999 11 28 19:11 selenium-safari-driver-3.0.1.jar
-rw-r--r-- 1 didi staff 170335 11 28 19:12 selenium-support-3.0.1.jar

PS:如何下载以及导入jar包,自行搜索

对脚本影响最大的就是基于xpath识别的控件

xcode8对于自动化测试底层支持已经由以前的UIautomation全面换成xcuitest了,所以之前我们大家所熟识的xpath已经不能再用了。
暂时appium没有发布想对应的GUI程序,所以暂时的xpath识别可以使用阿里的macaca的inspector。链接如下:
Macaca macaca app-inspector 安装使用记

macaca不可用

你在mac上使用macaca时,会遇到一个无敌巨坑,这个解决稍微麻烦些,后续我会讲解。万一你遇到这种情况了,但是又着急使用有没有其他获取方式呢,只能不幸的告诉你,手动打印,肉眼看吧。。。。
当加载出你需要获取xpath的控件界面时,使用如下代码打印界面:

1
2
3
4
FileOutputStream fs = new FileOutputStream(new File("/Users/sxl/Desktop/first.xml"));
PrintStream p = new PrintStream(fs);
p.println(driver.getPageSource());
p.close();

跑起来后你会在相应的位置得到一个界面的xml文件,使用浏览器打开,你看看到大致如下的一个xml文件:

1
2
3
4
5
6
7
8
9
<XCUIElementTypeOther name="" label="" value="" dom="" enabled="true" valid="true" visible="false" hint="" path="/0/2/0/0/0/0/0" x="0" y="0" width="375" height="667">
<XCUIElementTypeOther name="视频" label="视频" value="" dom="" enabled="true" valid="true" visible="false" hint="" path="/0/2/0/0/0/0/0/0" x="0" y="0" width="375" height="667"></XCUIElementTypeOther>
<XCUIElementTypeOther name="" label="" value="" dom="" enabled="true" valid="true" visible="false" hint="" path="/0/2/0/0/0/0/0/1" x="0" y="0" width="375" height="667"></XCUIElementTypeOther>
</XCUIElementTypeOther>
<XCUIElementTypeOther name="" label="" value="" dom="" enabled="true" valid="true" visible="false" hint="" path="/0/2/0/0/0/0/1" x="0" y="0" width="375" height="667"></XCUIElementTypeOther>
</XCUIElementTypeOther>
</XCUIElementTypeOther>
<XCUIElementTypeStaticText name="因 为 在 意 所 以 用 心" label="因 为 在 意 所 以 用 心" value="因 为 在 意 所 以 用 心" dom="" enabled="true" valid="true" visible="true" hint="" path="/0/2/0/0/1" x="0" y="0" width="375" height="667"></XCUIElementTypeStaticText>
<XCUIElementTypeButton name="立即启程" label="立即启程" value="" dom="" enabled="true" valid="true" visible="true" hint="" path="/0/2/0/0/2" x="82" y="557" width="211" height="50"></XCUIElementTypeButton>

可以根据xml文件中的层级关系编写“立即启程”按钮的xpath路径如下:

1
XCUIElementTypeApplication[1]XCUIElementTypeWindow[3]XCUIElementTypeOther[1]XCUIElementTypeOther[1]XCUIElementTypeButton[3]

其他的点击等事件与之前封装的方法一致.

后续补充

完成了上面的操作,那么我们就可以开始愉快的编写用例了,然后年会偶然一天跑了下之前写的测试用例,第一步就被block住了。。。打开一看是开机动画变成了滑动界面了,真是欲哭无泪,这也就表明了基于UI的自动化测试固然方便,但是后续的维护成本真的很高啊。。。
想实现滑动其实也很简单,新版的appium还是可以继续支持touchAction方法的,所以我们可以直接使用已经封装好的swipe方法,实例如下:

1
2
3
4
5
6
7
int[] arr = { 1, 2, 3, 4 };
for (int i : arr){
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
driver.swipe(width * 7 / 8, 100, -1* width * 3 / 4, 0, 1000);
sleep(3);
}

需要注意的是swipe方法的五个参数,一次代表起始点x、y坐标,相对于起点坐标的偏移量x、y和滑动时间,单位毫秒。如果想滑的快,就把时间设置小,反之。