首发于强哥学堂
工具应用:使用Appium测试Android应用程序

工具应用:使用Appium测试Android应用程序

实验简介

Selenium中的WebDriver目前已经成为了Web页面的GUI级自动化测试的标准,已经被万维网协议认可。所以,由此衍生出了用于测试Windows应用程序的Winium,以及用于测试移动端App应用程序的Appium。本实验主要为大家讲解如何使用Appium完成对一个Android上的App应用程序进行测试。

实验目的

(1)掌握Appium测试环境的安装配置。

(2)熟练应用常见的ADB命令功能及用法。

(3)熟练使用Android SDK及Android模拟器。

(4)熟练使用Appium的核心对象进行自动化测试开发。

实验流程

1.Appium环境配置清单

要正常运行Appium完成对App的自动化测试,需要配置以下环境:

(1)Android SDK,用于执行ADB命令完成与Android的通信,并且利用SDK自带的工具来识别App界面上的元素属性。

(2)Appium:实现了WebDriver协议的服务器,这当然是必不可少的组件。

(3)下载Appium的针对Java的jar包,并在Eclipse项目中导入该jar包,名称为:“java-client-xxx.jar”。

(4)在项目中同样需要导入Selenium的jar包,这一步我们已经在学习Selenium的过程中完成。

(5)安装“夜神”模拟器,至官网“yeshen.com/”下载并安装即可。

2.安装Android SDK

(1)访问网址“tools.android-studio.org”下载与操作系统版本对应的Android SDK压缩包,并解压到操作系统任意目录即可。目前最新的SDK版本为24.4.1。

(2)配置环境变量“ANDROID_HOME”并设置到该SDK的主目录,如图所示。

(3)将“ANDROID_HOME”目录下的“tools”和“platform-tools”添加到“PATH”环境变量中。

(4)打开命令行,运行命令“adb version”,如果正常运行,说明SDK已经配置完成。

3.安装Appium

(1)目前Appium提供两个版本,一个是Appium的Desktop版本,可在“github.com/appium/ appium-desktop/”下载,目前的最新版本为“1.2.0-beta.3”。另外一个是早期的传统版本,可在“bitbucket.org/appium/ap”下载,目前针对Windows的最新版本是在2015年发布的“1.4.16”。笔者更喜欢早期的版本,提供的功能更加丰富,后续操作将基于早期的版本进行。

(2)访问“appium.io/downloads.htm”下载针对Java的开发包。

(3)正常安装Appium,可以安装在任意目录中。启动Appium的界面如图所示。

(4)点击右上角的三角形按钮便可启动Appium服务器。默认情况下Appium使用4723端口来与测试代码进行通信,通常一个端口可以与一台Android设备或模拟器绑定,如果要同时对同台设备发起测试,那么我们可以通过修改不同的端口启动多个Appium服务即可。

4.安装夜神模拟器及被测应用

(1)直接去夜神模拟器官网下载并安装模拟器。安装完成后直接电脑上启动。

(2)打开命令行,运行“adb devices”确认模拟器出现在列表中。

(3)安装“一笔记账”和“小米计算器”等应用程序,后续实验以该应用为大家做演示。

5.ADB常用命令列表

(1)adb devices:显示当前运行的全部模拟器。

(2)adb -s 模拟器编号 命令:对某一模拟器执行命令。

(3)adb install -r 应用程序.apk:安装应用程序。

(4)adb uninstall apk主包名:卸载应用程序。

(5)adb pull <remote> <local>:获取模拟器中的文件。

(6)adb push <local> <remote>:向模拟器中写文件。

(7)adb shell:进入模拟器的shell模式,可直接运行Linux命令。

(8)adb uninstall apk主包名:卸载应用程序。

(9)adb shell am start -n 主包名/包名+类名:启动应用程序。

(10)adb forward tcp:5555 tcp:8000:设置任意的端口号,作为主机向模拟器或设备的请求端口。

6.利用Appium查看APK的主包名和类名

(1)打开Appium,点击最左上角的“Android Settings”按钮。

(2)勾选“Application Path”,并浏览到指定的APK文件。Appium将为我们显示主包名主类名。

(3)这个主包名和类包将用于后续Appium的代码中,当然,我们也可以使用am start命令直接在命令行启动应用程序,则命令可以写为“adb shell am start -n com.miui.calculator/.cal. CalculatorActivity”。如果没有这两个属性,我们将无法让Appium来启动被测应用。

7.利用uiautomatorviewer识别对象属性

