最近受有人委托,想搞個自動化腳本浓恶,基于微信公眾號的!聽到這個請求的時候第一反應(yīng)是這簡單呀结笨,用Appium就可以實現(xiàn)呀包晰!于是很隨意的就答應(yīng)了!事實確實如此嗎炕吸?先來說下過程吧
一杜窄、環(huán)境:Python35-32
? ? ? ? ? ?Pycharm
? ? ? ? ? ?AndroidADT(使用adb、aapt和工具uiautomatorviewer)
? ? ? ? ? ?Appium_Python_Client-0.24-py3.5.egg-info
? ? ? ? ? ?AppiumForWindows_1_4_16_1 ?借用蟲師的鏈接:bitbucket.org/appium/appium.app/downloads/
二算途、實驗:
? ? ? ? ?1. 在真機上驗證塞耕,將Android手機連接到電腦,勾選手機的USB調(diào)試嘴瓤;
? ? ? ? ?2. 回到pc端扫外,在cmd下輸入:adb devices,得到手機的devicesName,如圖:
? ? ? ? ? 3. 打開Appium,啟動
? ? ? ? ? 4. 編寫代碼,得到 deviceName后廓脆,還需要兩個比較重要的東西筛谚,apppackage和appactivity,這里提供一個方法:在AndroidADT包中查找aapt.exe,一般會在build-tools包下面。找到次程序路徑停忿,在cmd下進到該路勁后驾讲,如:D:\AndroidADT\AndroidADT\sdk\build-tools\android-4.3>。輸入aapt命令:
?ndroidADT\sdk\build-tools\android-4.3>aapt d badgingD:\\weixin_1120.apk
在信息中找到package name :
和activity:
有了這些信息后,代碼中的desired_caps字典已經(jīng)可以使用了吮铭。代碼如下:
? ? ? ? ? 5. 使用:driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)得到appium的driver對象时迫,運行代碼,得到微信頁面并成功登錄谓晌。接下來就該來登錄公眾號了
這個過程中所有元素都可以通過AndroidADT中的工具uiautomatorviewer.exe來獲取掠拳,具體方法如下:
下一步:
下一步:
? ? ? ? ? ? 6. 到此,一切都還順利纸肉!而且我發(fā)現(xiàn)溺欧,在真機上運行appium,不再有模擬器上那種便秘的感覺柏肪,重拾selenium的絲滑般的感覺姐刁!但是,這種感覺并不能持續(xù)烦味。難點出現(xiàn)了:
程序走到這聂使,我發(fā)現(xiàn)app里面的元素不能用uiautomatorviewer獲取了,信息部分變成了一個整體拐叉,這是為什么呢岩遗?實際上扇商,這個問題的原因要回到webapp的基礎(chǔ)上來凤瘦,當采用混合模式來開發(fā)app,主流技術(shù)都是原生加web的方式,要在原生中加入瀏覽器就必須使用webview來實現(xiàn)頁面和殼在和手機系統(tǒng)的數(shù)據(jù)交換案铺。那么蔬芥,這里一定是內(nèi)嵌了一個頁面,如圖:
這里就在uiautomatorviewer里看到了webkit.webview這個東西控汉。怎么獲取到這個webview呢笔诵?
翻閱了海量的網(wǎng)友水貼,最終得到了2個有用的信息:
(1)獲取webview的方法姑子,當然這里寫的是Python的方法乎婿,其他語言只能自己去百度了:
cons = driver.contexts #獲取當前上下文,返回一個列表
print(cons) ?#查看列表所有內(nèi)容街佑,期望獲得webview的名字谢翎,有它才能將appium的native轉(zhuǎn)換
懷著無比興奮的心情將代碼添加進去,結(jié)果如大家所料沐旨,也和很多朋友的嘗試結(jié)果相同森逮,結(jié)果只有['NATIVE_APP'],說好的webview呢?又是漫漫的百度求學路磁携,大神們各種裝褒侧,可惜沒有一個靠譜。咋辦?
老老實實回來自己研究這個公眾號闷供,既然在uiautomatorviewer里可以抓取到烟央,說明webview是出現(xiàn)了的,不像某些大神說的这吻,需要求前端加代碼吊档,我又不是馬家軍,公眾號咋能加得進去唾糯?難道就此真無路可走了怠硼?根據(jù)selenium webdriver的經(jīng)驗,我觀察這個內(nèi)嵌頁面加載過程耗時較長移怯,那有沒有可能是沒有加載完成就去獲取了這個context呢香璃?大概計算了一下加載的時間,當然這個過程并不像描述這么簡單舟误。最終我在driver.contexts的前面添加了一個強制等待time.sleep(10),當然大家也可以去嘗試顯示等待的方式來獲取葡秒。果然,再次嘗試后得到了夢寐以求的東西:
但是嵌溢,問題來了眯牧,兩個!居然有兩個赖草?学少??逗我秧骑?版确?咋用?乎折?
不管了绒疗,就用索引的方式driver._switch_to.context(cons[1])取得第一個webview切換過去,請騷年們注意骂澄,switch前面有個下劃線‘_’,沒有的話你的context()方法可能會報錯吓蘑!,結(jié)果呢坟冲?磨镶?
你以為你成功了?騷年樱衷,只怪你太年輕了棋嘲!沒有加等待time.sleep(1),我看到的只是頁面元素找不到的異常而已!前提是你要知道怎么獲取頁面元素矩桂。否則你什么也看不到沸移!
事實上痪伦,僅僅切換焦點還是不能操作內(nèi)嵌頁面的,這也是從度娘那得到的下一個有用的東西雹锣,請繼續(xù)往下看网沾。
(2) 怎么使用webview,及h5頁面的權(quán)限:
度娘里有大神說蕊爵,要想操作微信的H5頁面辉哥,你還得在前面的desired_caps字典里加東西,加什么呢攒射? ?'WEBVIEW_com.tencent.mm:tools'我們已經(jīng)獲取到了醋旦,嘗試著加進去吧!
desired_caps['chromeOptions']= {'androidProcess':'com.tencent.mm:tools'}#驅(qū)動h5,必備
然后呢会放?有這個微信還不許你操作呢饲齐!請在微信里加點料,打開任意輸入框咧最,輸入:
debugx5.qq.com
發(fā)送后捂人,點擊剛才發(fā)送的這個信息,你會發(fā)現(xiàn)有個配置頁面跳轉(zhuǎn)出來矢沿,請在是否打開TBS內(nèi)核XXX前面打上勾滥搭,如下:
一切就緒,再次點擊代碼運行捣鲸!基本實現(xiàn)了瑟匆。
? ? ? ? ?7. 使用appium從'NATIVE_APP'切換到webview過程已經(jīng)實現(xiàn)了,如何定位H5頁面就是接下來需要解決的問題摄狱!使用chrome瀏覽器 脓诡,在已連接了手機的情況下无午,在地址欄內(nèi)輸入:
chrome://inspect/#devices
頁面顯示:
會顯示出自己手機的型號和deviceName,這也是獲取deviceName的另一個途徑媒役,如果當前手機上沒有webview時,頁面不會出現(xiàn)任何其他信息宪迟,當切換到公眾號后酣衷,可以發(fā)現(xiàn):
剛才獲取不到的內(nèi)嵌頁面出現(xiàn)在頁面里面。點擊inspect,進入顯示頁面次泽,當然穿仪,如果大家和我一樣沒FQ!那么意荤,老實的復制url到新打開標簽中啊片。這時,手機公眾號的頁面就顯示在chrome瀏覽器中了玖像!如圖:
找到開發(fā)者工具就可以獲取頁面元素了紫谷,操作類似firebug,如圖:
? ? ? ? ? ?8. ?不管通過xpath還是css,前面已經(jīng)提過,請注意加入等待,但這里還有個大坑笤昨,我在這上面花了很多時間 ?祖驱。
? ? ? ?是什么坑呢,大家可以 嘗試下瞒窒,當點擊觸發(fā)捺僻,頁面跳轉(zhuǎn)后,driver對象就獲取不到任何東西了崇裁,所有的返回值都是None!我第一反應(yīng)是匕坯,會不會需要切換窗口?
加入driver.window_handles拔稳,得到了兩個handle對象醒颖,['CDwindow-2786134a-b3dd-48ad-bb0d-790c0be15871', 'CDwindow-c3656f6b-8c5c-4d47-beed-27939b1ab935']
試試driver.switch_to.window(),結(jié)果是:沒有結(jié)果,依然放回none,要不然就出現(xiàn)chrome not xxxx的異常壳炎,于是乎泞歉,我又再一次重返百度滿滿求學路,路遇一大神匿辩,悄悄的說了句腰耙,不是窗口切換,那一定是context的切換铲球,一語點醒夢中人巴ε印稼病!回來看看我們的contexts列表选侨,里面有兩個坑啊,開始還不知道這為什么是兩個呢然走!果斷使用:
driver._switch_to.context(cons[0])
driver._switch_to.context(cons[-1])
當然援制,這個過程一樣需要加入等待時間,給瀏覽器足夠的時間反應(yīng)芍瑞。我們可以在切換后加入:driver.page_source的方法來查看返回的頁面響應(yīng)晨仑,也就是跳轉(zhuǎn)后的頁面代碼,得到以后可以把代碼復制出來拆檬,放到新建的html文件中洪己,用Firefox運行!那么竟贯,seleniumIDE,fierbug任君使用答捕,定位元素是不是也就變得簡單無比了!
最后屑那,提醒下各位拱镐,當出現(xiàn)chrome not xx 的時候晌缘,網(wǎng)上說是chromedriver的問題,讓大家升級driver痢站,我也嘗試過了磷箕,使用2.20及更高版本,直接就找不到元素了阵难,所以慎用岳枷!
希望這個實例對大家有一些幫助!