一、native/web/hybrid 简介

  目前主流应用程序大体分为:Native App(原生应用)、Web App(网页应用)、Hybrid App(混合应用),它们三者的优缺点比较如下表:

应用类型 优点 缺点
navite
  • 直接依托于操作系统,交互性最强,性能最好
  • 功能最为强大,特别是在与系统交互中,几乎所有功能都能实现
  • 开发成本高,无法跨平台,不同平台android和iso上都要各自独立开发
  • 门槛较高,原生人员有一定的入门门槛,相比广大的前端人员而言较少
  • 更新缓慢,特别是发布应用商店后,需要等到审核周期
  • 维护成本高
web
  • 开发成本低,可以跨平台,调试方便
  • 维护成本低
  • 更新无需通知用户,不需要手动升级
  • 无需安装app,不会占用手机内存
  • 无法获取系统级别的通知、提醒、动效等等
  • 用户留存率低
  • 设计受限制多
  • 体验较差
hybrid
  • 在应用程序中嵌入了webview,通过webview访问网页
  • 开发成本较低,可以跨平台,调试方便
  • 维护成本低,功能可复用
  • 功能更加完善,性能和体验要比起web app好太多
  • 更新较为自由
  • 相比原生app,性能任然有较大损耗
  • 不适用于交互性较强的app

二、如何区分某个app页面是native还是web

方法一:

  1. 在手机/模拟器中点击开发者选项
  2. 在开发者选项中勾选上“显示布局边界”,再返回到app页面
  3. 如果是web页面,那么界面不会有布局边界的显示,如果有则说明是native的页面

  

方法二:

通过定位工具

三、打开webview调试模式

android4.4以下版本:需要使用Selendroid模式来作为测试引擎,初始化的时候需要设置capability

# android 4.4以下版本通过 Selendroid 来切换到 webview
desired_caps['automationName'] = 'Selendroid'

android4.4+版本:原生部分走UIAutomator,webview部分走Chromedriver,即Hybrid混合自动化,它的要求如下:

  • android 4.4+版本
  • 手机与电脑连接,开启“USB调试模式”,保证能够通过adb devices查看到设备名
  • webview必须要为debug模式
  • PC端和手机端安装 Google chrome 浏览器(尽量保持版本一致)

有时候我们使用uiautomatorviewer定位到的web页面元素,显示的class值为:XXX.webkit.WebView,但是我们代码获取的时候并没有它,而只有“NATIVE_APP”,因为一般的app应用是没有开启debug调试模式,那么解决的办法如下:

  • 如果是公司研发的产品可以让开发人员在app源码中将webview debug模式打开,加上如下代码后,重新编译打包
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {
WebView.setWebContentsDebuggingEnabled(true);
}

四、上下文切换

  context上下文,意味着一个场景,该场景是用户和操作系统交互的过程,native 界面和 webview 界面分属于不用的context,native 默认是“NATIVE_APP”,webview 默认是“WEBVIEW_被测进程名称”,通过切换context对象,可以让appium认识到自己当前处于哪一个状态里面

  获取所有的contexts:

  • driver.contexts

  切换到webview页面:

  • driver.switch_to.context(contexts[-1])

  返回到native页面:

  • ①driver.switch_to.context('NATIVE_APP')
  • ②driver.switch_to.context(contexts[0])
  • ③driver.switch_to.context(None)
# 进入混合页面后等待WebView元素可见
loc = (MobileBy.CLASS_NAME, "android.webkit.WebView")
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
# 获取所有的context
cons = driver.contexts
print(cons)
# 切换到webview 页面
driver.switch_to.context(cons[-1])
# 打印web内容
source = driver.page_source
print(source)

