美文网首页
Appium初步,从安装到使用Junit

Appium初步,从安装到使用Junit

作者: c4a1d989518e | 来源:发表于2017-05-17 10:17 被阅读550次

Appium架构

Appium是一个C/S 架构,所谓的C/S架构,就是一个Clicent和一个Server端,这个Appium就是那个Server端,我们在一个编辑器中编辑的测试代码就是一个Clicent端。这个Appium为这个客户端提供一套接口,需要注意的一点是,测试代码是不能直接控制我们要测试的机器上的,需要用Appium作为中间的代理去控制。

Appium环境搭建

以安卓的测试环境搭建为例,要测试安卓,安卓是用Java语言开发的,Java环境得安装吧!安卓的开发,sdk肯定少不了吧,Appium是用nodejs写的,nodejs环境肯定少不了吧。说到Appium的安装,其实对于新手来说,可以先不用考虑那种命令行的开发方式,直接去安装那个有图形化界面的软件就好了,Appium各个版本下载地址这个软件包含了Appium运行时的各种依赖,就不用单独再去装Node.js了,安装好了以后,是这样

Appium界面

其他的先不用注意,其中Launch是启动,点击以后,就开启了服务器,点击那个安卓的图标,


Android配置

我在这里遇到的一个最大的坑,说来惭愧,就是其中的Launch AVD,里面找不到我的连接设备,或者找不到模拟设备,可是用adb devices查看的时候,设备明明都有连接,这里,其实解决方法就是,不用管!不要勾选Launch AVD,Appium会自动的去到连接里设备里执行相应的代码,只不过连接设备在Lanuch AVD这里不显示。最大的坑迈过去以后,后面对我来说,其实就不算很难了,剩下的操作,基本在半天内可以掌握。
对了,查看环境搭建好,可以点击面板上那个医生诊断听胸的那个工具,点击以后会出现如下图片

环境搭建

从这张图中,可以看出我的ANDROID_HOME还没有添加到系统环境,所有我们要到环境中去添加,打开终端,

ls -a  //列出所有文件
vim .bash_profile 

在.bash_profile中添加

export ANDROID_HOME=/YOUR_PATH_TO/android-sdk
export PATH=$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/tools:$PATH

然后保存执行

source ~/.bash_profile

配置Java开发环境

我用的是eclipse编写自动化测试代码,这里就拿eclipse举例子好了。具体步骤可以分为三步:
1、新建Java项目
2、下载 Appium java clientSelenium Java standalone server 这两个jar包。
3、在项目的 build path 中通过 “Add External Archives” 添加第一步下载的两个 jar 文件,以及通过 “Add Library” 添加 Junit4 这个 Library 。我们后续会用到。
添加完成后的 build path 如下图:

buid path

牛刀小试

先来个例子体验下学有所用的快感,首先去Appium客户端去Launch,服务器开好以后,就可以写测试代码了,
1、首先,我们在 Eclipse 里面新建一个带有 main 方法的类(勾选“public static void main(String[] args)”),类名为 OpenAndCloseApplication。如无意外,建立后的文件内容应该如下:

public class OpenAndCloseApplication {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

2、在其中添加Desired Capabilities,这个Desired Capabilities是干什么用的,这个东西是传给Appium服务器的一些参数,告诉服务器,我要在具备这些的条件下,执行测试命令

import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.android.AndroidDriver;
...

    public static void main(String[] args) {
        DesiredCapabilities capabilities = new DesiredCapabilities();

        capabilities.setCapability("deviceName", "Android Device");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("platformVersion", "4.4");
       
    }

这几个Capabilities应该是必须的,少一个你可以试试,根据需要,还可以添加Desired Capabilities

关键字 描述 实例
platformName 手机操作系统 iOS,Android,FirefoxOS
platformVersion 手机操作系统版本 例如: 7.1, 4.4
deviceName 手机类型或模拟器类型 iPhone Simulator, iPad Simulator, Android Emulator, Galaxy S4等。在 iOS 上,这个关键字的值必须是使用 instruments -s devices 得到的可使用的设备名称之一。在 Android 上,这个关键字目前不起作用。
app .ipa 或者 .apk(也可以使是包含他们的zip)文件所在的本地绝对路径或者远程路径 Appium会先尝试安装路径对应的应用在适当的真机或模拟器上。针对Android系统,如果你指定app-package和app-activity(具体见下面)的话,那么就可以不指定app。
browserName 需要进行自动化测试的手机 web 浏览器名称。如果是对应用进行自动化测试,这个关键字的值应为空。 iOS 系统上可以用 ‘Safari‘ ,Android 系统上可以用 ‘Chrome‘, ‘Chromium‘, 或 ‘Browser‘。
automationName 自动化测试引擎 Appium,Selendroid
appActivity 要从应用包中启动的 Android Activity 名称。 它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity) MainActivity, .Settings
appPackage 你想运行的Android应用的包名 比如com.example.android.myApp
appWaitActivity 你想要等待启动的 Android Activity 名称 SplashActivity
unicodeKeyboard 是否在测试过程中切换到能支持多国语言输入的输入法 true 表示是,false 表示否
resetKeyboard 是否在测试完成后自动切换回原有输入法 true 表示是,false 表示否

