一、Appium简介
1.1 什么是APPium
APPium是一个开源测试自动化框架,适用于原生、混合或移动Web应用程序的自动化测试工具。 APPium使用WebDriver协议驱动iOS、Android等应用程序。
APPium具有如下特点:
- 支持多平台(Android、iOS等)。
- 支持多语言(python、java、ruby、js、c#等)。
- APPium是跨平台的,可以用在OSX,Windows以及Linux桌面系统上运行。
- APPium选择了Client/Server的设计模式。只要client能够发送http请求给server,那么client用什么语言来实现都是可以的,这也是它支持多语言的原因。
- APPium基于WebDriver协议,并进行了扩展。这样的好处是可以直接继承WebDriver API,Selenium(WebDriver)各种语言的binding都可以直接拿来使用,省去了为每种语言开发一个client的工作量。
1.2 APPium工作原理
APPium是C/S架构的。 左边是客户端的测试脚本,中间的APPium server是基于webdriver协议添加对移动设备自动化API扩展而成的。右边的Bootstrap.jar是APPium 在初始化时推送到Android手机上的一个UiAutomator测试脚本;
APPium首先在服务端开启一个监听4723端口的server,接收测试脚本发送过来的对应请求,再将对应的请求发送给中间件Bootstrap.jar;Bootstrap监听4724端口由APPium发送过来的相关请求,并将请求转换成UiAutomator可以识别的命令发给UiAutomator进行处理,实现自动化测试;
最后Bootstrap将执行的结果返回给APPium Server,APPium Server再将测试结果返回给客户端。
二、安装APPium
安装APPium总体需要以下步骤:安装JDK,Android SDK,APPium-Python-Client包,NodeJS,以及APPium安装包,以下依次介绍各软件的安装过程。
2.1 安装JDK
首先,从Oracle官网下载JDK并安装,下载网址:www.oracle.com/java/techno…。
安装成功之后,需要在本地配置一下环境变量,如Mac的环境变量配置如下:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
配置完成之后,可以使用如下命令进行验证。
2.2 Android环境
首先,到官网下载Android Studio即Android SDK。Android Studio的下载网址:developer.android.com/studio?hl=z…。
下载完成之后进行安装,安装成功之后,打开Android Studio的SDK下载SDK,如下所示。
设置ANDROID_HOME路径为Android-SDK的安装目录,并将tools, platform-tools及build-tools添加到环境变量。
export ANDROID_HOME=/Users/xianghong/Library/Android/sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
Android环境变量配置完成之后,我们可以使用下面的命令进行验证。
2.3 安装Python
首先,从官网下载python,安装并设置环境变量。下载网址:www.python.org/downloads/。
安装完成之后,设置PYTHON_HOME为Python的安装路径,并将PYTHON_HOME及其路径下的Scripts添加到path环境变量。
export PATH="/Library/Frameworks/Python.framework/Versions/3.12/bin:${PATH}"
然后,使用下面的命令查看是否安装成功。
2.4 安装Node.js
首先,从Node官网下载Node.js,下载网址: nodejs.org/en/。下载完成后,直接点击应用程序,按照默认选项一键安装。
同样的,为了方便直接使用Node命令,需要配置下环境变量,如下所示。
export NODE_HOME='/usr/local/bin/node'
export PATH="$PATH:$NODE_HOME/bin/"
2.5 安装APPium
Appium 分为两个版本,一个是有界面的Appium(下载安装文件即可安装),一个是无界面的命令行版本(需要命令安装),建议都安装上。
- 有界面的Appium Desktop:包含 appium 服务,录制工具,查看页面布局及查找元素的功能。
- 无界面的Appium:只提供了appium服务功能。
官方推荐直接使用npm 命令进行安装。
npm install -g appium
//或者指定版本
npm install -g appium@2.0.0
接下来,安装appium-doctor插件,该插件可以检查appium环境是否安装成功。
npm install -g appium-doctor
安装完成,可以打开一个新的命令行窗口(Mac 上是Terminal),输入 appium-doctor,会出现如下提示,红框里面没有报错即可,其他的不用关心。
在命令行中运行appium命令启动appium。
2.6 安装APPium客户端
从APPium官网下载安装包,下载网址: github.com/appium/appi…。安装完成后点击Start Server按钮。
查看页面内容,如果没有报错,那就是成功了。
2.7 安装 UiAutomator2 驱动
如果没有驱动,你几乎无法使用 Appium,驱动是允许 Appium 自动化特定平台的接口。由于 UiAutomator2 驱动是由核心 Appium 团队维护的,它有一个官方的驱动名称,你可以通过 Appium 扩展 CLI 轻松安装,安装命令如下。
appium driver install uiautomator2
//或者指定版本
appium driver install uiautomator2@2.25.3
正常安装时,应该产生类似下面的输出:
Attempting to find and install driver 'uiautomator2'
✔ Installing 'uiautomator2' using NPM install spec 'appium-uiautomator2-driver'
Driver uiautomator2@2.0.5 successfully installed
- automationName: UiAutomator2
- platformNames: ["Android"]
再次启动 Appium 服务器(运行 appium),你应该看到新安装的驱动被列为可用。
三、编写测试
3.1 JavaScript
要在 JavaScript(Node.js)中编写 Appium 测试,我们需要选择一个与 Appium 兼容的客户端 库。维护最好的库和 Appium 团队推荐使用的库是 WebdriverIO。既然我们已经安装了 Appium,我们已经满足了 Node 和 NPM 的要求。因此,只需在计算机上创建一个新的项目目录 然后在其中初始化一个新的 Node.js 项目。
npm init
然后,在项目中安装webdriverio 软件包。
npm i --save-dev webdriverio
现在是编写测试本身的时候了。创建一个名为 test.js 的新文件,内容如下:
const {remote} = require('webdriverio');
const capabilities = {
platformName: 'Android',
'appium:automationName': 'UiAutomator2',
'appium:deviceName': 'Android',
'appium:appPackage': 'com.android.settings',
'appium:appActivity': '.Settings',
};
const wdOpts = {
hostname: process.env.APPIUM_HOST || 'localhost',
port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
logLevel: 'info',
capabilities,
};
async function runTest() {
const driver = await remote(wdOpts);
try {
const batteryItem = await driver.$('//*[@text="Battery"]');
await batteryItem.click();
} finally {
await driver.pause(1000);
await driver.deleteSession();
}
}
runTest().catch(console.error);
这段代码正在执行以下操作:
- 定义一组 "Capabilities" 能力值(参数),以便 Appium 知道您想自动执行哪种任务。 要自动执行的任务。
- 在内置的 Android 设置应用程序上启动 Appium 会话。
- 找到 "Battery"列表项并点击它。
- 停顿片刻,纯粹是为了观察自动化视觉效果。
- 结束 Appium 会话。
最后,另一个终端会话中运行Appium 服务器。 然后,执行上面的脚本。
node test.js
示例代码参考:github.com/appium/appi…
3.2 Python
Appium Python Client 是官方的Appium Python客户端,可通过pypi里包名为Appium-Python-Client进行安装。 它继承自 Selenium Python Binding, 因此安装Appium Python客户端时会包含selenium绑定。
pip install Appium-Python-Client
接下来,我们编写一个测试用例。
import unittest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='Android',
appPackage='com.android.settings',
appActivity='.Settings',
language='en',
locale='US'
)
appium_server_url = 'http://localhost:4723'
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
def tearDown(self) -> None:
if self.driver:
self.driver.quit()
def test_find_battery(self) -> None:
el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]')
el.click()
if __name__ == '__main__':
unittest.main()
基本上,这段代码正在做以下事情:
- 定义一组“Capabilities”(参数),发送到Appium服务器,以便Appium知道你想要自动化的事物类型。
- 在内置的 Android 设置应用程序上启动 Appium 会话。
- 查找“Battery”列表项并点击它。
- 停顿片刻,纯粹是为了观察自动化视觉效果。。
- 结束Appium会话。
最后,另一个终端会话中运行Appium 服务器。 然后,执行上面的脚本。
python test.py
3.3 Java
Appium 团队为 Java 编程语言维护一个官方客户端. 它是建立在 Selenium上的. 您也可以在 Kotlin 项目中使用该客户端。
Appium Java 客户端有专门的类来支持大多数官方 Appium 驱动程序。对于其他驱动程序 您只需使用 AppiumDriver类 或在此基础上创建您的自定义衍生工具。具体请参考使用实例:github.com/appium/java…