Uiautomatorviewer是SDK中内置的一个对象识别工具,比如我们在模拟器中将小米计算器启动后,在SDK\tools目录下运行“uiautomatorviewer.bat”即可打开该工具,并点击工具栏上的“Device Screenshot”按钮可以直接获取到模拟器中当前应用程序界面的元素及属性。通常我们可以组合使用以下几类属性来进行元素定位:

(1)Index:指示当前元素在界面中的所有具有相同class属性的元素中的顺序。

(2)Text:当前元素上显示的文本内容。

(3)Resource-id:元素的ID号。

(4)Class:元素所性的class。

(5)Content-desc:元素的一些动态内容描述。

(6)组合:综合使用上述属性,完成对元素的定位。

Uiautomatorviewer具体的截图效果如图所示。

8.启动Appium

保持Appium的默认设置,点击右上角的三角形按钮启动即可,如果出现错误,则查看错误消息定位问题,正常情况下的启动消息如图所示。

9.对小米计算器进行测试

(1)创建一个Eclipse的标准Java项目,命名为“AnroidTest”。

(2)为当前项目导入Appium的Java Client包和Selenium包。

具体的实现代码如下:
package com.woniuxy.appium;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.android.AndroidDriver;

public class XiaomiCalc {

	// 定义设备兼容性设置对象,用于设置Appium运行参数
	DesiredCapabilities capabilities = new DesiredCapabilities();
 
 public static void main(String[] args) {
		XiaomiCalc calc = new XiaomiCalc();
		calc.init();
		calc.startTest();
	}

 public void init() {
		// 如果模拟器中没有安装该应用,可以配置为自动安装,如果已经安装,可以不用配置
		File classpathRoot = new File(System.getProperty("user.dir"));
        File appDir = new File(classpathRoot, "app");
        File app = new File(appDir, "com.miui.calculator.apk");
 
        // 定义本次执行的设备参数
        capabilities.setCapability("deviceName","Appium");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("platformVersion", "6.0");
        // 如果应用程序已经安装,则无需设置该参数
        capabilities.setCapability("app", app.getAbsolutePath());
 
        // 运行的被测程序的主包名和主类名,必须正确,否则无法启动
        capabilities.setCapability("appPackage", "com.miui.calculator");
        capabilities.setCapability("appActivity", ".cal.CalculatorActivity");
	}
 
 public void startTest() {
		AndroidDriver<WebElement> driver = null;
 try {
        	// 其中URL地址为Appium服务器的URL地址,端口4723是默认端口
        	driver = new AndroidDriver<WebElement>(
 new URL("http://127.0.0.1:4723/wd/hub/"), capabilities);
        	driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        	Thread.sleep(5000);
 
        	driver.findElementById("btn_9").click();
        	driver.findElementById("btn_plus").click();
        	// 或使用未经二次封装的标准WebDriver方法操作对象
        	driver.findElement(By.id("btn_3")).click();
        	// driver.findElementById("btn_3").click();
        	driver.findElementByXPath("//android.widget.
ImageView[contains(@content-desc,'等于')]").click();
 
        	List<WebElement> allText = 
driver.findElementsByClassName("android.widget.TextView");
 boolean isOk = false;
 for (int i=0; i<allText.size(); i++) {
        		System.out.println(allText.get(i).getText());
        		// 由于第一次无法根据元素的ClassName确定顺序,所以使用遍历的方式进行断言
 if (allText.get(i).getText().equals("12")) {
        			isOk = true;
 break;
        		}
        	}
 if (isOk)  System.out.println("测试成功.");
 else System.out.println("测试失败.");
        }
 catch (Exception e) {
        	System.out.println(e.getMessage());
        }
	}
}

从上述代码中我们可以看出,所有的操作与Selenium WebDriver几乎是一模一样的,对于其中的用法一点都不陌生。

10.利用Appium实现滚屏

滚屏是应用程序中经常会用到的功能,其基本操作原理很简单,就是鼠标按住某个坐标点,然后移动到另外一个坐标点上释放即可。在Appium中直接可以调用方法swipe实现滚屏,并且可以指定在多长时间内完成操作,具体代码如下:

int width = driver.manage().window().getSize().getWidth();
int height = driver.manage().window().getSize().getHeight();
driver.swipe(width/2, (int)(height*0.8), width/2, (int)(height*0.2), 2000);

思考练习

(1)请利用Appium完成对“一笔记账”应用程序的测试脚本开发。

(2)请分别对一个原生应用,一个混合应用进行测试脚本开发,看看其差别。

(3)请查阅文档,对比Appium与Selenium在功能上的差异。

编辑于 2018-12-21

文章被以下专栏收录