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
相关文章
相关标签/搜索