一、X5內核介紹
X5內核是騰訊公司基於優秀開源 webkit 深度優化的瀏覽器渲染引擎,並且在2014年正式宣布開放給app開發者,所以現在可以在很多app上看到都是使用的X5內核實現Hybrid混合應用,包括微信、手機QQ、京東、新浪新聞、搜狐視頻等等,包括現在炙手可熱的微信小程序都是X5內核,之前都是使用google的webview,這里可以把X5內核理解為騰訊版本的webview。
注意:由於 genymotion 模擬器是X86架構的,很多app安裝不了,比如微信、QQ等(雖然說可以通過安裝arm解釋器來解決該問題,但是進行X5內核調試的話也會出現問題),建議使用真機來做。
X5內核應用自動化的方式和 google webview 有非常多的差異,因為這里需要開啟X5的debug調試模式。
二、開啟X5的調試模式
微信版本在7.0以下,需要在聊天窗口輸入:
http://debugx5.qq.com
針對微信版本在7.0+,微信有對H5開關做了調整,需要在聊天窗口輸入如下:
http://debugmm.qq.com/?forcex5=true (優先使用,無效時使用方法二)
http://debugx5.qq.com
點擊“確定”后即可生效
三、微信小程序入口
微信在新版中對小程序調試入口加上了限制:在微信主窗口下來打開小程序,利用工具是檢測不到小程序對應的url入口的,解決方案:
- 在 微信->發現->搜一搜 中搜索小程序,即可發現在inspect工具中可以將對應 url 顯示出來
- 注意:如果右上角關閉了小程序之后,一定要記得從后台清理下對應的小程序進程(關閉之后小程序還在后台運行),再次點擊重啟小程序
四、更新 chromedriver 版本
啟動appium時,需要指定chromedriver.exe的目錄,使用appium默認目錄下的會報錯,在切換到小程序webview時,會去匹配chrome內核所應對chromedriver驅動的版本。在切換完成之后,打印所有的窗口時,會使用x5內核的版本,所以指定一個非默認目錄下面的chromedriver.exe(X5內核對應的版本),此問題就不會出現 。
desired_caps["chromedriverExecutableDir"] =r'G:\\ChromeDrivers'
上面的啟動參數穩定性稍差,建議使用如下啟動會話配置:
desired_caps['chromedriverExecutable'] = r'G:\ChromeVersionManagement\chromedriver66\chromedriver.exe'
五、找到web頁面所屬進程
微信/QQ有很多進程,我們要確定當前web頁面是位於哪個進程中,使用adb命令:
- adb shell dumpsys activity top | findstr ACTIVITY
- adb shell ps 進程號
由此我們可以確認當前微信的頁面運行在 com.tencent.mm:tools 中
六、配置啟動會話參數
1.增加X5內核應用自動化配置
desired_caps["recreateChromeDriverSessions"] = True
2.定制化啟動webview
使用ChromeOptions來定制啟動選項,因為在appium中切換context識別webview的時候,把com.tencent.mm:tools的webview識別成了com.tencent.mm的webview,因此為了避免這個問題,加上androidProcess: com.tencent.mm:tools
desired_caps["chromeOptions"] = {"androidProcess":"com.tencent.mm:tools"}
七、web窗口切換
在第五步和第三步來看,進程不像前面普通的Hybrid混合應用的webview只有一個,這里每次會生成很多個webview,但是真正匹配的只有一個,這里進行窗口切換的時候就需要用到循環遍歷的操作:
print("=================進入web自動化環節===============================") #打印當前所有的窗口 hs = driver.window_handles print("當前所有的窗口為:", hs) # print("當前所在的窗口為:",driver.current_window_handle) # 小程序的頁面切換:需要遍歷所有的handles,切換到元素所在的handle for handle in hs: driver.switch_to.window(handle) print("切換到窗口:",handle) time.sleep(3) #print(driver.page_source) if driver.page_source.find("Python") != -1: break