使用appium进行iOS真机自动化测试之环境入门

之前刚接触客户端测试的时候,appium还是1.5,xcode还是7,那时的苹果还支持UIAutomation框架,当时的UI自动化case写的也是很顺利,后来xcode升级后,楼主试用过beta版本的1.6的appium维护之前的case,当时还没有对应的最新版的客户端,所以当时获取界面元素,楼主还是很low逼的使用打印页面的方式。后来跳槽后,新的环境并没有UI自动化这种东西,所以一直就废弃了,不过有个比较头疼的问题一直存在,核心埋点问题,埋点的异常会导致各种大盘数据的抖动,为了保证核心埋点的稳定,打算重新搞一搞appium,利用UI自动化去校验核心埋点。在重新配置appium环境的时候默默的表示还是遇到了很多坑的,所以就记录一下,给同行的tester们一点启示。

总体介绍

本文会介绍包括xcode7以及最新的xcode9的对应的appium的使用小记,不过之前版本的很多疑问点已经没有印象了,所以会着重记录新版本的appium与xcode的使用心得。之前在运行过程中,一直对WD编译成功后的一个server地址感兴趣,就在网上找的过一篇博客,博主主要从appium原理层面分析的一下appium,虽然不是非常深刻,但个人觉得值得大家读一读:Appium 从入门到原理
本文主要分为如下几个部分:

  • 新版的appium以及相关依赖的安装
  • WebDriverAgent的安装与运行
  • Appium-Desktop安装与运行
  • DesiredCapabilities参数设置
  • 遇到的问题点记录

新版appium以及相关依赖安装

安装必备的依赖

  • libimobiledevice
    appium iOS真机调试依赖一个重要的第三方开源包:libimobiledevice,它同iTools一样,都是可以替代iTunes,进行iOS设备管理的工具,使用Homebrew可以轻松获取并安装:

    1
    brew install libimobiledevice
  • ios-deploy
    ios-deploy是一个使用命令行安装ios app到连接的设备的工具,原理是根据os x命令行工程调用系统底层函数,获取连接的设备、查询/安装/卸载app。类似的工具有Fruitstrap,ideviceinstaller、node-ios-device等. 可以使用npm直接安装

    1
    npm install -g ios-deploy
  • appium安装
    appium本质上就是一个Nodejs应用,我们可以使用npm直接进行安装,安装完毕后就可以直接命令行启动了。

    1
    npm install -g appium

本地已有老版本appium时,使用上面的命令可直接更新至最新版本,或者指定版本:

  • appium-doctor
    appium-doctor是用来检测安装环境是否正常的命令,同样使用npm直接安装
    1
    npm install appium-doctor -g

安装成功后,使用该命令可以检测安装环境:appium-doctor --ios

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜ automaster-ios git:(UGC) appium-doctor --ios
info AppiumDoctor Appium Doctor v.1.4.3
info AppiumDoctor ### Diagnostic starting ###
info AppiumDoctor ✔ The Node.js binary was found at: /usr/local/bin/node
info AppiumDoctor ✔ Node version is 8.0.0
info AppiumDoctor ✔ Xcode is installed at: /Applications/Xcode.app/Contents/Developer
info AppiumDoctor ✔ Xcode Command Line Tools are installed.
info AppiumDoctor ✔ DevToolsSecurity is enabled.
info AppiumDoctor ✔ The Authorization DB is set up properly.
info AppiumDoctor ✔ Carthage was found at: /usr/local/bin/carthage
info AppiumDoctor ✔ HOME is set to: /Users/didi
info AppiumDoctor ### Diagnostic completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor Everything looks good, bye!
info AppiumDoctor

上面是全部成功的提示,如果在安装过程中某项打叉的,就对应安装就可以。

替换appium中的WebDriverAgent

  • 下载最新的WebDriverAgent代码,链接如下:WebDriverAgent
  • 进入下载后的WebDriverAgent目录,执行./Scripts/bootstrap.sh
  • 直接用Xcode打开该project,WebDriverAgent.xcodeproj
  • 如果使用模拟器测试,此时直接选择模拟器,然后Cmd+U就可以运行了
  • 真机调试需要配置WebDriverAgentLibWebDriverAgentRunner的证书 ,勾选你的证书什么的注册一下就好。如下图所示:


    其中使用xcode的自动管理证书的方式时,如果是免费版的个人证书,还需要修改下WebDriverAgent的BundleID,我一般会在后面加上我自己的后缀,如下图所示:
  • 此时选中WebDriverAgentRunner这个target,并选中自己的设备,Cmd+U即可顺利运行。运行成功后即可以在Xcode控制台打印出一个ip地址和端口号,具体如下图所示:
  • 在浏览器输入http://(iP地址):(端口号)/status,如果网页显示了一些json格式的数据,则说明运行成功
  • 进入到Appium中的WebDriverAgent目录,目录路径如下(/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/),将自己下载并编译成功后的WebDriverAgent替换Appium原有的WebDriverAgent。

