MacOS系统搭建Appium自动化测试环境

330 阅读4分钟

一、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工作原理

image.png 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:.

配置完成之后,可以使用如下命令进行验证。

image.png

2.2 Android环境

首先,到官网下载Android Studio即Android SDK。Android Studio的下载网址:developer.android.com/studio?hl=z…

 

下载完成之后进行安装,安装成功之后,打开Android Studio的SDK下载SDK,如下所示。

image.png

设置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环境变量配置完成之后,我们可以使用下面的命令进行验证。

image.png

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}"

然后,使用下面的命令查看是否安装成功。

image.png  

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.io/docs/zh/lat…

 

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,会出现如下提示,红框里面没有报错即可,其他的不用关心。

image.png

在命令行中运行appium命令启动appium。

image.png

2.6 安装APPium客户端

从APPium官网下载安装包,下载网址: github.com/appium/appi…。安装完成后点击Start Server按钮。

  image.png 查看页面内容,如果没有报错,那就是成功了。

image.png

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),你应该看到新安装的驱动被列为可用。

image.png

三、编写测试

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);

这段代码正在执行以下操作:

  1. 定义一组 "Capabilities" 能力值(参数),以便 Appium 知道您想自动执行哪种任务。 要自动执行的任务。
  2. 在内置的 Android 设置应用程序上启动 Appium 会话。
  3. 找到 "Battery"列表项并点击它。
  4. 停顿片刻,纯粹是为了观察自动化视觉效果。
  5. 结束 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()

基本上,这段代码正在做以下事情:

  1. 定义一组“Capabilities”(参数),发送到Appium服务器,以便Appium知道你想要自动化的事物类型。
  2. 在内置的 Android 设置应用程序上启动 Appium 会话。
  3. 查找“Battery”列表项并点击它。
  4. 停顿片刻,纯粹是为了观察自动化视觉效果。。
  5. 结束Appium会话。

 

最后,另一个终端会话中运行Appium 服务器。 然后,执行上面的脚本。

python test.py

3.3 Java

Appium 团队为 Java 编程语言维护一个官方客户端. 它是建立在 Selenium上的. 您也可以在 Kotlin 项目中使用该客户端。

 

Appium Java 客户端有专门的类来支持大多数官方 Appium 驱动程序。对于其他驱动程序 您只需使用 AppiumDriver类 或在此基础上创建您的自定义衍生工具。具体请参考使用实例:github.com/appium/java…