ios界面自动化工具–Appium

ios界面自动化工具–Appium

Appium是一款开源的移动端自动化测试框架,支持Android和Ios,之前简单介绍过Appium,链接https://www.yeetrack.com/?p=639。最近在做ios的自动化测试,再详细记录一下过程。

安装Appium

既然使用Appium框架,安装肯定是必须的,两种方式源码安装,或者直接安装二进制dmg文件。

  • 源码方式
      git clone https://github.com/appium/appium
    

    下载完成后,执行sh reset.sh即可,它会将appium配置到我们电脑的环境变量中,直接使用Appium &启动即可。但是这种安装方式,我没有找到Appium Inspector这个界面分析工具。界面的自动化测试,如果少了这款工具,就比较纠结了。

  • 二进制直接安装app包Appium在 2014-10-20左右更新了1.3.1版本,对Xcode6和ios 8.1更友好了,建议下载此版本。下载地址:https://github.com/appium/appium/releases,下载安装完成后,在mac的应用程序里应该出现Appium的图标了。

安装Xcode

既然做ios的自动化测试,xcode最好还是安装,虽然可以通过命令行build编译、打包ios项目。安装Xcode,直接在Apple Store中搜索下载即可,Xcode 6.1版本。

样例工程

直接run Appium的样例工程是最快的上手方式,Appium提供了各种语言版本的样例工程,包括Android、Ios,语言有java、php、.net、js、perl、python、ruby。我一直用java,这里就已java语言为例。

  1. 下载代码: git clone https://github.com/appium/sample-code.git
  2. 安装maven,配置环境变量
  3. 修改样例工程中的配置sample-code/sample-code/examples/java/junit/src/test/java/com/saucelabs/appium/UICatalogTest.java
     @Before
     public void setUp() throws Exception {
         // set up appium
         File classpathRoot = new File(System.getProperty("user.dir"));
         File appDir = new File(classpathRoot, "../../../apps/UICatalog/build/Release-iphonesimulator");
         File app = new File(appDir, "UICatalog.app");
         DesiredCapabilities capabilities = new DesiredCapabilities();
         capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
         capabilities.setCapability("platformVersion", "7.1");
         capabilities.setCapability("platformName", "iOS");
         capabilities.setCapability("deviceName", "iPhone Simulator");
         capabilities.setCapability("app", app.getAbsolutePath());
         driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
         driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
     }
    

    如果用模拟器运行的话,应该不需要修改(前提是在命令行下build完了开发代码,xcodebuild);真机的话,需要修改成下面的样子:

     // set up appium
     //File classpathRoot = new File(System.getProperty("user.dir"));
     //File appDir = new File(classpathRoot, "../../../apps/UICatalog/build/Release-iphonesimulator");
     String appName = "5LDV***BF.com.yeetrack.ios.app";  //注意修改成自己的应用,这块可以在Xcode中查看,实际上就是Xcode中的Bundle identifier这个参数
     DesiredCapabilities capabilities = new DesiredCapabilities();
     capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
     capabilities.setCapability("platformVersion", "7.1.1");  //真机的ios版本
     capabilities.setCapability("platformName", "iOS");
     capabilities.setCapability("deviceName", "iPhone");
     capabilities.setCapability("app", appName);
     driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
     driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    
  4. 启动Appium服务,在测试项目的根路径执行mvn -Dtest=com.saucelabs.appium.UICatalogTest test即可.

Appium Inspector

在Android中,我们可以使用hierarchyviewer这个强大的工具,来分析界面控件,查看控件id、name、类型等。在ios如果要分析界面控件,可以使用Xcode查看,或者通过Xcode的UIAutomator录制的js脚本查看,但是都比较麻烦。Appium为我们提供了Inspector这款工具。简单使用步骤如下:

  1. 点击“苹果”图标,设置相关参数,如截图屏幕快照 2014-10-29 下午12.41.34
    • App Path:使用模拟器设置此选项,指定build出的app程序,路径如: /Users/apple/work/workspace/sample-code/sample-code/apps/UICatalog/build/Release-iphonesimulator/UICatalog.app
    • BundleID:使用真机设置此选项,这个就是Xcode中的Bundle identifier这个参数,在上面说过一次。
    • Force Device 选择要启动的机器类型
    • Platform Version 指定ios版本
    • UDID 使用真机设置此选项,这是iphone的唯一性标识,可以使用itune查看
    • Xcode Path: 设置Xcode的路径,如果mac中安装了多个Xcode可以在这里进行手动指定
  2. 点击“Launch”图标,启动Appium Server
  3. 点击“Launch”左侧的放大镜图标,就可以启动Inspector工具,比较慢,耐心等待。加载完毕后,可以查看界面控件树,还可以录制脚本。点击控件后,可以看到该控件的name、value、label、xpath、type等,当前前提是开发定义了这些东西。

遇到的问题

  1. Xcode编译、运行开发的项目出错check出开发的代码,直接Xcode就build不过,有可能是Xcode版本问题,或者开发使用了某些依赖,只能在Xcode6中编译。对ios开发不熟悉,只能暂时归咎为版本问题。
  2. 使用xcodebuild 编译打包可以提供几个命令,但是最终没能成功打出模拟器的包;现在使用真机测试,直接是xcode安装的。
    • 打出真机的包,ios 8.1版本
        xcodebuild -sdk iphoneos8.1 -configuration Debug
      
    • 打出模拟器的包,ios 7.1版本
        xcodebuild -sdk iphonesimulator7.1
      
    • 打出模拟器的包,并且指定arch,target参数
        xcodebuild -sdk iphonesimulator8.1 -configuration Debug -target Meilishuo -arch "armv7s" 
      
  3. 都知道界面自动化的维护成本大的问题,ios这块感觉更为突出,使用Appium Inspector查看控件时,很少有控件id,并且name属性开发也可以随意更改,value和label也不靠谱,貌似暂时不变的只有xpath,但是使用xpath的危害写过自动化的人应该都知道。目前我为我们的项目写的自动化case,基本上都是xpath,在后续界面大改的时候,应该会死的比较惨,God bless me!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)