美文网首页
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