Appium 控件封裝

我們?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);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末手报,一起剝皮案震驚了整個(gè)濱河市夫晌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昧诱,老刑警劉巖晓淀,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盏档,居然都是意外死亡凶掰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)蜈亩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懦窘,“玉大人,你說(shuō)我怎么就攤上這事稚配〕┩浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵道川,是天一觀的道長(zhǎng)午衰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冒萄,這世上最難降的妖魔是什么臊岸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮尊流,結(jié)果婚禮上帅戒,老公的妹妹穿的比我還像新娘。我一直安慰自己崖技,他們只是感情好逻住,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著迎献,像睡著了一般瞎访。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忿晕,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天装诡,我揣著相機(jī)與錄音银受,去河邊找鬼。 笑死鸦采,一個(gè)胖子當(dāng)著我的面吹牛宾巍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渔伯,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顶霞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锣吼?” 一聲冷哼從身側(cè)響起选浑,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玄叠,沒(méi)想到半個(gè)月后古徒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡读恃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年隧膘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寺惫。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疹吃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出西雀,到底是詐尸還是另有隱情萨驶,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布艇肴,位于F島的核電站腔呜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豆挽。R本人自食惡果不足惜育谬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帮哈。 院中可真熱鬧,春花似錦锰镀、人聲如沸娘侍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)憾筏。三九已至,卻和暖如春花鹅,著一層夾襖步出監(jiān)牢的瞬間氧腰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留古拴,地道東北人箩帚。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黄痪,于是被迫代替她去往敵國(guó)和親紧帕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,097評(píng)論 25 707
  • 之前有一段時(shí)間學(xué)習(xí)過(guò)appium框架桅打,這次趁機(jī)借著已報(bào)名參加的線(xiàn)上課程是嗜,重新認(rèn)識(shí)了一遍appium框架,總能從中收...
    小蝸牛的成長(zhǎng)閱讀 13,291評(píng)論 3 14
  • 2017年最值得學(xué)習(xí)的編程語(yǔ)言TOP10是哪些挺尾?年輕人學(xué)習(xí)編程語(yǔ)言的熱情是比較高的鹅搪,所以這個(gè)問(wèn)題在學(xué)習(xí)計(jì)算機(jī)科學(xué)或...
    廈門(mén)觸控未來(lái)閱讀 270評(píng)論 0 1
  • 很快又要進(jìn)入帶人的經(jīng)歷中。 上一次帶人的經(jīng)歷給我哪些教訓(xùn)呢遭铺? 第一丽柿,團(tuán)隊(duì)的狀態(tài)需要合理的里程碑和達(dá)成來(lái)提升維持。而...
    吳少杰1988閱讀 191評(píng)論 0 0