H5混合应用之上下文切换的更多相关文章

  1. H5+混合移动app应用开发——开篇

    前言 经过2个多月的艰苦奋斗,app的第一个版本已经快完工了,期间遇到了太多的坑,作为一个喜欢分享的人,我当然不会吝啬分享这爬坑历程.不要问我有多坑,我会告诉你很多,很多..... 过去一直从事.ne ...

  2. H5混合开发问题总结

    1.This application is modifying the autolayout engine from a background thread, which can lead to en ...

  3. 移动端H5混合开发设置复盘与总结

    此篇接上一篇: 移动端H5混合开发,Touch触控,拖拽,长按, 滑屏 实现方案 https://www.cnblogs.com/buoge/p/9346699.html app 场布设置已经上线了, ...

  4. 能挣钱的微信JSSDK+H5混合开发

    H5喊了那么久,有些人都说不实用,有些人却利用在微信中开发H5应用赚得盆满钵满.微信JSSDK + HTML 5,让移动Web开发与微信结合轻而易举!跨平台.零成本,让大众创业变得更方便. 我觉得现在 ...

  5. H5+混合移动app

    H5+混合移动app 前言 经过2个多月的艰苦奋斗,app的第一个版本已经快完工了,期间遇到了太多的坑,作为一个喜欢分享的人,我当然不会吝啬分享这爬坑历程.不要问我有多坑,我会告诉你很多,很多.... ...

  6. Android H5混合开发(1):构建Cordova 项目

    Cordova是什么 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 以移动平台为例,安卓.IOS平台设备的常 ...

  7. Android H5混合开发(2):自定义Cordova插件

    前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...

  8. Android H5混合开发(3):原生Android项目里嵌入Cordova

    前言 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cordova项目并添加Android平台,把我们的安卓项目导入Android平 ...

  9. Android H5混合开发(4):构建Cordova Jar包

    前言 上一节,介绍了原生项目如何嵌入Cordova,我们对Cordova的依赖使用的是CordovaLib Module,这也是安卓项目常用的方式. 但是,也有项目希望以Jar包的方式依赖Cordov ...

随机推荐

  1. day100_12_4DataFrame和matplotlib模块

    一.Dataframe的分组. 再网页表格数据 的分析中,可以使用以下语句进行爬取表格. res = pd.read_html('https://baike.baidu.com/item/NBA%E6 ...

  2. 1、web爬虫,requests请求

    requests请求,就是用python的requests模块模拟浏览器请求,返回html源码 模拟浏览器请求有两种,一种是不需要用户登录或者验证的请求,一种是需要用户登录或者验证的请求 一.不需要用 ...

  3. 从荣耀 xSport Pro 运动蓝牙耳机发布看蓝牙立体声耳机的新动态

    10月22日,荣耀在北京举行新品发布会,不仅带来了荣耀20青春版手机,还正式发布了荣耀xSport PRO运动蓝牙耳机.该款耳机是荣耀全新一代颈戴式运动蓝牙耳机,兼具运动和时尚属性,高颜值的渐变色机身 ...

  4. IT兄弟连 HTML5教程 设置IE9以下版本浏览器支持HTML5

    HTML2.HTML5刚发布时由于各浏览器之间的标准不统一,开发者的时间都浪费在解决Web浏览器之间的兼容性上.但由于W3C和WHATWG对HTML5新版本的制定,以及近年来对HTML5的使用,再加上 ...

  5. javascript es6 Promise 异步同步的写法(史上最简单的教程了)

    1 来个简单的例子 var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.lo ...

  6. 【Web开发】到底什么是短链接

    目录 什么是短链接 为什么使用短链接 节省发送的内容 提升用户体验 便于链接追踪,分析点击来源 一定程度上保护原始网站链接 短链接生成平台 短链接生成原理 参考 今天无意中看到一个名词--" ...

  7. [Spring cloud 一步步实现广告系统] 12. 广告索引介绍

    索引设计介绍 在我们广告系统中,为了我们能更快的拿到我们想要的广告数据,我们需要对广告数据添加类似于数据库index一样的索引结构,分两大类:正向索引和倒排索引. 正向索引 通过唯一键/主键生成与对象 ...

  8. Python中编写类的各种技巧和方法

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

  9. linux中网络配置

    一.查看ip ipconfig 二.png 测试主机之间网络连通 ping 目标ip #测试当前服务器是否可以连接目的主机 三.linux配置网络环境 vim /etc/sysconfig/netwo ...

  10. 【SDUT】2019SDUTACM第一次选拔赛 F- X的追求道路

    Problem Description X在大家的帮助下终于找到了一个妹纸,于是开始了漫漫的追求之路,那么大家猜一猜X能不能追的上呢? X初始对妹纸有一个心动值,妹纸对X有一个好感值,在追求时发生的的 ...