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;

}

}

這樣后續(xù)代碼定位控件時先對定位方式進行轉(zhuǎn)換,轉(zhuǎn)換完之后得到一個By 類型,再用By ?類型進行定位

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


上面對類型進行了封裝,接下來我們就可以對控件操作進行一系列的封裝

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

一是定位到控件

二是對控件做何種操作

三是控件操作之后的結(jié)果,是成功還是失敗做一個記錄,

四是如果失敗能最好能提供異常截圖

基于上述四點我們對控件進行封裝

先建一個類專門用于存放關(guān)鍵字方法


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

//如果點擊操作正常,此處設(shè)置變量為true

constant.sTestResult=true;

}catch(Exception e) {

e.printStackTrace();

// 如果 運行有異常,此處就設(shè)為false

constant.sTestResult=false;

Screenshot("",driver);

}

}


其中1,2 步主要在這一行代碼中實現(xiàn)

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


第三行實現(xiàn)主要在try () catch {} 語句塊實現(xiàn)

比如你提供的一個控件定位方式或是對象在當前頁面根本不存在,這里Try ?catch 就會鋪捉到異常,執(zhí)行catch 塊的代碼,利用這個特性我們可以做一個標記,可以這么粗略的認為在try 塊實現(xiàn)是正常,代碼進入catch 就代表當前操作是失敗的,在對應(yīng)的區(qū)塊放放一個flag ,這樣就可以將每一步操作執(zhí)行成功與否全數(shù)記載下來

第四步截圖的操作主要在

Screenshot("",driver); ?這一行中體現(xiàn)

當進入到catch 語句塊時先記錄執(zhí)行結(jié)果為fail 并將當前屏募信息截圖存放到指定目錄,便于后續(xù)分析



講 到截圖那截圖操作應(yīng)如何封裝呢

截圖封裝需要思考這幾個問題、

一是怎么調(diào)用Selenium api 進行截圖

二是這個文件需要存放在什么位置

三是當同一個步驟執(zhí)行多次是覆蓋歷史記錄中的異常圖片,還是全數(shù)保存歷史圖片,如果需要全數(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è)置時間格式,最終顯示的時間為 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();

}

//復(fù)制文件到指定目錄? 工程目錄下的? \異常圖片

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

}catch(Exception e) {

e.printStackTrace();

}

}



控件滑動操作封裝

滑動操作需要考慮的地方有

滑動存在上下左右四種滑動動作, 不同屏募大小的手機如何找到滑動的起點和終點

針對不同大小屏募,我們可以采用等比率的方式精略定位指定坐標

先拿到手機的寬和高,寬對應(yīng)于X 軸坐標,高對應(yīng)于坐標的y軸,但要注意一點手機的坐標0點是定在左上角,所以y軸最上方是0 最下方是高度對應(yīng)的數(shù)值

//獲取屏的寬度

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

//獲取屏的高度

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

Android 中滑動的api 可以用SWIP

如果我們是想左滑,那么說明起點在右方,終點在左方,從右往大滑動

如果滑動的畫面是整屏的話,基本上都可以應(yīng)用寬度×0.9 的位置開始滑動,如果你想滑動的幅度大點,終點可以設(shè)成寬度×0.1,而我通常設(shè)為width*2/10 也能適用于終大部分機型

因為左右滑動不基于變換X 軸坐標,所以高度可以隨便取一個值,通常的做法是左右滑動,y軸取中間值

經(jī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("左滑")){

//當左滑時,開始點橫豎坐標大于結(jié)束點的模坐標

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

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

// 運行正確就設(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è)為false

constant.sTestResult=false;

Screenshot("",driver);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,954評論 25 709
  • 之前有一段時間學(xué)習(xí)過appium框架,這次趁機借著已報名參加的線上課程,重新認識了一遍appium框架,總能從中收...
    小蝸牛的成長閱讀 13,428評論 3 14
  • 2017年最值得學(xué)習(xí)的編程語言TOP10是哪些?年輕人學(xué)習(xí)編程語言的熱情是比較高的,所以這個問題在學(xué)習(xí)計算機科學(xué)或...
    廈門觸控未來閱讀 331評論 0 1
  • 很快又要進入帶人的經(jīng)歷中。 上一次帶人的經(jīng)歷給我哪些教訓(xùn)呢? 第一,團隊的狀態(tài)需要合理的里程碑和達成來提升維持。而...
    吳少杰1988閱讀 209評論 0 0

友情鏈接更多精彩內(nèi)容