appium测试混合应用
1、native、web、hybrid简介
目前主流应用程序大体分为三类:web APP(网页应用)、hybrid APP(混合应用)、native APP(原生应用)。
native:
优点:直接依托于操作系统,交互性最强,性能最好;功能最为强大,特别是在与系统交互中,几乎所有功能都能实现。
缺点:开发成本高,无法跨平台,不同平台Android和iOS上都要各自独立开发;门槛较高,原生人员有一定的入门门槛,相比广大的前端人员而言较少;更新缓慢,特别是发布应用商店后,需要等到审核周期;维护成本高。
web:
优点:开发成本低,可以款平台,调用方便;维护成本低;更新无需通知用户,不需要手动升级;无需安装APP,不会占用手机内存。
缺点:无法获取系统级别的通知,提醒,动效等等,用户存留率低;设计受限制诸多;体验较差。
hybrid:
优点:在应用程序中嵌入了webview,通过webview访问网页;开发成本较低,可以跨平台,调试方便;维护成本低,功能可服用;功能更加完善,性能和体验要比起web APP好太多;更新较为自由。
缺点:相比原生,性能仍然有较大损耗;不适用于交互性较强的APP。
切换方法:
print(self.driver.contexts)
#查看所有的context
#返回结果 ['NATIVE_APP', 'WEBVIEW_com.huawei.browser']
#其中NATIVE_APP为原生的,WEBVIEW开头的表示H5的 #再使用如下方法切换到H5即可
self.driver.switch_to.context("WEBVIEW_com.huawei.browser")
#使用如下方法确认是否切换成功
print(self.driver.current_context)
2、如何分别一个APP页面究竟是native还是web的。
在手机/模拟器中点击关于手机中的版本号5下,出来开发者选项。
在开发者选项中勾选上显示布局边界再返回到APP界面。
如果APP是web页面,那界面不会有布局边界显示,如有则说明是native的界面。
在就通过定位工具:
我们之前所使用的API都是针对于原生的应用而言的,如果是web页面就不能采取这些API来定位元素,而且很多的应用都是hybrid混合应用了。
3、hybrid自动化脚本开发
识别webview视图
我们可以根据上面描述的方法,进行判断。
获取所有的contexts:driver.contexts
理解context:
context上下文,疑问这一个场景,一个场景就是用户和操作系统交互的过程,native界面和webview界面分属于不用的context,native默认是“NATIVE_APP”,webview则默认是“WEBVIEW_被测进程名称”。
通过切换context对象,可以让appium认识到自己当前处于哪一个状态里面。
4、切换到webview视图
示例:
-
# 2、切换-Window窗口
-
# context - 混合应用 native_app
-
time.sleep(5)
-
# 1、获取所有的context 确保你的APP能够让代码识别到webview
-
cons = driver.contexts
-
print(cons)
-
# 2、根据context名字,切换到webview # WEBVIEW_com.lemon.lemonban
-
# driver.switch_to.context(cons[-1])
-
driver.switch_to.context('WEBVIEW_com.lemon.lemonban')
-
# 打印web内容
-
webinfo = driver.page_source
5、定位webview中的元素
已经切换到HTML,那后续就是web自动化操作 --- 原生webview,基本上都是Chromedriver。
(1)Chrome浏览器中输入:chrome://inspect
该方法操作inspect后需要翻墙才可以使用(不推荐)。
(2)使用uc - devtools
具体参考官方文档:https://dev.ucweb.com/docs/pwa/docs-zh/xy3whu
6、回到native_app
driver.switch_to.context(None)
结论:
1、要让APP当中的webview能够被识别,并且要操作的元素在webview当中。
2、利用appium的context切换,从NATIVE_APP切换到webview网页。
3、利用uc - devtools来定位网页元素并操作。
4、web网页,需要下载与Android系统webview版本匹配的Chromedriver
7、有两个缺陷可能导致你无法获取webview
首先,绝大多数应用是不会开启webview的debug模式。
第二,切换webview的情况会受到网络状态的影响,如果是内部代理的网络则会导致你无法操作chromedriver,切换至webview模式时会无法将命令传入导致超时,因此这种方式并未对其进行实现。