- Appium 简介
- Appium 优势
- Appium 架构原理
- 运行原理
- Appium 组件
- 安装 appium
- 1.安装 Java 环境
* - 2.安装 android jdk
- 3.使用 Appium 安装包
- appium capability 参数配置简介
- 获取 appPackage 和 appActivity
- 方法 1:
- 方法 2:
- 方法 3:
* - 方法 4:
- appium 元素定位
- appium 之 Toast 元素识别
*
Appium 简介
Appium 是一个开源测试自动化框架,可用于原生,混合和移动 Web 应用程序测试。
它使用 WebDriver 协议驱动 iOS,Android 和 Windows 应用程序。
Appium 优势
- 可以跨平台同时支持 android、ios
- 支持多种语言,java、python、php、Ruby 等等
- 不用为复杂的环境发愁
- 如果你有 selenium 经验,直接上手。
Appium 架构原理
Appium 是在手机操作系统自带的测试框架基础上实现的,Android 和 iOS 的系统上使用的工具分别如下:
- Android(版本>4.3):UIAutomator,Android 4.3 之后系统自带的 UI 自动化测试工具。
- Android(版本 ≤4.3):Selendroid,基于 Android Instrumentation 框架实现的自动化测试工具。
- iOS:UIAutomation(instruments 框架里面的一个模板),iOS 系统自带的 UI 自动化测试工具。

运行原理
我们的电脑(client)上运行自动化测试脚本,调用的是 webdriver 的接口,appium server 接收到我们 client 上发送过来的命令后他会将这些命令转换为 UIautomator 认识的命令,然后由 UIautomator 来在设备上执行自动化。
Appium 的架构原理如上图所示,由客户端(Appium Client)和服务器(Appium Server)两部分组成,客户端与服务器端通过 JSON Wire Protocol 进行通信。
Appium 服务器
Appium 服务器是 Appium 框架的核心。它是一个基于 Node.js 实现的 HTTP 服务器。Appium 服务器的主要功能是接受从 Appium 客户端发起的连接,监听从客户端发送来的命令,将命令发送给 bootstrap.jar(iOS 手机为 bootstrap.js)执行,并将命令的执行结果通过 HTTP 应答反馈给 Appium 客户端。
Bootstrap.jar
Bootstrap.jar 是在 Android 手机上运行的一个应用程序,它在手机上扮演 TCP 服务器的角色。当 Appium 服务器需要运行命令时,Appium 服务器会与 Bootstrap.jar 建立 TCP 通信,并把命令发送给 Bootstrap.jar;Bootstrap.jar 负责运行测试命令。
Appium 客户端
它主要是指实现了 Appium 功能的 WebDriver 协议的客户端 Library,它负责与 Appium 服务器建立连接,并将测试脚本的指令发送到 Appium 服务器。现有的客户端 Library 有多种语言的实现,包括 Ruby、Python、Java、JavaScript(Node.js)、Object C、PHP 和 C#。Appium 的测试是在这些 Library 的基础上进行开发的。
Appium 组件
Appium Server
Appium Server 就是 Appium 的服务端——一个 web 接口服务
Appium Desktop
Appium Desktop 是一款适用于 Mac,Windows 和 Linux 的开源应用程序,它以美观而灵活的用户界面为您提供 Appium 自动化服务器的强大功能。 它是几个 Appium 相关工具的组合:
- Appium Server 的图形界面。 您可以设置选项,启动/停止服务器,查看日志等…您也不需要使用 Node 的 NPM 来安装 Appium,因为 Node 运行时与 Appium Desktop 捆绑在一起。
- 您可以使用 Inspector 查看应用程序的元素,获取有关它们的基本信息,并与它们进行基本的交互。

安装 appium
1.安装 Java 环境
先从 Java 官网下载 jdk,正确安装并且配置环境变量,在 cmd 中输入 java -version 确认 java 版本,目前最新的 java 7 或者 Java 8 都可以
2.安装 android jdk
目前官网推荐的做法有两个:
- 安装 Android Studio (包含 Android SDK) – 推荐
- 仅安装 Android SDK 命令行工具
新版本的 Android SDK 和以前也不太一样,以前我们有一个 SDK Manager.exe 的工具用于更新和下载各版本的 API,还有一个 AVD Manager.exe 的工具可以模拟各种型号的安卓设备。最新的 SDK 工具把 UI 界面基本都去掉了,只留下命令行工具,具体的使用可以参阅官方文档:
下载完成后打开 sdk manager.exe,选择 tools,配置国内镜像源

