23
07

使用Appium测试Android应用程序

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

实验简介



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) 安装“夜神”模拟器,至官网“https://www.yeshen.com/”下载并安装即可。

 

2. 安装Android SDK


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

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


20180202_172622_469.png 


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

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

 

3. 安装Appium


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

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

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


20180202_172636_050.png 

 

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


20180202_172648_409.png 

 

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


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

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

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


   20180202_172706_618.jpg

 

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将为我们显示主包名主类名。


20180202_172716_066.png 

 

(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具体的截图效果如图所示。


20180202_172727_519.png 

 

8. 启动Appium

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


20180202_172740_835.png 

 

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在功能上的差异。

 





为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。

20181009_153045_341.jpg


版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/74