Skip to content

about appium

appium由Saucelab公司基于nodejs的express框架开发http server,是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。

  • "移动原生应用"是指那些用iOS或者 Android SDK 写的应用(Application简称app)。
  • "移动web应用"是指使用移动浏览器访问的应用(appium支持iOS上的Safari和Android上的 Chrome)。
  • "混合应用"是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 Phonegap,可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。

appium是跨平台的,可以用在OSX,Windows以及Linux桌面系统上运行。

appium和selenium

appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。

appium客户端类库实现了Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和W3C WebDriver spec(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。

appium服务端定义了官方协议的扩展,为appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载App。这就是为什么我们需要appium特定的客户端,而不是通用的Selenium 客户端。当然,appium 客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium 客户端,所以他们仍然可以用来运行通用的Selenium会话。

appium client

由于appium选择了Client/Server的设计模式,并遵循rest ful的json wire协议,只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的(这也是appium跨平台的原因)。 你可以轻松是你熟悉的编程语言来实现测试脚本。Python、java and so on

appium server

appium工作原理

1832670910721556480.png

由上图,我们也大致理解了appium的工作方式,appium的核心其实是一个暴露了一系列REST API的server。

这个server的功能其实很简单:监听一个端口,然后接收由client发送来的command。翻译这些command,把这些command转成移动设备可以理解的形式调用uiautomator框架的接口,然后uiautomator调用移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。

在这里client其实就是发起command的设备,一般来说就是我们代码执行的机器,执行appium测试代码的机器。狭义点理解,可以把client理解成是代码,这些代码可以是java/ruby/python/js的,只要它实现了webdriver标准协议就可以。

这样的设计思想带来了一些好处:

  1. 可以带来多语言的支持;
  2. 可以把server放在任意机器上,哪怕是云服务器都可以;(是的,appium和webdriver天生适合云测试)

Tips:

  1. Android版本小于等于4.2:Selenroid,基于Android Instrumentation框架实现的自动化测试工具;
  2. Android版本大于4.2:UIAutomator,这个是操作系统自带的UI自动化测试工具;
  3. iOS,xcode版本小于8:UIAutomation,iOS系统自带的UI自动化测试工具;
  4. iOS,xcode版本大于等于8:XCUITest,appium 1.6.0开始支持XCUITest方案;

Session会话

session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。一般来说,通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了。

开启session后,会返回一个全局唯一的session id,以后几乎所有的请求都必须带上这个session id,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。

进一步思考一下,由于session id是全局唯一,那么在同一台机器上启动多个session就变成了可能,这也就是selenium gird所依赖的具体理论根据。

那Desired Capabilities又是什么?

Desired Capabilities

Desired Capabilities在启动session的时候是必须提供的。

从本质上说,Desired Capabilities是个key:value格式的对象,你可以把它理解成是java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。

简单来说Desired Capabilities最重要的作用是告诉appium server本次测试的上下文;本次要进行的是浏览器测试还是移动端测试?如果是移动端测试的话,是Android还是ISO?如果是Android,要测试哪个app?appium server的这些疑问都需要Desired Capabilities来解答,否则appium server无法完成移动端app或者是浏览器的启动。

Desired Capabilities基本配置

python
from appium import webdriver

desired_capabilities = {
    "platformName": "android",
    "platformVersion": "4.4.2",
    "deviceName": "127.0.0.1:62001",
    "appPackage": "com.jd.app.reader",
    "appActivity": "com.jingdong.app.reader.logo.JdLogoActivity",
    # "automationName": "Appium",
}

各参数的大致意思如下:

  1. platformName:使用哪种移动平台?Android/ios/firefox OS。
  2. platformVersion:指定平台的系统版本,如上面示例中是Android4.4.2版本。
  3. deviceName:启动哪种设备?真机还是模拟器(示例中的就是模拟器)?
  4. appPackage:待测试的app的java package,可以通过aapt命令查看。
  5. appActivity:待测试的app的Activity名字,
  6. automationName:使用哪种自动化引擎,是默认的Appium还是Selendroid?一般,我们保持默认即可,当然,保持默认这个参数可以不带。

Tips:

Activity:Activity是最基本的模块,我们称之为活动,在应用程序中,一个Activity通常就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动的类将会显示有视图控件组成的用户接口,并对事件作出响应。简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如,监听系统事件(按键事件,触摸屏事件等),为用户显示指定的View,启动其他Activity等。

如何让测试脚本跑起来?

想让appium的测试脚本跑起来,我们需要做哪些准备呢? 根据之前的appium工作原理我们知道,需要个客户端将脚本交给appium-server,再交给uiautomator调用移动端设备执行,各个节点所需要的软件和环境就是下面的样子:

1832670911858212864.png

我们可以参照这个图在下一讲中将环境搭建起来。

appium环境配置

祭图!

1832670911858212864.png

由上图我们知道,都是要配置哪些软件了。

  1. Python解释器,另外,Python连接appium-server需要相关的API,这个API是appium-python-client,也需要下载
  2. node.js
  3. appium-server
  4. AndroidSDK
  5. JavaJDK
  6. 手机/模拟器

for Windows

Python解释器

Python解释器的安装

参考:https://www.cnblogs.com/Neeo/p/10864123.html#python

appium-python-client

pip install appium-python-client==0.24

node.js

参考:https://www.cnblogs.com/Neeo/articles/11637320.html

JavaJDK

安装推荐全部默认安装即可。安装完毕需要配置这些变量。

变量名变量值备注
JAVA_HOMEC:\Program Files\Java\jdk1.8.0_201这是默认的安装路径
Path%JAVA_HOME%\bin
Path%JAVA_HOME%\jre\bin
CLASSPATH%JAVA_HOME%\libCLASSPATH变量存在就追加,没有就创建
CLASSPATH%JAVA_HOME%\lib\tools.jar多个变量名之前以;分割

参考:https://www.cnblogs.com/Neeo/articles/11954283.html

AndroidSDK

Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序。简单来讲,Android SDK 可以看做用于开发和运行 Android 应用的一个软件。

安装

直接将全家桶中的android-sdk-window文件夹保存到本地一个非中文的目录中,然后配置相关环境变量。

配置系统环境变量

变量名变量值备注
ANDROID_HOMEAndroid-sdk-windows的安装目录安装路径不允许有中文
Path%ANDROID_HOME%\tools
Path%ANDROID_HOME%\platform-tools
Path%ANDROID_HOME%\build-tools\27.0.1

测试

终端输入adbaapt测试,返回一堆命令提示即可。

1832670914194440192.png

appium-server

在Windows中,appium-server有客户端和终端两种安装方式,早期都是终端方式,现在客户端方式居多,我们优先选择客户端方式安装,但我也会把终端安装方式列出来,供参考。

客户端安装

打开全家桶中的appium-desktop-Setup-1.3.1.exe可执行文件,直接管理员权限安装即可,其他无需我们操作,直接等安装完成,如下图:

1832670914341240832.png

如上图,在simple栏,默认监听0.0.0.04723端口,这里我们将host改为127.0.0.1,然后点击start server

1832670915343679488.png

可以看到,启动了一个HTTP服务,监听本机的127.0.0.1:4723,这个时候就可以使用浏览器地址栏访问了。

右上侧的三个图标分别是启动、下载日志、停止服务。

此时,说明appium安装成功。具体使用,我们后面再说。

OK啦,现在,将Android手机插到电脑上,就可以坐等我们编写第一个appium示例了。

接下来,列出终端安装,供你参考。

终端安装

Windows平台啊(说多了都是泪),很可能由于这样或那样的问题导致安装失败,所以,这里提供了两套方式安装(其实就是命令不同,但大同小异)方案。 为虑胜先虑败,先来说怎么卸载(我就一不小心安装了最新版...):

npm uninstall -g appium

# 完事在安装指定版本
npm install -g appium@1.7.2   # 指定版本

Plan A 终端安装(使用的是国外的源):

npm install -g appium
npm install -g appium@1.7.2   # 指定版本

很大可能被墙导致安装失败,so,淘宝镜像考虑一下。 PS:根据需要选择最新版还是指定版本,看好了再粘贴。

# 默认安装最新版的
npm --registry http://registry.npm.taobao.org install appium -g

# 安装指定版本appium
npm --registry http://registry.npm.taobao.org install appium@1.7.2 -g

安装指定版本的可能失败......不要怕,你可能连第一条命令都执行失败.... 安装appium-doctor检测:

npm --registry http://registry.npm.taobao.org install appium-doctor -g

验证:

appium-doctor

PS:我使用这个命令是失败的,but,anyway....... 启动appium验证:

C:\Users\Anthony>appium
[Appium] Welcome to Appium v1.15.1
[Appium] Appium REST http interface listener started on 0.0.0.0:4723

OK,安装成功。 很可能你按照这套流程安装失败了..... 来看备用Plan B方案。 Plan B 使用cnpm安装,首先要先配置淘宝镜像的cnpm:

npm install -g cnpm --registry=https://registry.npm.taobao.org

C:\windows\system32>npm install -g cnpm --registry=https://registry.npm.taobao.org
C:\Users\Anthony\AppData\Roaming\npm\cnpm -> C:\Users\Anthony\AppData\Roaming\npm\node_modules\cnpm\bin\cnpm
+ cnpm@6.1.0
added 354 packages, removed 363 packages, updated 144 packages and moved 3 packages in 37.303s

这一步没问题的话,验证是否安装成功:

cnpm -v

C:\windows\system32>npm -v
5.5.1

我的cnpm版本是5.5.1。 接下来,使用cnpm安装appium:

cnpm install -g appium
cnpm install -g appium@1.7.2

# cnpm install -g appium-doctor      # 安装与否无所谓,我反正是按照成功执行失败

启动appium

appium -p 4700 -bp 4701 -U 127.0.0.1:62001 --no-reset --session-override

参数说明:

  • -p是appium监听端口。
  • -bp是bootstrap的监听端口。
  • -U(U大写)是可用的设备,也就是adb devices返回的设备列表。
  • --no-reset即可避免执行用例的时候再次安装app。
  • --session-override不必每次重启session。

示例:

C:\windows\system32>appium -p 4700 -bp 4701 -U 127.0.0.1:62001 --no-reset --session-override
[Appium] Welcome to Appium v1.15.1
[Appium] Non-default server args:
[Appium]   port: 4700
[Appium]   bootstrapPort: 4701
[Appium]   sessionOverride: true
[Appium]   udid: 127.0.0.1:62001
[Appium]   noReset: true
[Appium] Deprecated server args:
[Appium]   -U,--udid => --default-capabilities '{"udid":"127.0.0.1:62001"}'
[Appium]   --no-reset => --default-capabilities '{"noReset":true}'
[Appium] Default capabilities, which will be added to each request unless overridden by desired capabilities:
[Appium]   udid: 127.0.0.1:62001
[Appium]   noReset: true
[Appium] Appium REST http interface listener started on 0.0.0.0:4700

要是还是安装不成功......还是考虑下是否需要喝杯热茶思考一下人生吧!

手机模拟器的安装

虽然我们有了手机可以来搞测试,但是还是需要模拟器来搭配使用,模拟器顾名思义,就是模拟出来一个Android系统的运行环境。

模拟器这里可以使用AndroidSDK自带的模拟器也可以使用第三方的模拟器(夜神/逍遥/雷电/MuMu)都可以,各有优势吧!

AndroidSDK自带模拟器下载

安装Android版本

  1. 打开SDK的安装目录,管理员启动SDK Manager.exe

1832670915561783296.png

  1. 根据你的需求选择对应的Android版本,这里以Android6.0为例,然后右下角点击安装。

1832670915733749760.png

  1. 勾选Accept License,然后点击安装。

1832670916073488384.png

之后,就是漫长的下载阶段了。

安装Android模拟器(虚拟机)

  1. 打开SDK的安装目录,管理员启动AVD Manager.exeSDK Manager.exe

1832670916320952320.png

  1. 点击Craate创建虚拟机,并且进行一些配置。

1832670916522278912.png

  1. 点击Start,然后在点击Launch

1832670917050761216.png

PS:我们一般不用自带的,而是一般用第三方的模拟器,所以,这里就不往下演示了。

第三方模拟器的下载

第三方模拟器就多了去了,逍遥/雷电/夜神/MuMu模拟器期等,这里我们以MuMu模拟器为例。

打开全家桶的MuMuInstaller_1.1.0.4_nochannel_zh-Hans_1573633675.exe,一路默认安装即可。

常见模拟器的默认端口号:

模拟器默认监听端口
Genymotion模拟器5555
夜神模拟器62001/52001
海马玩模拟器26944
mumu模拟器7555
天天模拟器6555
逍遥安卓模拟器21503
BlueStack3蓝叠3模拟器5555
雷神安卓模拟器5555
腾讯手游助手5555

现在,模拟器也安装好了,我们就准备后续的使用了。

see also:appium新手入门(7)—— Desired Capabilities | appium简明教程(2)——appium的基本概念 | Appium框架原理介绍p/1)