自动化工具之Appium工具简单介绍

1,645 阅读6分钟

背景

自动化,性能测试,接口测试,开发平台等工作,到底测试的价值在哪里,其实价值来源不断充实与为大众服务,今天简单介绍ui小工具appium攻击。

简单介绍

Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。“移动原生应用”是指那些用 iOS SDK 或者 Android SDK 写的应用。所谓的“移动web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。所谓的“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。Appium既能在window安装也能在mac上安装,但是wind上只能跑安卓设备,Mac上能跑安卓与IOS两个设备。

Guihub:You can write tests with your favorite dev tools using any WebDriver-compatible language such as Java, Objective-C, JavaScript (Node), PHP, Python, Ruby, C#, Clojure, or Perl with the Selenium WebDriver API and language-specific client libraries. Appium源码地址:github.com/appium/appi…

架构图

来自网络

微信图片_20210514150120.png

UI自动收益

任何UI自动测试都不能完部替代人工测试,收益率高不高看部门怎么使用任何工具使用都是两方看怎么使用,如果有重复的工作每次需要人工去回归,建议使用自动化去回归,部门大家都用自动使用,会让大家的心信提高因为每次都机会使用自己写的脚本去验证自己重复工作。

脚本维护成本真的高吗?大家都说成本高,自己是否真的维护过,写过脚本?如果没有写过,没有维护过,没有发言权。只有自己用了才知道是否高。

内容概要

今天咱们使用windos搭建appium自动化,使用java语言做脚本语言,内容会简单介绍安装,定位,使用还有简单框架跑起来,为了节约大家时间先告诉大家本文文章主要内容是什么,这样方便是否选择看下去。希望对没有做自动化的一点启示。

  • 环境安装 Android
  • 常用操作
  • 元素定位(原生)
  • 简单java demo使用
  • 简单框架设计
  • 报告二次封装
  • 环境安装

桌面版本安装 打开下面链接选择版本为exe进行下载: github.com/appium/appi…

微信图片_20210514153959.png 微信图片_20210514150132.png

下载安装后

微信图片_20210514150139.jpg 点击启动:

微信图片_20210514150146.png

DOS命令安装

安装jdk 下载: www.oracle.com/technetwork… 配置环境变量:如果不会配置自己百度查询桌面配置 JAVA_HOME: JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_181

%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

CLASSPATH:

.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar java -version验证:

java version "1.8.0_181"

Java(TM) SE Runtime Environment (build 1.8.0_181-b13)

Java HotSpot(TM) Client VM (build 25.181-b13, mixed mode, sharing) 安装sdk android-sdk.en.softonic.com/ android-sdk.en.softonic.com/download 配置环境变量: ANDROID_HOME

C:\Program Files (x86)\android-sdk-windows

Path:

;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools 下载node: nodejs.cn/download/ 安装appium npm install -g appium 如果上面下载比较慢可以使用如下命名: cnpm安装:

npm install -g cnpm --registry=registry.npm.taobao.org

cnpm install -g appium --no-cache

cnpm i appium-doctor

appium -v 安装验证环境命令: appium-doctor 执行命令验证是否成功:

微信图片_20210514150153.jpg Appium版本检查与运行显示:

微信图片_20210514150157.jpg 注意:如果上面环境没有配置,请百度自己查询

常用操作

点击 click()

输入

sendKeys(CharSequence... keysToSend);

清除

clear()

长按

 /**
 * 购物车商品图片
 * 长按
 * @param driver
 */
public void cartSingleProductImage(AndroidDriver<AndroidElement> driver, String coordinate) {
    WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(coordinate), "长按购物车商品图片-弹出收藏与删除浮层");
    element = driver.findElement(getByLocator.getLocatorApp(coordinate));

    int x = element.getLocation().getX();
    int y = element.getLocation().getY();
    TouchAction action = new TouchAction(driver);
    //长按
    action.longPress(PointOption.point(x, y)).release().perform();}

滑动

   WebElement webElement = null;
    try {
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        webElement = driver.findElementByAndroidUIAutomator(
                "new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text(\"See more details\"))");
    } catch (Exception e) {
        e.printStackTrace();
    }

上下左右滑动

最简单的下滑命令行:

uuid表示手机设备号

adb -s " + uuid + " shell input touchscreen swipe 400 800 400 400

/**

 * 滑动方法
 *
 * @param driver
 * @param direction up、down、left、right
 */

static Duration duration = Duration.ofSeconds(1);

 public static void swipe ( AndroidDriver<AndroidElement> driver,String direction){
    
    switch(direction.toLowerCase()){
        
        case "up":
            SwipeUp(driver);
            break;
        case"down":
            SwipeDown(driver);
            break;
        case"left":
            SwipeLeft(driver);
            break;
        case"right":
            SwipeRight(driver);
            break;
        default:
            System.out.println("方向参数不对,只能是up、down、left、right");
            break;
    }
}

/**

 * 上滑
 *
 * @param driver
 */

