1.native&web&hybrid簡介
目前基本所有的移動互聯網app可以分為三類:Native App(原生應用),Hybrid App(混合應用)和Web App(網頁應用)。
Native App是基於智能手機操作系統API,使用原生語言編寫的App;
Web App是基於Web的系統或應用,使用的是HTML,JavaScript和CSS等網頁相關語言編寫的App;
Native App則是融合了Native和Web,使用原生語言編寫應用的外殼然后在其中內嵌網頁語言編寫的內容信息;
- 三種模式對比:
優點 | 缺點 | |
Native | 能夠訪問智能設備提供的所有功能; 支持離線工作; 更好的運行速度,性能和總體用戶體驗; 支持豐富的圖形,動畫和更好的渲染效果; |
開發成本較高; 維護,更新成本高; |
Web | 適用范圍廣,跨平台; 開發成本較低; 可以方便,快速地部署; 用戶隨時訪問最新版本; |
用戶體驗差(加載慢,費流量); 圖形和動畫渲染效果差; 不能調用系統相關功能(相機,GPS等); |
Hybrid | 可調用智能設備相關功能; 部分支持離線功能; 維護,更新較為方便; |
用戶體驗較差; 圖形和動畫渲染效果較差; |
怎么樣分辨一個app是native還是web的呢?
判斷方法:
-
看斷網的情況
把手機的網絡斷掉。然后點開頁面。然后可以正常顯示的東西就是原生寫的。
-
布局邊界
可以打開開發者選項中的顯示布局邊界,頁面元素很多的情況下布局是一整塊的是h5的,布局密密麻麻的是原生控件。頁面有布局的是原生的否則為h5頁面。
-
加載的方式
如果在打開新頁面導航欄下面有一條加載的線的話,這個頁面就是H5頁面,如果沒有就是原生的。
2、Hybird自動化解決方案
我們之前所使用的的API都是針對於原生的應用而言的,如果是web頁面就不能采取這些api來定位元素,而現在我們最常見的應用就是hybird混合應用。
appium原生的頁面是通過android/ios官方提供的API,web的部分是通過webview組件渲染出來的,所以Hybird自動化主要是解決webview這部分自動化。
現在主流的android系統都是大於4.4的了,所以我們采取UIAutomator+ChromeDriver模式:
原生部分走UIAutomator,webview部分走Chromedriver,兩者結合混搭,從而實現Hybird自動化,要求如下:
1.android4.4設備
2.手機和電腦連接,開啟USB調試模式,保證能夠通過adbserver查看到設備名;
3.webview必須為debug模式(這點需要app對應的開發加上)
4.PC端和手機端安裝google Chrome瀏覽器(盡量保持版本一致);
5.電腦網絡支持FQ
說明:如果是公司研發的產品可以讓開發人員在app源碼中將webviewdebug模式打開:在Android SDK API>=19的情況下,在源碼中添
加 webview.setWebContentsDebuggingEnabled(true) 這一段代碼即可。(如果使用的是
模擬器,則無需修改源碼)
3.Hybird自動化腳本開發
一、識別webview
1.用定位工具查看頁面,發現頁面上有些區域無法定位到,如下圖左邊紅色區域,只能定位到這個大框框,紅色框里面的元素是無法識別的。
2.這時候可以查看元素屬性,如右圖它的class屬性,上面寫着WebView,那毫無疑問這種頁面就是webview了。
二、contexts
1.context是中文翻譯是上下文,環境,當然學過selenium的同學,也可以理解為句柄(handle),其實是一回事,反正知道是兩個不同的環境就行了。
2.先獲取頁面是contexts環境,如下圖紅色區域,獲取的是一個list列表:
NATIVE_APP:這個就是native,也就是原生的
WEBVIEW_com.xxxx :這個就是webview
3.當看到打印出來有下圖兩個,就說明獲取到webview的context了(當然也有的app有坑,可能明明有webview,卻通過contexts獲取不到, 那是開發沒打開webview調試)
三、切換到webview
1.要想操作webview上的元素,第一步需要切換環境(跟selenium的切換iframe,切換handle思路是一樣)
2.切換方法:switch_to.context(參數是webview的context)
由於第二步已經獲取到contexts是一個list對象,取這個list的第二個參數就行,也就是contexts[1],也可以說是倒數第一個也就是contexts[-1]
四、切回native
最后注意在webview上操作完后,如果要定位原生的元素,還需要先回到native上操作,這時候需要先切回來,切回native有兩個方法:
方法一:driver.switch_to.context("NATIVE_APP") # 這個NATIVE_APP是固定的參數
方法二:driver.switch_to.context(contexts[0]) # 從contexts里取第一個參數
示例代碼如下:
#前面一系列操作,打開了H5頁面 #等待web頁面出現 WebDriverWait(driver,10,1).until(EC.visibility_of_element_located(MobileBy.CLASS_NAME,"android.webkit.WebView")) #獲取當前的上下文 contexts=driver.contexts print("當前所有的contexts:",contexts) #切換上下文,切換到webview time.sleep(1) #也可以通過名稱來切換 #driver.switch_to.context("WEBVIEW_com.baidu.yuedu") driver.switch_to.context(contexts[-1]) #獲取web內容 source=driver.page_source # 切回native driver.switch_to.context(contexts[0]) # driver.switch_to.context("NATIVE_APP") # 這樣也是可以的
4.Hybird問題點總結
使用driver.contexts只獲取到native app的情況:
1.測試手機/模擬器不是安卓4.4以上的版本,因為在安卓4.4以下的版本的webview沒有使用Chrome內核,直郵在selendroid模式中才支持4.4以下的內核,這時就需要通過selendroid輔助我們,在desiredCapbilities中添加如下配置:
desired_caps["automationName"]="Selendroid"
2.程序中使用的webview不是chrome內核,而appium只支持chrome內核,所以appium就不能獲取該webview的context;
例如騰訊公司的X5內核,具體切換定位方法見文章:https://www.cnblogs.com/123blog/p/12624007.html
3.在腳本執行的時候回出來下面的錯誤日志信息:
[Chromedriver] Error: Failed to start Chromedriver session: An unknown server-side error occurred while processing the command. Original error: unknown error: Chrome version must be >= 49.0.2623.0 [Chromedriver] (Driver info: chromedriver=2.22.397933 (1cab651507b88dec79b2b2a22d1943c01833cc1b),platform=Windows NT 6.1.7601 SP1 x86_64)
根據chrome瀏覽器版本去下載對應的Chromedriver.exe(要與webview的版本保持匹配,即webview版本號代表了chrome瀏覽器的版本號),將驅動文件放到對應appium目錄下。
對應chrome瀏覽器和Chromedriver版本參考:https://www.cnblogs.com/123blog/articles/12623967.html