Hybrid 混合應(yīng)用如何做自動化

準(zhǔn)備條件

(1)準(zhǔn)備一臺系統(tǒng)版本5.0以上的安卓手機(jī)或者安卓模擬器
(2)安裝一個輔助工具(pc端安裝):uc-devtool(UC開發(fā)者工具悲幅,不需要翻墻),uc-devtool安裝成功-》選擇設(shè)置->勾選 本地Devtools inpsector資源

參考文章:https://www.cnblogs.com/yyoba/p/9969394.html
uc-devtool作用: 用來幫助定位app內(nèi)嵌套的web頁面元素信息

image.png

(3)被測試的app->需要打開Web調(diào)試開關(guān)->如何打開開關(guān):

第一種方式:讓開發(fā)在app源代碼中加入一行代碼(開發(fā)知道在哪里添加)-》再重新打包給到測試

WebView.setWebContentDebuggingEnabled(true);

webview(其實(shí)就是手機(jī)自帶的系統(tǒng)應(yīng)用)

負(fù)責(zé)web頁面展示瘾杭,解析诅病,渲染web頁面,其實(shí)就是微型的瀏覽器(幫助第三方app來展示web頁面)
如下圖使用appium無法定位到具體的元素信息粥烁,選擇元素-》選中的是整塊區(qū)域


image.png

webview每個手機(jī)都有這個應(yīng)用贤笆,是以一個apk存在手機(jī)里面的,如何查看手機(jī)是否有webView?

手機(jī)-》設(shè)置->應(yīng)用->全部


image.png

點(diǎn)擊可以查看版本


image.png

問題: 可以使用文章text進(jìn)行定位讨阻,但是text會變芥永,所以這里需要借助uc-devtool獲取元素定位信息

開發(fā)步驟

(1)uc開發(fā)者工具識別web頁面的元素信息

打開uc-devtool: 設(shè)置-》勾選
沒有打開app時(shí),如下圖沒有檢測到webView


image.png

進(jìn)入到app主頁(由于主頁不是一個web頁面钝吮,所以也沒有檢測到webView)


image.png

進(jìn)入到web頁面(檸檬社區(qū))恤左,如下圖,檢測到了webView
下圖中的:com.lemon.lemonban是app的包名
127.0.0.1:62001 ->是當(dāng)前連接的設(shè)備名
74.0.3627.136是webView的版本


image.png

上圖點(diǎn)擊 inspect即可進(jìn)入deBug控制臺
如下圖(其實(shí)就是根f12效果差不多)搀绣,這樣就可以使用web自動化提供的xpath等方式進(jìn)行元素定位了


image.png

(2)開發(fā)腳本:

原生和web面需要切換context才能進(jìn)行元素定位飞袋。
Context是在編寫Android程序經(jīng)常使用到的對象,意思為上下文對象链患。原生和網(wǎng)頁屬于不同的context

    @Test
    public void test() throws InterruptedException {
        //1.主頁點(diǎn)擊  檸檬社區(qū)
        androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"檸檬社區(qū)\")").click();
        //2.等待web頁面加載完成
        //這里不能使用隱式等待(不會生效)->因?yàn)椋哼@里不是找元素巧鸭,而是進(jìn)行context切換,所以不會生效麻捻,只能用硬性等待
        
        Thread.sleep(8000);
        //3.獲取到當(dāng)前狀態(tài)所有的context
        Set  contextHandles = androidDriver.getContextHandles();
        //打印出來看看-》打印結(jié)果:[NATIVE_APP,WEBVIEW_com.lemon.lemonban]
        System.out.println(contextHandles);
        //4.切換context-》根據(jù)web頁面對應(yīng)的context名字進(jìn)行切換
        androidDriver.context("WEBVIEW_com.lemon.lemonban");
        Thread.sleep(2000);
        //5.web頁面元素定位
        androidDriver.findElement(By.xpath("http://a[@title=\"App 抓包提示網(wǎng)絡(luò)異常怎么破纲仍?\"]")).click();
    
    }