public static void SwipeUp (AndroidDriver driver) {

 try{
        
   Thread.sleep(1000);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    Dimension size = driver.manage().window().getSize();
    intheight = size.height;
    int width =size.width;
    newTouchAction(driver).longPress(PointOption.point(width / 2,100))
            .moveTo(PointOption.point(width / 2, height - 100)).release()                
            .perform();  
            
   }

/**

 * 下滑
 *
 * @param driver
 */

public static void SwipeDown(AndroidDrive<AndroidElement> driver){
    
  try{
        Thread.sleep(1000);
    }
    catch(InterruptedException e){
        e.printStackTrace();
    }
    Dimension size = driver.manage().window().getSize();
    int height = size.height;
    int width = size.width;
    new TouchAction(driver)
            .longPress(PointOption.point(width /2, height -100))
            .moveTo(PointOption.point(width /2, 100)).release().perform();
}

/**

 * 左滑
 *
 * @param driver
 */


public static void SwipeLeft(AndroidDriver<AndroidElement> driver) {

    try{
        Thread.sleep(1000);
    } catch(InterruptedException e) {            e.printStackTrace();
    }
    Dimension size = driver.manage().window().getSize();
    int height = size.height;
    int width =size.width;        
    new TouchAction(driver)
            .longPress(PointOption.point(width - 100, height / 2))              .moveTo(PointOption.point(100, height /2)).release().perform();
}

/**

 * 右滑
 *
 * @param driver
 */

public static void SwipeRight(AndroidDriver<AndroidElement> driver){
    try{
        Thread.sleep(1000);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    Dimension size = driver.manage().window().getSize();        
    int height = size.height;
    int width = size.width;
    new TouchAction(driver).longPress(PointOption.point(100, height /2))
            .moveTo(PointOption.point(width -100, height / 2)).release()                
            .perform();    
            }

获取属性

getAttribute()

获取文本

getText()

获取资源

getPageSource()

元素定位

两种方式:一种使用skd中的【uiautomatorviewer.bat】进行元素定位

打开:

微信图片_20210514161601.png 微信图片_20210514151316.jpg

双击uiautomatorviewer.bat即可弹出:

微信图片_20210514150206.jpg

在操作上面之前需要链接手机或者链接模拟器并操作命令显示:adb devices 如果是模拟器需要先链接:adb connect 127.0.0.1:62001这样再次链接

微信图片_20210514150211.png

模拟器链接显示:

微信图片_20210514150214.png

点击sdk中的【uiautomatorviewer.bat】

微信图片_20210514151734.png

微信图片_20210514150224.png

链接成功显示:

微信图片_20210514150229.jpg

上面操作说明:

鼠标点击某个控件就会提示该控件可操作的相应内容:

微信图片_20210514150233.jpg

说明: 其实在做移动端自动化测试,定位方式很少基本就是id/name/xpath/坐标等定位方式:

定位方式

Id定位:

微信图片_20210514150239.jpg

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

name定位

微信图片_20210514150243.png

 driver.findElement(By.name("xxxxxx")).click();

xpath定位

xpath定位是最常用的一种方式,可以去学习下xpath语法:www.w3school.com.cn/xpath/xpath… 但是网上也有大牛做一个插件,做ui自动化可直接使用:github.com/lazytesttea… 大家下载后替换sdk中的uiautomatorviewer.jar就可使用,点击 uiautomatorviewer.bat再次弹出如下:

微信图片_20210514150249.jpg

  driver.findElement(By.xpath("xxxxxx")).click();

第二种定位方式:

目前这中方式是可以定位h5页面操作

启动:

微信图片_20210514150254.jpg 点击:

微信图片_20210514150300.png

再弹出对话中输入:

微信图片_20210514150305.jpg

在下面选项框中输入:

需要获取appPackage与appActivity

使用命令:

 aapt d badging pinduoduov4.76.0_downcc.com.apk |findstr "package launchable-activity"

获取结果:

微信图片_20210514150309.jpg

{

"platformName": "Android",

"deviceName": "127.0.0.1:62001",

"appPackage": "com.xunmeng.pinduoduo",

"appActivity": "com.xunmeng.pinduoduo.ui.activity.MainFrameActivity"

}

点击启动

微信图片_20210514150315.jpg

显示正在启动

微信图片_20210514150318.jpg 启动完毕显示:

微信图片_20210514150322.jpg

启动完毕,剩下的就是常用与其他操作一样

微信图片_20210514150325.jpg

注意: 如果在启动的时候有问题,自己微调下。 总结:

   使用maven建立项目,通过tesng做测试类与传参,以上简单介绍了环境部署,定位方式,启动类,报告类等方法。
    在实际工作中这些远远是不够,但对与入门做参考和基础工程框架还是可以参考,如果想在运行测试类的时直接启动服务端需要参考命名怎么启动:可以参考https://www.cnblogs.com/yc-c/p/9015621.html 博客;有命令,就可以通过上面介绍的dos工具类启动服务端。

不足点:本次只是安卓端没有介绍H5怎么测试怎么定位,IOS怎么部署。