H5混合應用之X5內核

1、X5內核介紹

  X5內核是騰訊公司基於優秀開源 webkit 深度優化的瀏覽器渲染引擎,而且在2014年正式宣佈開放給app開發者,因此如今能夠在不少app上看到都是使用的X5內核實現Hybrid混合應用,包括微信、手機QQ、京東、新浪新聞、搜狐視頻等等,包括如今煊赫一時的微信小程序都是X5內核,以前都是使用google的webview,這裏能夠把X5內核理解爲騰訊版本的webview。android

  注意:因爲 genymotion 模擬器是X86架構的,不少app安裝不了,好比微信、QQ等(雖說能夠經過安裝arm解釋器來解決該問題,可是進行X5內核調試的話也會出現問題),建議使用真機來作。web

  X5內核應用自動化的方式和 google webview 有很是多的差別,由於這裏須要開啓X5的debug調試模式。chrome

2、開啓X5的調試模式

微信版本在7.0如下,須要在聊天窗口輸入:shell

http://debugx5.qq.com小程序

針對微信版本在7.0+,微信有對H5開關作了調整,須要在聊天窗口輸入以下:微信小程序

http://debugmm.qq.com/?forcex5=true  (優先使用,無效時使用方法二)
http://debugx5.qq.com瀏覽器

點擊「肯定」後便可生效微信

3、微信小程序入口

  微信在新版中對小程序調試入口加上了限制:在微信主窗口下來打開小程序,利用工具是檢測不到小程序對應的url入口的,解決方案:架構

  • 在 微信->發現->搜一搜 中搜索小程序,便可發如今inspect工具中能夠將對應 url 顯示出來
  • 注意:若是右上角關閉了小程序以後,必定要記得從後臺清理下對應的小程序進程(關閉以後小程序還在後臺運行),再次點擊重啓小程序

 

4、更新 chromedriver 版本

  啓動appium時,須要指定chromedriver.exe的目錄,使用appium默認目錄下的會報錯,在切換到小程序webview時,會去匹配chrome內核所應對chromedriver驅動的版本。在切換完成以後,打印全部的窗口時,會使用x5內核的版本,因此指定一個非默認目錄下面的chromedriver.exe(X5內核對應的版本),此問題就不會出現 。app

desired_caps["chromedriverExecutableDir"] =r'G:\\ChromeDrivers'

  上面的啓動參數穩定性稍差,建議使用以下啓動會話配置:

desired_caps['chromedriverExecutable'] = r'G:\ChromeVersionManagement\chromedriver66\chromedriver.exe'

5、找到web頁面所屬進程

  微信/QQ有不少進程,咱們要肯定當前web頁面是位於哪一個進程中,使用adb命令:

  • adb shell dumpsys activity top | findstr ACTIVITY
  • adb shell ps 進程號

 由此咱們能夠確認當前微信的頁面運行在 com.tencent.mm:tools 中

6、配置啓動會話參數

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"}

7、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
相關文章
相關標籤/搜索