Appium 控件封装

2017-08-06  本文已影响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);

}

}

上一篇下一篇

猜你喜欢

热点阅读