美文网首页
Appium 控件封装

Appium 控件封装

作者: 长新 | 来源:发表于2017-08-06 13:01 被阅读285次

    我们在做Andorid 自动化测试时,用到最多的操作就是点击,输入,验证,滑动之类的,针对这些常用的操作我们可以进行二次封装

    相信从事自动化测试的同仁都用过如下代码

    找到指定控件并时行单击事件

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

    其实这行代码我们是可以提取一部分代码进行二次封装,我们都知道元素定位有很多种,有id ,有name 如果换了一种定位方式,按上面代码就得重写一行相似的代码,为了做到代码的通用性,我们可以将By.xxx 进行封装

    public static By by (String bytype,String Object){

    By by=null;

    switch (bytype) {

    case "By.xpath":

    return By.xpath(Object);

    case "By.id":

    return By.id(Object);

    case "By.name":

    return By.name(Object);

    case "By.linkText":

    return By.linkText(Object);

    case "By.partialLinkText":

    return By.partialLinkText(Object);

    case "By.className":

    return By.className(Object);

    case "By.cssSelector":

    return By.cssSelector(Object);

    default:

    return by;

    }

    }

    这样后续代码定位控件时先对定位方式进行转换,转换完之后得到一个By 类型,再用By  类型进行定位

    driver.findElement(by(bytype,object)).click();

    上面对类型进行了封装,接下来我们就可以对控件操作进行一系列的封装

    控件操作封基本思路可以这么做

    一是定位到控件

    二是对控件做何种操作

    三是控件操作之后的结果,是成功还是失败做一个记录,

    四是如果失败能最好能提供异常截图

    基于上述四点我们对控件进行封装

    先建一个类专门用于存放关键字方法

    public static void click(AndroidDriver driver,String bytype,String object, String data,String checkvalue) throws IOException {

    try{

    //延时0.5秒

    Thread.sleep(500);

    //对元素定位并进行点击操作

    driver.findElement(by(bytype,object)).click();

    //如果点击操作正常,此处设置变量为true

    constant.sTestResult=true;

    }catch(Exception e) {

    e.printStackTrace();

    // 如果 运行有异常,此处就设为false

    constant.sTestResult=false;

    Screenshot("",driver);

    }

    }

    其中1,2 步主要在这一行代码中实现

    driver.findElement(by(bytype,object)).click();

    第三行实现主要在try () catch {} 语句块实现

    比如你提供的一个控件定位方式或是对象在当前页面根本不存在,这里Try  catch 就会铺捉到异常,执行catch 块的代码,利用这个特性我们可以做一个标记,可以这么粗略的认为在try 块实现是正常,代码进入catch 就代表当前操作是失败的,在对应的区块放放一个flag ,这样就可以将每一步操作执行成功与否全数记载下来

    第四步截图的操作主要在

    Screenshot("",driver);  这一行中体现

    当进入到catch 语句块时先记录执行结果为fail 并将当前屏募信息截图存放到指定目录,便于后续分析

    讲 到截图那截图操作应如何封装呢

    截图封装需要思考这几个问题、

    一是怎么调用Selenium api 进行截图

    二是这个文件需要存放在什么位置

    三是当同一个步骤执行多次是覆盖历史记录中的异常图片,还是全数保存历史图片,如果需要全数保存历史图片,就需要在图片名称上加入

    唯一且随机的字符串,常用做法是加入时间戳

    /**

    * 截图方法

    * @param driver

    * @throws IOException

    */

    public static void  Screenshot(String ScreenName,AndroidDriver driver) throws IOException  {

    try{

    File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);   //调用Andrid Driver 的api 

    //设置时间格式,最终显示的时间为 2015-12-12-10-11-12

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

    //生成时间

    String  dateString = formatter.format(new Date());

    String dir_name=System.getProperty("user.dir")+"\\异常图片";

    if (!(new File(dir_name).isDirectory()))

    {  // 判断是否存在该目录 

    new File(dir_name).mkdir();

    }

    //复制文件到指定目录  工程目录下的  \异常图片

    FileUtils.copyFile(srcFile,new File(dir_name+"\\"+dateString+ScreenName+".jpg"));

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    控件滑动操作封装

    滑动操作需要考虑的地方有

    滑动存在上下左右四种滑动动作, 不同屏募大小的手机如何找到滑动的起点和终点

    针对不同大小屏募,我们可以采用等比率的方式精略定位指定坐标

    先拿到手机的宽和高,宽对应于X 轴坐标,高对应于坐标的y轴,但要注意一点手机的坐标0点是定在左上角,所以y轴最上方是0 最下方是高度对应的数值

    //获取屏的宽度

    int width=driver.manage().window().getSize().width;

    //获取屏的高度

    int height=driver.manage().window().getSize().height;

    Android 中滑动的api 可以用SWIP

    如果我们是想左滑,那么说明起点在右方,终点在左方,从右往大滑动

    如果滑动的画面是整屏的话,基本上都可以应用宽度×0.9 的位置开始滑动,如果你想滑动的幅度大点,终点可以设成宽度×0.1,而我通常设为width*2/10 也能适用于终大部分机型

    因为左右滑动不基于变换X 轴坐标,所以高度可以随便取一个值,通常的做法是左右滑动,y轴取中间值

    经过上面一些分析,我们可以封装一个滑动控件的方法

    /**

    *

    * @param driver

    * @param bytype

    * @param object

    * @param data

    * @param checkvalue

    * @throws InterruptedException

    * @throws IOException

    */

    public static void sliding(AndroidDriver driver,String data) throws InterruptedException, IOException {

    //获取屏的宽度

    int width=driver.manage().window().getSize().width;

    //获取屏的高度

    int height=driver.manage().window().getSize().height;

    try {

    if (data.equals("左滑")){

    //当左滑时,开始点横竖坐标大于结束点的模坐标

    System.out.println("宽度右边"+width*9/10 +"左边"+width*2/10);

    driver.swipe(width*9/10,height/2, width*2/10,height/2, 1000);

    // 运行正确就设为true

    constant.sTestResult=true;

    }

    else if (data.equals("右滑")){

    driver.swipe(width/5,height/2, width*4/5,height/2, 1000);

    constant.sTestResult=true;

    }

    else if (data.equals("上滑")){

    driver.swipe(width/5,height/2, width/5,height/3, 1000);

    constant.sTestResult=true;

    }

    else if (data.equals("下滑")){

    driver.swipe(width/5,height/3, width/5,height/2, 1000);

    constant.sTestResult=true;

    }

    } catch (Exception e) {

    e.printStackTrace();

    //执行有异常时就设为false

    constant.sTestResult=false;

    Screenshot("",driver);

    }

    }

    相关文章

      网友评论

          本文标题:Appium 控件封装

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