这里推荐使用的源如下:
1、东软信息学院
mirrors.neusoft.edu.cn 端口:80
2、北京化工大学
ubuntu.buct.edu.cn/ubuntu.buct.cn 端口:80
3、电子科技大学
mirrors.dormforce.net 端口:80
其中,强烈推荐电子科技大学的镜像源!

然后选择要安装的 android 版本 ,这里推荐安装 api 26,其他默认安装即可。
安装完成后需要配置 android home 环境变量,下面设置环境变量:
“我的电脑” 右键菜单 —> 属性 —> 高级 —> 环境变量 —> 系统变量 —> 新建…
变量名为:ANDROID_HOME 变量值为 sdk 的目录
添加全局变量,找到 path 变量名—> “编辑” 添加:%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
注:path 变量的添加,如果最后有;号,则添加的时候,就不需要重复添加。如果没有,则需要自己先加一个;号再输入上面的变量
3.使用 Appium 安装包
从官网下载,Appium 目前托管在 github,正确的下载地址应该为:
一般是下载最新的版本,目前版本是 1.8.2。安装完成后直接打开就可以了。
appium capability 参数配置简介
什么是 Capability
desired capability 的功能是配置 Appium 会话。他们告诉 Appium 服务器您想要自动化的平台和应用程序。
Desired Capabilities 是一组设置的键值对的集合,其中键对应设置的名称,而值对应设置的值。(如:”platformName”: “Android”)Desired Capabilities 主要用于通知 Appium 服务器建立需要的 Session。
Session
Appium 的客户端和服务端之间进行通信都必须在一个 Session 的上下文中进行。客户端在发起通信的时候首先会发送一个叫作“Desired Capabilities”的 JSON 对象给服务器。服务器收到该数据后,会创建一个 session 并将 session 的 ID 返回到客户端。之后客户端可以用该 session 的 ID 发送后续的命令。
常用 Capability 配置讲解
Capability 官方完整文档
他主要分成了三部分:公共部分、ios 部分、android 部分,如果你 android 想用 ios 的那是不可能的,so,老老实实去了解每个平台有哪些,他们的作用是什么。下面我们介绍一些公用常用的,红色标记的为常用的选项。
公用 Capability

Android 独有 Capability

ios 独有 Capability

desired capability 参数 Josin
{
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62025",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity",
"noReset": true
}

新的会话窗口允许您构造一组 desired capabilities,用于启动 Appium 会话。您可以针对当前运行的 Appium Desktop 服务器(默认的)启动一个会话,或者您可以针对各种其他端点启动一个会话。
因为不需要使用 Appium Desktop 自己的服务器,您可以在不启动 Appium Desktop 服务器的情况下进入新的会话窗口。只需点击“File”(Windows / Linux)或“Appium”(Mac),然后选择“New Session…”,它将打开新的会话窗口,而不必启动本地服务器。在这种情况下,将禁用附加到本地服务器。
Inspector 元素获取
启动成功之后就可以使用 Inspector 来进行元素空间获取了。
注意:默认的元素定位有一些不准,需要切换到第二个坐标点定位选项后再切换回来才能准确定位。

获取 appPackage 和 appActivity
appPackage 和 appActivity 进行 appium 自动化测试非常重要的两个参数,我们所测试的 APP 不同,这两个参数肯定也是不一样的。那如何快速的获取这 APP 的这两个参数呢?下面介绍几个方法
方法 1:
前提是先打开手机中你要获取包名的 APP
打开命令行界面,输入:adb shell
然后再输入dumpsys activity | grep mFocusedActivity

方法 2:
这种方法也比较简单,主要针对你没有.apk 包的情况,比如 Android 原生自带的 APP(计算器、通讯录、短信...),可以通过 adb 命令。
1,打开 APP。
2,执行> adb logcat>D:/log.txt

3, 胡乱的对 APP 做一些操作。
4, Ctrl+c 结束 adb 命令。
5, 打开 log.txt 文件,搜索:Displayed

