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工作原理
由上图,我们也大致理解了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标准协议就可以。
这样的设计思想带来了一些好处:
- 可以带来多语言的支持;
- 可以把server放在任意机器上,哪怕是云服务器都可以;(是的,appium和webdriver天生适合云测试)
Tips:
- Android版本小于等于4.2:Selenroid,基于Android Instrumentation框架实现的自动化测试工具;
- Android版本大于4.2:UIAutomator,这个是操作系统自带的UI自动化测试工具;
- iOS,xcode版本小于8:UIAutomation,iOS系统自带的UI自动化测试工具;
- 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基本配置
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",
}
各参数的大致意思如下:
- platformName:使用哪种移动平台?Android/ios/firefox OS。
- platformVersion:指定平台的系统版本,如上面示例中是Android4.4.2版本。
- deviceName:启动哪种设备?真机还是模拟器(示例中的就是模拟器)?
- appPackage:待测试的app的java package,可以通过
aapt
命令查看。 - appActivity:待测试的app的Activity名字,
- automationName:使用哪种自动化引擎,是默认的Appium还是Selendroid?一般,我们保持默认即可,当然,保持默认这个参数可以不带。
Tips:
Activity:Activity是最基本的模块,我们称之为活动,在应用程序中,一个Activity通常就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动的类将会显示有视图控件组成的用户接口,并对事件作出响应。简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如,监听系统事件(按键事件,触摸屏事件等),为用户显示指定的View,启动其他Activity等。
如何让测试脚本跑起来?
想让appium的测试脚本跑起来,我们需要做哪些准备呢? 根据之前的appium工作原理我们知道,需要个客户端将脚本交给appium-server,再交给uiautomator调用移动端设备执行,各个节点所需要的软件和环境就是下面的样子:
我们可以参照这个图在下一讲中将环境搭建起来。
appium环境配置
祭图!
由上图我们知道,都是要配置哪些软件了。
- Python解释器,另外,Python连接appium-server需要相关的API,这个API是appium-python-client,也需要下载
- node.js
- appium-server
- AndroidSDK
- JavaJDK
- 手机/模拟器
for Windows
Python解释器
Python解释器的安装
appium-python-client
pip install appium-python-client==0.24
node.js
JavaJDK
安装推荐全部默认安装即可。安装完毕需要配置这些变量。
变量名 | 变量值 | 备注 |
---|---|---|
JAVA_HOME | C:\Program Files\Java\jdk1.8.0_201 | 这是默认的安装路径 |
Path | %JAVA_HOME%\bin | |
Path | %JAVA_HOME%\jre\bin | |
CLASSPATH | %JAVA_HOME%\lib | CLASSPATH变量存在就追加,没有就创建 |
CLASSPATH | %JAVA_HOME%\lib\tools.jar | 多个变量名之前以; 分割 |
AndroidSDK
Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序。简单来讲,Android SDK 可以看做用于开发和运行 Android 应用的一个软件。
安装
直接将全家桶中的android-sdk-window
文件夹保存到本地一个非中文的目录中,然后配置相关环境变量。
配置系统环境变量
变量名 | 变量值 | 备注 |
---|---|---|
ANDROID_HOME | Android-sdk-windows的安装目录 | 安装路径不允许有中文 |
Path | %ANDROID_HOME%\tools | |
Path | %ANDROID_HOME%\platform-tools | |
Path | %ANDROID_HOME%\build-tools\27.0.1 | |
测试
终端输入adb
和aapt
测试,返回一堆命令提示即可。
appium-server
在Windows中,appium-server有客户端和终端两种安装方式,早期都是终端方式,现在客户端方式居多,我们优先选择客户端方式安装,但我也会把终端安装方式列出来,供参考。
客户端安装
打开全家桶中的appium-desktop-Setup-1.3.1.exe
可执行文件,直接管理员权限安装即可,其他无需我们操作,直接等安装完成,如下图:
如上图,在simple
栏,默认监听0.0.0.0
和4723
端口,这里我们将host改为127.0.0.1
,然后点击start server
。
可以看到,启动了一个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版本
- 打开SDK的安装目录,管理员启动
SDK Manager.exe
。
- 根据你的需求选择对应的Android版本,这里以Android6.0为例,然后右下角点击安装。
- 勾选
Accept License
,然后点击安装。
之后,就是漫长的下载阶段了。
安装Android模拟器(虚拟机)
- 打开SDK的安装目录,管理员启动
AVD Manager.exe
。SDK Manager.exe
- 点击
Craate
创建虚拟机,并且进行一些配置。
- 点击
Start
,然后在点击Launch
。
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)