Appium-Desktop安装与运行

安装

Appium-Desktop中下载最新版本的Appium-Desktop.

运行程序

  • 运行Appium-Desktop
  • 开启start server
  • 点击start new session
  • 在 Desired Capabilities 中输入相关的参数后点击Start Session
  • 运行成功后,会弹出一个控制界面,在该界面中可以控制手机上正在运行的程序
  • 点击界面上方中心的录制按钮,可以将你对手机端的操作代码化

DesiredCapabilities参数设置

在运行Appium-Desktop时,设置Desired Capabilities参数遇到一些小问题,就顺便看了官方版本的针对这些参数的解释,把常用的参数简单翻译了一下,基本如下表所示:

参数名称 参数说明 可选条件
automationName 想使用的自动化引擎 Appium, Selendroid
platformName 平台的名称 iOS, Android, FirefoxOS
platformVersion 移动设备的系统版本号 11.0, 10.0
deviceName 移动设备的名称 instruments -s devices获取
app 安装包路径 /abs/path/to/my.apk or http://myapp.com/app.ipa
newCommandTimeout 等待新命令的最长时间,超时后退出 默认是60s
language 模拟器的语言设置 fr
locale 模拟器的地区设置 fr_CA
udid 设备号 instruments -s devices获取
orientation 模拟器的横竖屏设置 LANDSCAPE or PORTRAIT
noReset 在当前session前不重置app状态 true, false
fullReset ios删除文件夹,Android删除app数据 true, false

实际运行

环境依赖

楼主一般都是使用Python进行客户端的UI自动化,所以在真正运行楼主的case之前,需要先把相关的依赖环境安装完成

  • 安装python,一般mac自带brew install python
  • 安装Python的appium模块:

    1
    2
    3
    git clone git@github.com:appium/python-client.git
    cd python-client
    python setup.py install
  • 下载测试demo:
    里面主要写了个简单的iOS工程文件,并包含一个简单的Python测试脚本

    运行脚本

  • 打开demo工程后,配置target的签名,在Demo的根目录执行编译指令,编译出一个app文件xcodebuild -sdk iphoneos -target XXXXX -configuration Release,编译成功后app文件的地址会打印在命令行中:
  • 配置python文件
    打开appiumSimpleDemo中的appiumSimpleDemo.py文件,将,修改setup中的几个参数,将app的路径,设备的相关信息修改成当前连接设备的信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def setUp(self):
    app = os.path.abspath('/Users/didi/sxl/code/script/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app')
    self.driver = webdriver.Remote(
    command_executor = 'http://127.0.0.1:4723/wd/hub',
    desired_capabilities = {
    'app':app,
    'platformName': 'iOS',
    'platformVersion': '11.0',
    'deviceName': 'sxliPhone8',
    'bundleId': 'com.cvte.appiumSimpleDemo.sxl',
    'udid': '6180d7804ecb56f73154340edb482a72b09351c4'
    }
    )
  • 运行Appium程序
    打开之前下载安装的Appium,并开启服务。

  • 运行python测试文件
    在appiumSimpleDemo.py所在的目录运行python appiumSimpleDemo.py,如果之前设置都没有出错,那么程序应该会在手机上成功运行,并自动点击了entry next view进入到了下一个界面,过了2s后会重新返回第一个界面

问题小记

  • Could not launch “WebDriverAgentRunner”
    首次运行WebDriverAgentRunner时会出现如下图的报错,该报错主要测试机未信任该开发者,遇到这种情况,去测试机的设置–通用–描述文件与设备管理–找到当前开发者账号的应用,点击信任即可。

  • WD安装失败App installation FAILED
    WDtest成功一次后,再次编译时,偶现会出现如下的报错信息:

    出现这个问题主要是覆盖安装的原因,把测试机上的WD删除后重新运行即可成功

  • WebDriverAgentRunner运行成功后,链接打不开
    有些机器通过手机的IP和端口还是不能访问,这种时候需要将手机的端口转发到Mac上,解决这个问题的时候,楼主先是尝试了使用iproxy的方式,具体命令如下:

    1
    $ iproxy 8100 8100

此时通过访问http://localhost:8100/status可确认WDA是否运行成功,而inspector的地址是http://localhost:8100/inspector, inspector是用来查看UI的图层,方便写测试脚本用的。
使用这种方式有一点比较不能忍,进程杀了之后的转发就停止不可用了,所以在此在提供另外一种方式:
sudo vi /etc/hosts
加:

1
127.0.0.1 localhost

  • appium客户端Start Session时报错,original error:SDK ‘11.0’not in list of simctl sdks