目前所负责的产品已经正式上线,功能也越来越多,为提高后续测试的效率,提前准备起ios ui自动化的框架,待产品UI稳定后,可以直接进行用例的填充。在网上查看资料,越来越多的人使用appium做移动端的UI自动化,同时组内已经使用appium搭建了Android端的自动化,因此也采用此工具搭建iOS的UI自动化框架。
但在搭建过程中遇到了各种各样的问题,搜索网上资料几乎前篇一律,按照提供的步骤,环境几乎是搭建不起来的。所以记录我的搭建经历,分享给同样会遇到相同问题的同学们。
一、系统要求:
- Mac OS X 10.7 或者更高,推荐最新系统
- XCode >= 4.6.3,推荐最新系统
- Apple Developer Tools (iPhone simulator SDK, command line tools)
---插曲:
我的MAC系统版本为10.10.3,按照以往的使用习惯,安装软件都是安装最新的,于是我就下载了最新版本的XCode7,话费了将近半小时下载安装好XCode7后,打开的时候傻眼了,提示我当前系统版本过低,如下图:
因此,提醒大家在安装XCode7的时候,一定要注意当前OS X的版本是否>=10.10.5。由于受限与系统版本,我安装的是XCode6. (XCode下载地址: http://pan.baidu.com/s/1gdtw44z
)
二、搭建Appium环境:
在mac下搭建Appium环境有两种方式:
1.
使用terminal命令行的方式安装;
2. 使用Appium gui,直接下载appium.dmg运行即可;
下面详细介绍两种方式:
使用terminal命令行的方式安装:
1. 使用该方式安装的前提先安装brew和node,检查是否安装的方法:
$ brew -v
Homebrew 0.9.5 (git revision cd4952; last commit 2015-11-12)
$ node -v
v5.0.0
如果输入上述命令后,如果没有出现版本信息,说明机器上未安装brew或node。
安装brew的方法:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装node的方法:
方式一:
方式二:
git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install
2. 安装appium
需要使用非root账号安装appium:
如果使用了root安装了appium,需要先卸载再使用非root账号重装:
$ sudo npm uninstall appium -g //卸载appium
$ sudo chmod -R 777 /usr/local //给予非root用户权限
$ npm install -g appium //重新安装
3. 安装appium client
两种方式安装:
a. npm install wd:较老的安装方式
b. 到git里面下载client,比如安装python-client:
git clone git@github.com:appium/python-client.git
cd python-client
python setup.py install
4. 检查appium的依赖是否全部安装
我们当前是在mac上安装,最后一个错误不用管。
5. 启动appium
a. 启动模拟器测试:
$ appium
info
:
Welcome
to
Appium
v1
.
4.13
(
REV c75d8adcb66a75818a542fe1891a34260c21f76a
)
info
:
Appium
REST http
interface
listener started on
0.0
.
0.0
:
4723
info
:
Console
LogLevel
:
debug
b. 连接真机测试:
连接真机,启动是需要带参数-U 为真机的UDID,--app为需要运行的app的boundleID
$ appium
-
U xxxxxxxxxxxxxxxxxxx
--
app xxxxxxxxxxxx
info
:
Welcome
to
Appium
v1
.
4.13
(
REV c75d8adcb66a75818a542fe1891a34260c21f76a
)
info
:
Appium
REST http
interface
listener started on
0.0
.
0.0
:
4723
info
:
[
debug
]
Non
-
default
server args
:
{
"app"
:
"com.netease.erciyuan"
,
"udid"
:
"49455326c3b73198d3091b11227d8a333ed9ce31"
}
info
:
Console
LogLevel
:
debug
使用Appium gui,直接下载appium.dmg运行即可
(appium.dmg下载地址: http://pan.baidu.com/s/1mgCjojI
);
下载好.dmg文件,双击该文件进行安装。
a. 配置service ip和port:
b. 启动模拟器测试,需要配置如下几项:
其中App Path为build以后的.app文件路径。
配置完成后点击Launch,即可启动appium服务。
--注意:
1. 此处选择的Force Device和Platform Version要与.app在XCode中编译时使用的一致;
2. .app要从该位置取../Build/Products/Debug-iPhonessimulator,如果从Debug-iPhones取,在inspector中启动应用会不停的闪退。
BundleID:手机连接到MAC上,到Xcode里面的Window->Devices->Installed Apps的Identifier中查看;
UDID:手机连接到MAC上,
到Xcode里面的Window->Devices->Devices Information的Identifier中查看;
三、运行Appium自带的测试app:
下载appium的测试例子:
git clone https://github.com/appium/sample-code
1. 使用terminal命令行形式运行例子
a. 按照第二步中的方式启动appium;
b. 输入下面的命令编译生成示例程序:
cd
sample-code/sample-code/apps/TestApp
xcodebuild -sdk iphonesimulator
目录下通过如下命令编译生成示例程序:xcodebuild -sdk iphonesimulator 当看到**BUILD SUCCEEDED**则说明编译成功。
这行命令在TestApp项目底下创建了一个build/Release-iphonesimulator目录,并且声称一个可以透过Appium服务器交流的.app封装包,该包为appium gui中App Path的路径。
c. 运行例子:
cd sample-code/sample-code/examples/python
python
ios_simple.py
运行以上命令,出现下图说明正常。
2. 使用Appium Inspector运行用例
按照第二步中的方式配置appium,点击Launch,等待启动完成:
点击左侧的inspector图标“放大镜”,运行启动后,出现下图说明正常。
左下角的界面可以寻找当前界面的元素位置。
四、如何在Eclipse+TestNG框架下编写并运行脚本:
该部分介绍如何在Eclipse工具搭配TestNG框架下如何编写并运行测试脚本。
1. 在Eclipse中创建工程: '
File'->'New'->'Java Project,输入工程名字,点击next,点击“Finish”。
2. 在工程的src上右键->'New'->'Class',输入Package和Name,点击“Finish”。
创建后的工程如下图:
3. 添加必要的jar包
下载Selenium Standalone Server/Selenium Client &WebDriver Language Bindings
: http://docs.seleniumhq.org/download/
安装TestNG:
在线安装方式:
Help -> install new software -> 输入 http://beust.com/eclipse/
离线安装方式:
资源分享链接:http://pan.baidu.com/s/1bnsb3aB
(1)解压eclipse-testng离线包.zip
(2)将【eclipse-testng离线包/feature】中的文件夹org.testng.eclipse_6.8.6.20130607_0745复制到【MyEclipse安装目录/features】目录下
(3)将【eclipse-testng离线包/org.testng.eclipse_6.8.6.20130607_0745】文件夹复制到【MyEclipse安装目录/plugins】目录下
(4)重启MyEclipse,Windows - show view - TestNG
在工程上右键->Properties->Java Build Path->Libraries->Add External JARs,将下载的selenium jar导入进来,
Add Library,将TestNG添加进来,如下图:
运行的脚本内容如下,在运行脚本上右键->run as->TestNG test,就会出现步骤三中的运行界面。
package com.test.firstest;
import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.concurrent.TimeUnit;
import junit.*;
import junit.framework.TestCase;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class FirstTestCases {
public WebDriver wd = null;
@BeforeMethod
public void setUp() throws Exception {
// set up appium
File appDir = new File("/Users/netease/gacha/ios_automation/sample-code/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator");
File app = new File(appDir, "TestApp.app");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "iPhone 5s");
capabilities.setCapability("platformName", "iOS");
capabilities.setCapability("platformVersion", "8.4");
capabilities.setCapability("bundleid", "xxxx");//run on real device
capabilities.setCapability("app", app.getAbsolutePath());
wd = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),
capabilities);
wd.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
System.out.println("App launched");
}
@AfterMethod
public void tearDown() throws Exception {
wd.quit();
}
@Test
public void testCases() throws InterruptedException {
String myname = "Smriti";
wd.findElement(By.name("Add")).click();
wd.findElement(By.xpath("//textfield[1]")).sendKeys(myname);
wd.findElement(By.name("Save")).click();
Thread.sleep(5000);
// write all your tests here
wd.close();
}
}