zoukankan      html  css  js  c++  java
  • H5混合应用之X5内核

    一、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:ChromeVersionManagementchromedriver66chromedriver.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
  • 相关阅读:
    java private修饰符的作用域
    debug运行下报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2(转)
    非线程安全的HashMap 和 线程安全的ConcurrentHashMap(转载)
    【Java集合源码剖析】HashMap源码剖析(转)
    eclipse 解决乱码问题
    java替换txt文本中的字符串
    tomcat startup.bat 启动脚本(转)
    tomcat 点击startup.bat一闪而过
    tomcat 目录文件夹作用(转)
    引脚复用
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/11783801.html
Copyright © 2011-2022 走看看