執(zhí)行上面代碼呀袱。如果報(bào)錯,請看下面的注意(5)

注意

(1) 原生頁面對應(yīng)的context->是NATIVE_APP
不管你是主頁還是登錄頁郑叠,只要是原生的頁面夜赵,對應(yīng)的context就是NATIVE_APP
(2)Web頁面對應(yīng)的context->是 WEBVIEW_com.lemon.lemonban

(3)打開app之后默認(rèn)是在原生的context中,所以如果要定位web頁面中的元素乡革,需要切換context

(4)context切換之后寇僧,對web頁面元素進(jìn)行元素定位,為什么依然使用androidDriver沸版,而不是( ie,firefox嘁傀,chrome對應(yīng)的driver呢)-->這是因?yàn)椋篈ppium自帶chromedriver,內(nèi)部會進(jìn)行driver驅(qū)動的替換,會把原來的androidDriver替換成chromedriver->為什么不是 IE,firrfox的driver呢视粮,因?yàn)榘沧肯到y(tǒng)是chrome開發(fā)的细办,webView也是chrome開發(fā)的,所以自動替換的就是chromeDriver
(5)webView和chromedriver版本不對應(yīng)-》上面代碼執(zhí)行console會報(bào)下面錯誤

io.appium.java_client.NoSuchContextException: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '74.0.3729'. See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details.
Build info: version: '3.12.0', revision: '7c6e0b3', time: '2018-05-08T14:04:26.12Z'

appium報(bào)錯日志如下:


image.png

根據(jù)報(bào)錯信息可以知道:webView和chromedriver版本不匹配導(dǎo)致的

解決辦法:

(1)找到appium自帶的chromeview安裝路徑:

查看版本:


image.png

(2)模擬器查看系統(tǒng)自帶的webview版本:
手機(jī)設(shè)置-》應(yīng)用-》全部


image.png

(3)查看版本對照表
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md

image.png

appium自帶的chromedriver版本是:75 蕾殴,模擬器自帶的webView版本是74
參考版本對照表:webview71對應(yīng)chromedriver是2.46 笑撞,沒有webview74版本,不過我們這里先下載2.46的試試看(下載完成后钓觉,將原來的chromedriver覆蓋更新即可):結(jié)果發(fā)現(xiàn)是還是報(bào)湊

ChromeDriver 2.39 and newer require adb version 1.0.38 or newer. Run 'adb version' in your terminal of the host device to find your version of adb.

上面的報(bào)錯信息說的是:
ChromeDriver 2.39及更高版本需要adb 1.0.38或更高版本茴肥。在主機(jī)設(shè)備的終端中運(yùn)行“adb version”以查找adb的版本。
下圖發(fā)現(xiàn)我的adb版本太低【1.0.36】【這里的adb用的是模擬器中的adb议谷,因?yàn)橹皊dk 自己的adb和模擬器中的adb版本不對應(yīng)導(dǎo)致adb connect連接失敗-》解決辦法:將sdk中的adb替換成模擬器中的adb】


image.png

現(xiàn)在需要怎么解決呢?-》升級adb版本:將模擬器中adb換成sdk中的adb,sdk還用自己的adb


image.png

adb替換ok,需要重啟adb,重啟命令:adb kill-server,重啟完adb后堕虹,再輸入adb devices 卧晓,adb就會自動起來
再重新執(zhí)行代碼:發(fā)現(xiàn)context切換成功,下面代碼可以定位到元素赴捞。

androidDriver.findElement(By.xpath("http://a[@title=\"App 抓包提示網(wǎng)絡(luò)異常怎么破逼裆?\"]")).click();

注意:這里為什么不是對webview進(jìn)行升級而是替換chromeDriver呢?
因?yàn)椋菏謾C(jī)自帶的webview升級很麻煩

(6)當(dāng)回到原生頁面進(jìn)行測試時(shí)赦政,需要將context切換回來