appPackage: com.android.messaging
appActivity:.ui.conversationlist.ConversationListActivity
方法 3:
首先,你要有一个 APP 的安装包 xxx.apk,
然后,通过这个解压工具将.apk 解压。打开解压后的文件夹,找到 AndroidManifest.xml 文件,用 notepad++工具打开。在里面搜索:manifest 对应的就是 appPackage。搜索:activity 对应的就是 appActivity。(activity 关键字很多,你要注意辨别。)
方法 4:
使用 python 程序自动解析,具体见自动化脚本
appium 元素定位
与 Web 自动化测试一样,app 自动化测试过程中最重要一个环节就是元素定位,只有准确定位到了元素才能进行相关元素的操作,如输入、点击、拖拽、滑动等。appium 提供了许多元素定位的方法,如 id 定位、name 定位、class 定位、层级定位等等…. 接下来将会给大家来实践运用这些定位技巧。
元素定位方式
- id
- name
- class
- List 定位
- 相对定位
- Xpath 定位
- H5 页面元素定位
- Uiautomator 定位
id 定位
日常生活中身边可能存在相同名字的人,但是每个人的身份证号码是唯一的,在 app 界面元素中也可以使用 id 值来区分不同的元素,然后进行定位操作。Appium 中可以使用 find_element_by_id() 方法来进行 id 定位。
测试场景--自动登陆
- 启动 App,进入到登录界面
- 在登录页面输入用户名“ceshi”,密码‘123456’ 然后点击登录。
driver.find_element_by_id('com.c503.module.chemicalindustrypack:id/tv_account').send_keys("123456")
driver.find_element_by_id('com.c503.module.chemicalindustrypack:id/tv_password').send_keys("123456")
driver.find_element_by_id('com.c503.module.chemicalindustrypack:id/btn_login_in').click()
name 定位
根据 name 进行定位,对于 android 来说,就是 text 属性
用法
driver.find_element_by_name('请输入用户名').send_keys('ceshi')
driver.find_element_by_name('登录').click()
说明:由于 text 稳定性不是很好,所以 appium 1.5 开始废弃了该方法。
classname 定位
classname 定位是根据元素类型来进行定位,但是实际情况中很多元素的 classname 都是相同的,
如上例中登录页面中的用户名和密码都是 clasName 属性值都是:“android.widget.EditText” 因此只能定位第一个元素也就是用户名,而密码输入框就需要使用其他方式来定位,这样其实很鸡肋.一般情况下如果有 id 就不必使用 classname 定位。
driver.find_element_by_class_name('android.widget.EditText').send_keys('ceshi')
driver.find_element_by_class_name('android.widget.EditText').send_keys('123456')
driver.find_element_by_class_name('android.widget.Button').click()
xpath 定位
xpath 定位是一种路径定位方式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径 xpath 执行效率比较低(特别是元素路径比较深的时候),一般使用比较少。通常使用 xpath 相对路径和属性定位。
1.xpath 路径表达式
表达式 | 描述 |
---|---|
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
nodename | 选取此节点的所有子节点。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
2.xpath 匹配符
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
实践案例
driver.find_element_by_id('com.c503.module.chemicalindustrypack:id/tv_password').send_keys("123456") #输入密码
driver.find_element_by_xpath('//android.widget.TextView[@text="主页"]').click() #点击主页按钮
driver.find_element_by_xpath("//android.widget.ImageView").click() #点击第一个图片
扩展资料:xpath 语法
appium 之 Toast 元素识别
问题思考
在日常使用 App 过程中,经常会看到 App 界面有一些弹窗提示(如下图所示)这些提示元素出现后等待 3 秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢?
Toast 简介
Android 中的 Toast 是一种简易的消息提示框。
当视图显示给用户,在应用程序中显示为浮动。和 Dialog 不一样的是,它永远不会获得焦点,无法被点击。
Toast 类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且 Toast 显示的时间有限,一般 3 秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到 Toast 元素的(传说中低调奢华有内涵)。
Appium Toast 内容获取
Add ability to verify TOAST messages (these can’t be interacted with, only text retrieval allowed)
Appium 1.6.3 开始支持识别 Toast 内容,主要是基于 UiAutomator2,因此需要在 Capablity 配置如下参数:
desired_caps['automationName']='uiautomator2'
安装 appium-uiautomator2-driver: 安装命令如下:
cnpm install appium-uiautomator2-driver
安装 selenium 模块
pip install selenium
安装完成后使用如下命令检测是否安装成功
pip show selenium
Name: selenium
Version: 3.11.0
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: c:\python35\lib\site-packages
Requires:
Required-by: Appium-Python-Client
测试场景
进入登录界面输入错误的用户名或者密码,获取 Toast 内容:
- “用户名或密码错误,你还可以尝试 4 次”
- “验证失败次数过多,请 15 分钟后再试”
代码实现
get_toast.py
# coding=utf-8
from find_element.capability import driver
from selenium.webdriver.support.ui import WebDriverWait
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('zxss018')
driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('zxw2018')
driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
error_message="用户名或密码错误,你还可以尝试4次"
limit_message="验证失败次数过多,请15分钟后再试"
message='//*[@text=\'{}\']'.format(error_message)
# message='//*[@text=\'{}\']'.format(limit_message)
toast_element=WebDriverWait(driver,5).until(lambda x:x.find_element_by_xpath(message))
print(toast_element.text)