3、添加操作应用的代码

...
        capabilities.setCapability("platformVersion", "4.4");
        
        // 根据 Desired Capabilities 打开应用
        AndroidDriver driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

        // 什么都不做,程序暂停5秒
        Thread.sleep(5000);

        // 关闭应用
        driver.quit();
    }

这个代码是为了好看,放在这里了,可能URL那里会报找不到这个类,这时候可以根据提示引入相应的库,并根据提示调整,加上判断,调整的程序没有错误以后,就可以运行代码了。

元素定位

元素定位一般用UIAutomatorViewer,UIAutomatorViewer是sdk中的一个专门用来定位元素的工具,这种定位方式其实挺常见,和HTML中的XPath用法有些类似。
要使用这个工具,首先要打开,这个工具的位置在\sdk\tools下,打开就好了,定位当前页面的元素,就可以点击左上角的第二个那个三个手机重叠的按钮

UIAutomatorViewer

查找元素有若干种方法,其中我自己最常用的是两个:

通过id定位,查看元素的id就是在图中右下角resource—id,那个Button1就是

driver.findElement(By.id("id"));

通过xpath定位

driver.findElementByXPath("//android.widget.TextView[contains(@text,'xpathname')]");

终于可以编写测试脚本

我们在 Eclipse 里面新建一个带有 main 方法的类(勾选“public static void main(String[] args)”),类名为 ToDoListTest
其中的代码如下:

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

public class ToDoListTest {

    public static void main(String[] args) throws MalformedURLException {

        

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName", "Android Device");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("platformVersion", "4.4");
        capabilities.setCapability("appPackage","com.example.mac.button");
        capabilities.setCapability("appActivity", ".MainActivity");
       
        capabilities.setCapability("unicodeKeyboard", true);
        capabilities.setCapability("resetKeyboard", true);
        AndroidDriver driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

        // Add new item
        String itemText="使用 Appium 编写测试脚本";
        WebElement editText = driver.findElement(By.id("com.example.mac.button:id/edit1"));
        editText.sendKeys(itemText);
        WebElement addItemBtn = driver.findElement(By.id("com.example.mac.button:id/Button1"));
        addItemBtn.click();

        // Check if item is added
        List<AndroidElement> appiumItems = driver.findElementsByXPath("//android.widget.EditText[@text='"+itemText+"']");
        if (appiumItems.isEmpty()) {
            System.out.println("测试失败");
        }else{
            System.out.println("测试通过");
        }

        // exist
        driver.quit();

    }
}

这段代码中其实主要包含三个部分,传Capabilites,添加操作事件,还有就是验证结果。

测试框架Junit

Junit是一个专门用来测试安卓的框架,我们上面的代码是一段具有“普世”价值的代码,但是如果测试用例多了起来,并不好管理,也不好出具测试报告,遇到这种,还是需要工程化的方法来解决,这时候就需要用到框架了。
代码:

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

public class Junit {
    private AndroidDriver driver;

    @Before
    public void setUp() throws Exception {
        // Install and open application
        
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName", "Android Device");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("platformVersion", "4.4");
        capabilities.setCapability("appPackage","com.example.mac.button");
        capabilities.setCapability("appActivity", ".MainActivity");
        capabilities.setCapability("unicodeKeyboard", true);
        capabilities.setCapability("resetKeyboard", true);
        driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    }
    @After
    public void tearDown() throws Exception {
        driver.quit();
    }

    @Test
    public void addItem(){
        String itemText = "使用 Appium 编写测试脚本";    

        // Add new item
       
        WebElement editText = driver.findElement(By.id("com.example.mac.button:id/edit1"));
        editText.sendKeys(itemText);
        WebElement addItemBtn = driver.findElement(By.id("com.example.mac.button:id/Button1"));
        addItemBtn.click();

        // Check if item is added
        List<AndroidElement> appiumItems = driver.findElementsByXPath("//android.widget.EditText[@text='"+itemText+"']");
        Assert.assertEquals("找不到待办事项 '"+itemText+"'", false, appiumItems.isEmpty());
    }
}

其中import了junit,其他的看起来好像差别不大,运行在eclipse上以后,可以在左上角看到,

Junit
是不是好看正规了很多
文章参考
gitbook-Appium Girl学习指南
testerhome
网易云课堂0基础上手Appium做安卓自动化测试

相关文章

网友评论

      本文标题:Appium初步,从安装到使用Junit

      本文链接:https://www.haomeiwen.com/subject/xrcdtxtx.html