前段时间由于所在项目需要对移动设备进行测试,所以就有了去研究针对移动设备自动化测试工具想法。通过对目前比较主流的第三方的测试框架进行搜索发现,现在最主流的测试框架无外乎Appium 和 WebDriverAgent。最终选择了后者作为我们的测试框架,具体原因如下:
1.同时支持模拟器和真机。
2.实现了大部分的WebDriver spec。
3.支持USB,设备不需要联网。
4.提供了Inspector,有了这个就可以方便的找到界面上的元素。
5.和Xcode协同工作,让测试用例的编写和执行更为方便。
6.可以轻松的实现模拟用户使用流程。
7.支持原生和非原生App。
较之Appium而言,WebDriverAgent最大的短板是只支持IOS,不支持Android设备的测试。但Appium对跨平台的支持的问题多也是众所周知的, 谁用谁知道^_^。
上面说了这么多,下面就让我们说说怎么搭建测试环境。由于我们使用Xcode来启动webDriverAgent,所以以下准备工作必不可少。
1.下载Xcode ,最好是8.0以上的。
2.下载webDriverAgent 到本地。
3.下载Jwda,这里面有一些比较common的action在里面。
4.下载安装FBSimulatorControl,这个不是必须但是建议下载,因为后面会用到。
用Xcode打开webDriverAgent. 找到WebDriverAgentRunner->UITestingUITests.m,运行testRunner,然后就可以看到如下图1所示内容,simulator启动成功。
同时在上图1里面可以看到ServerURL信息,通过这个URL加上一些Status或者Inspector信息,我们就能很直观的看到一些simulator上的元素以及状态信息。
http://10.205.21.123:8100/status /*查看状态信息*/
http://10.205.21.123:8100/Inspector /*查看Inspector*/
接下来用Intellij或者Eclipse打开Jwda工程(以下是以Instllij为例)。在DeviceConfig文件中可以看到待测试设备的信息,以及一些配置信息。也包括上面提到的FBSimulatorControl的信息,如果没有安装编译时会报错。接下来按如下步骤操作
1.在pom.xml 中添加下面的cucumber依赖.
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>1.2.3</version>
</dependency>
待新的依赖加载完成后,在Java下面创建文件夹
1.common存放一些通用的类文件,例如执行文件。
2.stepDefinations 顾名思义,主要是存放一些定义的一些执行步骤。
packagestepDefinations;
importcom.google.gson.JsonObject;
importcommon.JWda;
importcucumber.api.java.Before;
importcucumber.api.java.en.Given;
importorg.junit.After;
public class Demo {
public static JWda Instance;
@Before
public void stepInit(){
Instance = new JWda();
Instance.cleanKeychain("com.apple.mobilesafari");
Instance.openApp("7p","com.apple.mobilesafari");
}
@After
public void closeBrowser(){
// Instance.CloseBrowser();
}
@Given("Open baidu from safari")
public void Open_baidu_from_safari() throws Exception{
JsonObject objAddress1 = Instance.findElementsByXpath("//XCUIElementTypeOther[@label='Address']");
Instance.input(objAddress1.get("ELEMENT").getAsString(),"https://www.baidu.com");
JsonObject objAddress2 = Instance.findElementsByClass("XCUIElementTypeButton","Go");
Instance.tap(objAddress2.get("ELEMENT").getAsString());
}
3.feature 文件夹,用以存放测试用例。
图2所示的执行文件中,features是用来指定测试用例的存放位置信息;format用来配置打印测试报告格式及存储位置;glue告诉编译器执行步骤的存储路径。
至此,环境搭建工作就结束了,后面就是如何创建用例,我们将会在下一篇文章中讲解。各位看官可以通过链接下载我的Demo . 需要说明的几处修改:
1.运行之前需要根据本地文件存放路径对DeviceConfig文件中的信息进行修改。
2.通过fbsimctl list查询到各种不同型号的simulator的串码,例如
CNlyguo:phantomjs lyguo$ fbsimctl list
F443C728-3D0F-4253-B7B7-C73F316DEC98 | iPad Pro (12.9 inch) | Shutdown | iPad Pro (12.9-inch) | iOS 10.3 | x86_64
523BF692-3252-41F1-B956-BE9C391A0526 | iPad Air 2 | Shutdown | iPad Air 2 | iOS 10.3 | x86_64
24B252BC-6FB6-4A30-8E67-62B6DDDF9FD2 | iPhone 7 Plus | Booted | iPhone 7 Plus | iOS 10.3 | x86_64
在此对提供Jwda的小伙伴致以特别感谢。