@Test
    public void test() throws InterruptedException {
        // 1.主頁點(diǎn)擊 檸檬社區(qū)
        androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"檸檬社區(qū)\")").click();
        // 2.等待web頁面加載完成
        // 這里不能使用隱式等待(不會生效)->因?yàn)椋哼@里不是找元素胜宇,而是進(jìn)行context切換,所以不會生效恢着,只能用硬性等待

        Thread.sleep(8000);
        // 3.獲取到當(dāng)前狀態(tài)所有的context
        Set contextHandles = androidDriver.getContextHandles();
        // 打印出來看看-》打印結(jié)果:[NATIVE_APP,WEBVIEW_com.lemon.lemonban]
        System.out.println(contextHandles);
        // 4.切換context-》根據(jù)web頁面對應(yīng)的context名字進(jìn)行切換
        androidDriver.context("WEBVIEW_com.lemon.lemonban");
        Thread.sleep(2000);
        // 5.web頁面元素定位
        androidDriver.findElement(By.xpath("http://a[@title=\"App 抓包提示網(wǎng)絡(luò)異常怎么破桐愉?\"]")).click();
        // 6.回到主頁
        // 6.1當(dāng)回到原生頁面中進(jìn)行元素定位時(shí),context需要切換回來(由于左上角x是在原生頁面里面掰派,需要需要切換从诲,否則定位不到)
        androidDriver.context("NATIVE_APP");
        // 6.2定位到x按鈕->退出
        androidDriver.findElement(By.className("android.widget.ImageButton")).click();
        // 6.3定位確定按鈕-》確定 退出到主頁
        androidDriver.findElement(By.id("com.lemon.lemonban:id/tv_sure")).click();

    }

如果context不切換,就會報(bào)如下錯誤:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":"android.widget.ImageButton"}

app中使用瀏覽器打開web頁面靡羡,代碼怎么寫系洛?

(1)如果使用的瀏覽器是手機(jī)系統(tǒng)自帶的apk
那么如何獲取瀏覽器apk的包名和啟動入口呢俊性?-》解決辦法:將手機(jī)中的apk拉取到pc端


image.png
image.png

(2)再使用aapt解析apk的包名和啟動入口
(3) 地址欄是原生的 用Androiddriver sendkeys方法 再輸入enter鍵操作
androidDriver.get(url)這種是不可以的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市描扯,隨后出現(xiàn)的幾起案子定页,更是在濱河造成了極大的恐慌,老刑警劉巖绽诚,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典徊,死亡現(xiàn)場離奇詭異,居然都是意外死亡憔购,警方通過查閱死者的電腦和手機(jī)宫峦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玫鸟,“玉大人导绷,你說我怎么就攤上這事∈浩” “怎么了妥曲?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钦购。 經(jīng)常有香客問我檐盟,道長,這世上最難降的妖魔是什么押桃? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任葵萎,我火速辦了婚禮,結(jié)果婚禮上唱凯,老公的妹妹穿的比我還像新娘羡忘。我一直安慰自己,他們只是感情好磕昼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布卷雕。 她就那樣靜靜地躺著,像睡著了一般票从。 火紅的嫁衣襯著肌膚如雪漫雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天峰鄙,我揣著相機(jī)與錄音浸间,去河邊找鬼。 笑死吟榴,一個胖子當(dāng)著我的面吹牛发框,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼梅惯,長吁一口氣:“原來是場噩夢啊……” “哼宪拥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铣减,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤她君,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后葫哗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缔刹,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年劣针,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了校镐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡捺典,死狀恐怖鸟廓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情襟己,我是刑警寧澤引谜,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站擎浴,受9級特大地震影響员咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贮预,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一贝室、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仿吞,春花似錦滑频、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霹琼。三九已至务傲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枣申,已是汗流浹背售葡。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忠藤,地道東北人挟伙。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像模孩,于是被迫代替她去往敵國和親尖阔。 傳聞我的和親對象是個殘疾皇子贮缅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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