Appium 控件封装
我们在做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);
}
}