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);

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,373评论 25 707
  • 之前有一段时间学习过appium框架,这次趁机借着已报名参加的线上课程,重新认识了一遍appium框架,总能从中收...
    小蜗牛的成长阅读 13,267评论 3 14
  • 2017年最值得学习的编程语言TOP10是哪些?年轻人学习编程语言的热情是比较高的,所以这个问题在学习计算机科学或...
    厦门触控未来阅读 266评论 0 1
  • 很快又要进入带人的经历中。 上一次带人的经历给我哪些教训呢? 第一,团队的状态需要合理的里程碑和达成来提升维持。而...
    吴少杰1988阅读 187评论 0 0