我們?cè)谧鯝ndorid 自動(dòng)化測(cè)試時(shí)谣拣,用到最多的操作就是點(diǎn)擊碑韵,輸入,驗(yàn)證,滑動(dòng)之類(lèi)的悬垃,針對(duì)這些常用的操作我們可以進(jìn)行二次封裝
相信從事自動(dòng)化測(cè)試的同仁都用過(guò)如下代碼
找到指定控件并時(shí)行單擊事件
driver.findElement(By.id("")).click();
其實(shí)這行代碼我們是可以提取一部分代碼進(jìn)行二次封裝游昼,我們都知道元素定位有很多種,有id ,有name 如果換了一種定位方式尝蠕,按上面代碼就得重寫(xiě)一行相似的代碼烘豌,為了做到代碼的通用性,我們可以將By.xxx 進(jìn)行封裝
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;
}
}
這樣后續(xù)代碼定位控件時(shí)先對(duì)定位方式進(jìn)行轉(zhuǎn)換看彼,轉(zhuǎn)換完之后得到一個(gè)By 類(lèi)型廊佩,再用By ?類(lèi)型進(jìn)行定位
driver.findElement(by(bytype,object)).click();
上面對(duì)類(lèi)型進(jìn)行了封裝,接下來(lái)我們就可以對(duì)控件操作進(jìn)行一系列的封裝
控件操作封基本思路可以這么做
一是定位到控件
二是對(duì)控件做何種操作
三是控件操作之后的結(jié)果靖榕,是成功還是失敗做一個(gè)記錄标锄,
四是如果失敗能最好能提供異常截圖
基于上述四點(diǎn)我們對(duì)控件進(jìn)行封裝
先建一個(gè)類(lèi)專(zhuān)門(mén)用于存放關(guān)鍵字方法
public static void click(AndroidDriver driver,String bytype,String object, String data,String checkvalue) throws IOException {
try{
//延時(shí)0.5秒
Thread.sleep(500);
//對(duì)元素定位并進(jìn)行點(diǎn)擊操作
driver.findElement(by(bytype,object)).click();
//如果點(diǎn)擊操作正常,此處設(shè)置變量為true
constant.sTestResult=true;
}catch(Exception e) {
e.printStackTrace();
// 如果 運(yùn)行有異常茁计,此處就設(shè)為false
constant.sTestResult=false;
Screenshot("",driver);
}
}
其中1料皇,2 步主要在這一行代碼中實(shí)現(xiàn)
driver.findElement(by(bytype,object)).click();
第三行實(shí)現(xiàn)主要在try () catch {} 語(yǔ)句塊實(shí)現(xiàn)
比如你提供的一個(gè)控件定位方式或是對(duì)象在當(dāng)前頁(yè)面根本不存在,這里Try ?catch 就會(huì)鋪?zhàn)降疆惓P茄梗瑘?zhí)行catch 塊的代碼践剂,利用這個(gè)特性我們可以做一個(gè)標(biāo)記,可以這么粗略的認(rèn)為在try 塊實(shí)現(xiàn)是正常租幕,代碼進(jìn)入catch 就代表當(dāng)前操作是失敗的舷手,在對(duì)應(yīng)的區(qū)塊放放一個(gè)flag ,這樣就可以將每一步操作執(zhí)行成功與否全數(shù)記載下來(lái)
第四步截圖的操作主要在
Screenshot("",driver); ?這一行中體現(xiàn)
當(dāng)進(jìn)入到catch 語(yǔ)句塊時(shí)先記錄執(zhí)行結(jié)果為fail 并將當(dāng)前屏募信息截圖存放到指定目錄劲绪,便于后續(xù)分析
講 到截圖那截圖操作應(yīng)如何封裝呢
截圖封裝需要思考這幾個(gè)問(wèn)題、
一是怎么調(diào)用Selenium api 進(jìn)行截圖
二是這個(gè)文件需要存放在什么位置
三是當(dāng)同一個(gè)步驟執(zhí)行多次是覆蓋歷史記錄中的異常圖片盆赤,還是全數(shù)保存歷史圖片贾富,如果需要全數(shù)保存歷史圖片,就需要在圖片名稱(chēng)上加入
唯一且隨機(jī)的字符串牺六,常用做法是加入時(shí)間戳
/**
* 截圖方法
* @param driver
* @throws IOException
*/
public static void? Screenshot(String ScreenName,AndroidDriver driver) throws IOException? {
try{
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); ? //調(diào)用Andrid Driver 的api?
//設(shè)置時(shí)間格式,最終顯示的時(shí)間為 2015-12-12-10-11-12
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
//生成時(shí)間
String? dateString = formatter.format(new Date());
String dir_name=System.getProperty("user.dir")+"\\異常圖片";
if (!(new File(dir_name).isDirectory()))
{? // 判斷是否存在該目錄?
new File(dir_name).mkdir();
}
//復(fù)制文件到指定目錄? 工程目錄下的? \異常圖片
FileUtils.copyFile(srcFile,new File(dir_name+"\\"+dateString+ScreenName+".jpg"));
}catch(Exception e) {
e.printStackTrace();
}
}
控件滑動(dòng)操作封裝
滑動(dòng)操作需要考慮的地方有
滑動(dòng)存在上下左右四種滑動(dòng)動(dòng)作颤枪, 不同屏募大小的手機(jī)如何找到滑動(dòng)的起點(diǎn)和終點(diǎn)
針對(duì)不同大小屏募,我們可以采用等比率的方式精略定位指定坐標(biāo)
先拿到手機(jī)的寬和高淑际,寬對(duì)應(yīng)于X 軸坐標(biāo)畏纲,高對(duì)應(yīng)于坐標(biāo)的y軸,但要注意一點(diǎn)手機(jī)的坐標(biāo)0點(diǎn)是定在左上角春缕,所以y軸最上方是0 最下方是高度對(duì)應(yīng)的數(shù)值
//獲取屏的寬度
int width=driver.manage().window().getSize().width;
//獲取屏的高度
int height=driver.manage().window().getSize().height;
Android 中滑動(dòng)的api 可以用SWIP
如果我們是想左滑盗胀,那么說(shuō)明起點(diǎn)在右方,終點(diǎn)在左方锄贼,從右往大滑動(dòng)
如果滑動(dòng)的畫(huà)面是整屏的話(huà)票灰,基本上都可以應(yīng)用寬度×0.9 的位置開(kāi)始滑動(dòng),如果你想滑動(dòng)的幅度大點(diǎn),終點(diǎn)可以設(shè)成寬度×0.1屑迂,而我通常設(shè)為width*2/10 也能適用于終大部分機(jī)型
因?yàn)樽笥一瑒?dòng)不基于變換X 軸坐標(biāo)浸策,所以高度可以隨便取一個(gè)值,通常的做法是左右滑動(dòng)惹盼,y軸取中間值
經(jīng)過(guò)上面一些分析庸汗,我們可以封裝一個(gè)滑動(dòng)控件的方法
/**
*
* @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("左滑")){
//當(dāng)左滑時(shí),開(kāi)始點(diǎn)橫豎坐標(biāo)大于結(jié)束點(diǎn)的模坐標(biāo)
System.out.println("寬度右邊"+width*9/10 +"左邊"+width*2/10);
driver.swipe(width*9/10,height/2, width*2/10,height/2, 1000);
// 運(yùn)行正確就設(shè)為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();
//執(zhí)行有異常時(shí)就設(shè)為false
constant.sTestResult=false;
Screenshot("",driver);
}
}