该文档为选用 Appium 作为移动设备原生(Native)、混合(Hybrid)、移动 web(Mobile Web)应用 UI 自动化测试的相关自动化测试人员、开发人员等提供参考。
自动化测试人员、测试代表、开发人员等。
不需要为了自动化而且重新编译或修改测试 app;
不应该让移动端自动化测试限定在某种语言和某个具体的框架;也就是说任何人都可以使用自己最熟悉最顺手的语言以及框架来做移动端自动化测试;
不要为了移动端的自动化测试而重新发明轮子,重新写一套惊天动地的 api;也就是说 webdriver 协议里的 api 已经够好了,拿来改进一下就可以了;
移动端自动化测试应该是开源的;
Appium 的核心是一个暴露了一系列 REST API 的 Server。这个 server 的主要功能:监听一个端口,然后接收由 client 发送来的命令(command)。解析这些 command,把这些 command 转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些 command 后把执行结果返回给 server, server 再把执行结果返回给 client。
client 就是发起 command 的设备,一般来说就是我们代码执行的机器,执行 appium 测试代码的机器。狭义点理解,可以把 client 理解成是代码,这些代码可以是 java/ruby/python/js 的,只要它实现了 webdriver 标准协议就可以。
这样的设计思想带来了一些好处:
1)多语言的支持;
2)可把 server 放在任意机器上,支持云测试;
图 1 Appium 架构
图 2 Appium Android 模型
图 3 AppiumiOS 模型
Appium Server 即服务器,连接 Appium 客户端和移动设备。原生的 webdriverapi 为 web 端设计,因此扩展到移动端要拓展。Appium 官方提供了一套 appium client,涵盖多种语言 ruby/java/python 等。
在 webdriver/appium,所有测试都必须在 Appium Server 和移动设备之间创建会话(Session)后才可以进行。一般来说,通过 POST/session 这个 URL,然后传入会话属性(Desired Capabilities)就可以开启会话了。开启会话后,会返回一个全局唯一的会话 ID(session id),之后几乎所有的请求都基于该会话 ID,该会话 ID 代表了你所打开的浏览器或者是移动设备的模拟器,连接执行机器和移动设备。由于每个移动设备的连接会话 ID 是全局唯一的,那么在同一台机器上启动多个会话就变成了可能,这使多移动设备的并发测试成为可能。
会话属性(Desired Capabilities)包含会话配置信息,以 key-value 形式存在,可以理解成是 java 里的 map,python 里的字典,ruby 里的 hash 以及 javascript 里的 json 对象(实际上,Appium Server 和移动设备之间的会话属性就是通过 json 对象传输)
Appium Windows 版仅支持 Android 设备(手机),Appium Mac 版同时支持 Android 和 iOS 设备(手机)。
1)JDK> 1.6
2)vcredist_x86_c++
3).Net Framework > 4.0
3)Android Developer Tools(ADT-Bundle-windows-x86-64)
4)Appium for windows(最新版 1.4.16.1)
5) Appium client(根据使用的语言安装一种即可:Java/Python/Ruby 等),对于 Java 客户端,还需要 Selenium 包 selenium-java-2.46.0.jar , selenium-server-standalone-2.46.0.jar,python 的是 Appium-python-client(就是一个 python 类库)
6)Android 手机驱动(for windows),windows 必须安装任意一个 Android 手机驱动,否则,adb 无法检测无设备。
按照 JDK、vcredist_x86_c++、.NET Framework、Appium 的顺序安装好各软件,ADT 直接下载就可以用无需安装
1)JDK 安装:设置系统环境变量 JAVA_HOME 为 JDK 安装路径:(Java 安装和环境变量配置,自行百度)
2)vcredist_x86_c++ 安装:百度下载 vcredist_x86_c++.exe 文件,双击安装即可。
3).NET Framework 安装:百度一个大于 4.0 版本的. NET Framework.exe 文件。双击安装即可。
4)Appium 服务端安装:下一个 Appium for windows 1.4.16 版本,双击安装即可。(注:Appium 分为客服端和服务端,服务端就是 Appium 工具,又可以分为 GUI 版本和终端版本。GUI 版本是可视化的图像界面工具,终端版本是在终端启动的一个服务而已。客服端就是针对 python、java、ruby 等语言开发的类库)
5)ADB 安装:ADB 是 ADT 的一个工具,所以,在要下一个 ADT 的安装包(免安装的)解压即可。然后,设置系统环境变量 ANDROID_HOME 为 ADT 所在目录(比如 D:\Mobile-AutoTest-Software\adt-bundle-windows-x86_64-20130917\sdk),同时把并把 ADT 里的 tools 和 platform-tools 两个目录加入到系统的 Path 路径里:注意:adb 需要安装 adb 驱动,一般手机驱动自带 adb 驱动,所以只要安装一个手机驱动即可
adb 安装成功后在终端输入 adb devices 会弹出 PC 端连接的设备的 udid
6)python 安装:下一个 python2.7 的安装包,双击安装即可。如果需要通过 python 安装相关的 python 类库,还要安装 pypa-setuptools、pip 等工具。
6)Appium 客服端安装:安装 Appium Client(客户端只需安装一个,比如 Python 的或者 Java 的)这里以 python 为例:
1、需首先安装 Python、pypa-setuptools、pip 等 Python 环境 (安装过程自行百度),然后通过 pip 在线(PC 需联网)安装 Selenium 及 Python 客户端(cmd 下切换到 Python 安装目录 C:\Python27\Lib\site-packages \ 后执行):
python pip install Selenium
python pip install Appium-Python-Client
2、设置环境变量,把 Python 的目录加到系统的 Path 路径里
小提示:
安装 Appium-Python-Client 客户端时有时会遇到 setuptools 版本问题,运行 python pip install –upgrade setuptools 升级后再安装:
如果机器没联网,下载 Selenium 和 Appium-Python-Client,并解压把整个目录放到 Python 安装目录(一般是 C:\Python27\Lib\site-packages 目录下),如下图(selenium-2.53.1 目录下 py 目录的 selenium 目录拷贝到上面的 site-packages 目录)
Java 客户端可直接下载 Jar 包(比如 java-client-3.2.0.jar),在 Java 工程中添加 Jar 即可。
其他客户端安装【略】
按照如上步骤安装好各软件后,基本环境就算完成了。启动 Appum,填写被测 APP 路径,Platform 选 Android,Automation Name 选 Appium,PlatformVersion 根据手机的 Android 版本选择,DeviceName 选择上面 adb 命令识别的手机 udid 号;Server 地址和端口保持默认:
配置上面两项内容后,点击启动按钮,看到最后一行信息及表示启动成功:
Mac Pro (OS X 10.10.3)
JDK > 1.6
Appium for Mac(最新版 Appium-1.4.13.dmg)
Xcode 7.X
Appium Client(Python、Java 等),对于 Java 客户端,还需要 Selenium 包 selenium-java-2.46.0.jar , selenium -server-standalone-2.46.0.jar
过程和 Windows 基本一致,JDK 安装过程自行百度,python 咋 Mac 和 Linux 环境下是自带的无须安装。环境变量 JAVE_HOME 和 ANDROID_HOME 设置,并把 ADT 里的 platform-tools 和 tools 加到系统目录:
最后,启动 Appium-doctor 检查环境配置,全部打勾说明环境搭建完毕:
由于 iOS10 放弃了 uiautomator,改用 XCUITest 来进行测试。appium1.6.0 之前的版本全部采用 uiautomator 来进行自动化测试,基于这次 iOS 的调整,appium1.6.0 之后的版本添加了 WebDriverAgent 依赖来应对这次 iOS 的调整。这里,我针对 appium1.6.3 的升级过程做描述。
Linux Ubuntu Destop 14.04 以上版本
brew
ruby
git
curl
node
jdk
appium
Android sdk
Python Appium 客户端:Appium-Python-Client、Selenium
Appium Server 的安装
【参考 https://coderwall.com/p/rcvkrq/install-nodejs-using-homebrew-and-install-appium】
1. 删除 nodejs : sudo apt-get remove nodejs。但是默认的系统 nodejs 没有,这一步可做可不做。
2. 安装 ruby:sudo apt-get install ruby
确认 ruby 安装成功:
ruby -v 有 ruby 的版本信息。
3. 安装 git:sudo apt-get install git
4. 安装 brew:ruby -e "$(wget -O- https://raw.github.com/Homebrew/linuxbrew/go/install)"
如果上面执行不成功的话可以用下面这句 git clone https://github.com/Homebrew/linuxbrew.git ~/.linuxbrew
5. 安装 curl:sudo apt-get install curl
6. 安装 node.js:一定不能用 sudo,直接普通用户安装(确认之前文件环境配置好后,如果安装下载失败多试几次)
brew install node
如果上面执行不成功的话就用这种方法:sudo apt-get install g++。
sudo apt-get install libssl-dev。
wget http://nodejs.org/dist/v5.6.0/node-v5.6.0.tar.gz。
tar zxvf node-v5.6.0.tar.gz。
./configure(注:这句话要切到 node 的 bin 目录下执行)。
make。
make install。
sudonpm install –g express-generator@4(全局模式安装)。
可能会比较慢(本机安装 15 分钟左右),耐心等待 nodejs 安装成功。
查看安装完成
node -v
7. 安装 Java 虚拟机
下载 JDK,下载最新 Java SDK
解压安装
我们把 JDK 安装到这个路径:/usr/lib/jvm
如果没有这个目录(第一次当然没有),我们就新建一个目录
1)cd /usr/lib
2)sudo mkdir jvm
建立好了以后,我们来到刚才下载好的压缩包的目录,解压到我们刚才新建的文件夹里面去,并且修改好名字方便我们管理,(根据版本名自己修改名字)
1)sudo tar zxvf ./jdk-7-linux-i586.tar.gz -C /usr/lib/jvm
2)cd /usr/lib/jvm
3) sudo mv jdk1.7.0_05/ jdk7
配置 JAVA 环境变量
gedit ~/.bashrc
在打开的文件的末尾添加
export JAVA_HOME=/usr/lib/jvm/jdk7
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存退出,然后输入下面的命令来使之生效
source ~/.bashrc
配置默认 JDK
由于一些 Linux 的发行版中已经存在默认的 JDK,如 OpenJDK 等。所以为了使得我们刚才安装好的 JDK 版本能成为默认的 JDK 版本,我们还要进行下面的配置。
执行下面的命令:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk7/bin/java 300
sudo update-alternatives --install /usr/bin/javacjavac /usr/lib/jvm/jdk7/bin/javac 300
注意:如果以上两个命令出现找不到路径问题,只要重启一下计算机在重复上面两行代码就 OK 了。
执行下面的代码可以看到当前各种 JDK 版本和配置:
sudo update-alternatives --config java
测试
打开一个终端,输入下面命令:
java -version
显示结果(JDK1.8):
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b05)
Java HotSpot(TM) Server VM (build 23.1-b03, mixed mode)
这表示 java 命令已经可以运行了。
8. 安装 appium
全局安装 appium,本机安装的是 1.4.16 版本(如果不加版本名会自动安装最新版本), 通过 npm 淘宝镜像
通过 config 命令
npm config set registry https://registry.npm.taobao.org (这里是为下面一句服务的,即把 appium 的下载数据源指向淘宝库)
npm install -g appium@1.4.16
如果安装失败就用 root 账号进行安装?安装完之后,
cd /usr/local/lib
sudo chown –R 主机名字 node_modules
然后卸载:
npm uninstall appium –g
之后再普通用户下启动 appium
可能会比较慢,耐心等待安装成功,如果安装失败重复执行安装命令 (如果之前有安装过错误的版本,提示得删除之前的文件,删除之后在安装)。
安装成功会出现树状依赖关系图
查看版本
appium -v
9. 下载安装 Android SDK Starter Package
Android SDK Starter Package 这个只是 SDK 的核心基本工具,有了它,再利用它的管理工具下载其他你需要到部分。看到这个目录中有个 android 脚本文件了吗?执行它,就会启动 Android SDK and AVD Manager, 这个工具可以帮你下载其他你需要的部分,还可以创建模拟机。
下载地址是:http://developer.android.com/sdk/index.html,不过国内这个地址被墙掉了,你要想版本下载包了。
一般是下载最新版,我下载的:android-sdk_r21.1-linux.tgz。
wget http://dl.gmirror.org/android/android-sdk_r24.4.1-linux.tgz
接下来当然是解包了:tar zvxf android-sdk_r21.1-linux.tgz
解包完毕,就会在当前目录下出现 android-sdk-linux_x86 目录了。这个目录下就是 sdk 的基本工具了。记住这个目录,因为以后你运行工具或者设置 ADT 的时候,会需要这个目录的!。
注意,需要安装 ia32-libs
sudo apt-get install -y libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1
配置 Android SDK
配置 Android 环境变量,将下面的变量添加到环境变量当中去(根据自己 sdk 存放的文件夹修改路径,注意 HOME 就为当前用户目录下)
export ANDROID_HOME="$HOME/adt/sdk"
export PATH=${PATH}:~/adt/sdk/tools
export PATH=${PATH}:~/adt/sdk/platform-tools
然后 source
source ~/.bashrc
10. 安装 Appium 客户端(ubuntu 系统自带 python2.7 和 python3.4 版本)
安装 Appium-Python-Client(使用 pip 安装)
sudo apt-get install python-pip
sudo pip install Appium-Python-Client
(可能会失败,多试几次)
安装 selenium 2.0(/usr/local/lib/python2.7/dist-packages 下也有就无需安装)
sudo apt-get install selenium
测试 Appium
测试 appium 环境安装正确与否
appium-doctor
所有环境都打钩为正确配置好环境,查看上面的 JAVA_HOME 和 ANDROID_HOME 环境配置是否正确
命令行敲入 appium
出现 welcome to appium v1.4.16 代表安装成功
测试项目
将项目放到 / python2.7/dist-packages 文件夹下测试运行
完成!!!
启动 Appium 后,用 Appium Inspector 进行控件识别(如下图),可以进行点击和输入操作(Tap、Text),右边的界面会根据操作实时更新,方便连续识别控件。
启动 Appium 后,用 Appium Inspector 进行控件识别(如下图)。
Appium 终端版本启动命令:
Linux 下启动命令:appium -a 127.0.0.1 -p 端口号 -bp 端口号 --session-override --no-reset
Mac 下启动命令:appium -a 127.0.0.1 -p 端口号 -bp 端口号 --session-override --no-reset --tmp 绝对路径
Mac 下启动多个 appium(小于 1.6.0 的版本)会有冲突,所以必须要对每个 appium 自定一个不同的数据缓存目录。因此,tmp 后面的参数不能相同。appium(大于 1.6.0) 由于引进了 WebDriverAgent,同时运行个 appium 客户端会导致 wda 的 pc 端端口重复,可以在测试脚本中指定 setCapability("wdaLocalPort","端口一"),确保每个 appium 客户端 wdaLocalPort 端口不同。
Appium 长时间运行报错:FATAL ERROR:CALL_AND_RETRY_LAST Allocation failed – process out of memory 已放弃(核心已转储)。判断为 node 内存溢出。这是 node 的 bug。
driver 对象类
- fromappiumimport webdriver
- import time
- fromselenium.common.exceptionsimport NoSuchElementException
- class driverObject:
- def __init__(self, host, port, platform, version, deviceName, noReset, unicodeK, resetK, appPath ,appP_bdId, appA_udid, localPort):
- #__appP_bdId = "com.yitong.fjnx.mbank.android"
- __appP_bdId= appP_bdId
- #__appA_udid = ".Splash"
- __appA_udid= appA_udid
- self.pwmode ='lower'
- self.model='Appium'
- self.desired_caps = {}
- self.desired_caps['platformName'] = platform
- self.desired_caps['platformVersion'] = version
- self.desired_caps['noReset'] = noReset
- self.desired_caps['unicodeKeyboard'] = unicodeK
- self.desired_caps['resetKeyboard'] = resetK
- self.desired_caps['app'] = appPath
- self.desired_caps['udid'] = deviceName
- self.desired_caps['deviceName'] = deviceName# Android - ignored, iOS - iPhone name
- ifplatform =="Android":
- self.desired_caps['appPackage'] =__appP_bdId
- self.desired_caps['appActivity'] =__appA_udid
- ifplatform =="iOS":
- self.desired_caps['bundleId'] =__appP_bdId
- self.desired_caps['automationName'] ='XCUITest'
- self.desired_caps['wdaLocalPort'] = localPort
- url ="http://"+ host +":"+ str(port) +"/wd/hub"
- self.driver = webdriver.Remote(url, self.desired_caps)
- time.sleep(5)
- def get_driver(self):
- return self.driver
- def quit(self):
- self.driver.quit()
主类
- from testClass import driverObjectif __name__=='__main__':
- driver =driverObject(参数...)
- 脚本内容代码...
- driver.quit()
来源: http://www.cnblogs.com/baconLiu/p/6735441.html